Как вы называете значения вашего экземпляра / параметра? - PullRequest
4 голосов
/ 14 августа 2008

Будучи новичком в Objective-C (но в долгосрочном C / ++) программисте, я ищу советы / рекомендации по соглашениям об именах для переменных.

Мое личное предпочтение будет состоять в том, чтобы использовать префикс для переменных экземпляра как для ясности внутри функций, так и для предотвращения затенения параметров функции. Однако я фанат свойств, которые исключают префиксы (если только вы не добавляете префиксы к именам своих свойств, что не очень хорошо работает и выглядит глупо). Точно так же я мог бы использовать соглашение "self.variable", но только если я сделаю ВСЕ свойство.

Итак, учитывая приведенный ниже код, какой стиль именования вы предпочитаете для переменных экземпляра / функции? И если вы не беспокоитесь, как вы справляетесь с затенением параметров функции?

@interface GridItem : NSObject
{
    CGRect _rect;
    ...  
}
@end

-(void) initFromRect:(CGRect)rect
{
    _rect = rect;
    ...
}

Ура!

Ответы [ 10 ]

15 голосов
/ 15 августа 2008

В большинстве проектов Какао в качестве префикса переменной экземпляра экземпляра, отличного от IBOutlet, используется подчеркивание, а для переменных IBOutlet экземпляра префикс не используется.

Причина, по которой я не использую нижние черты для переменных экземпляра IBOutlet, заключается в том, что при загрузке файла пера, если у вас есть метод установки для подключенной розетки, этот метод вызывается. Однако этот механизм не использует кодирование значения ключа, поэтому IBOutlet, чье имя имеет префикс с подчеркиванием ( например _myField), не будет устанавливается, если сеттер не имеет названия, точно совпадающего с розеткой ( например set_myField:), что является нестандартным и грубым.

Также следует помнить, что использование таких свойств, как self.myProp, не такое же, как доступ к переменным экземпляра. Вы отправляете сообщение при использовании свойства, так же, как если бы вы использовали скобочные обозначения, такие как [self myProp]. Все свойства дают вам краткий синтаксис для указания как геттера, так и сеттера в одной строке, и позволяют синтезировать их реализацию; на самом деле они не закорачивают механизм отправки сообщений. Если вы хотите получить доступ к переменной экземпляра напрямую, но поставить перед ней префикс self, вам нужно обработать self как указатель, например self->myProp, который действительно является доступом к полю в стиле C.

Наконец, никогда не используйте венгерскую нотацию при написании кода Какао и избегайте других префиксов, таких как "f" и "m_" - это пометит код как написанный кем-то, кто не "получил его" и будет вызвать подозрение со стороны других разработчиков Cocoa.

В целом, следуйте рекомендациям в документе Руководство по кодированию для какао в Apple Developer Connection , и другие разработчики смогут подобрать и понять ваш код, а также ваш код будет хорошо работать со всеми функциями Какао, которые используют самоанализ во время выполнения.

Вот как может выглядеть класс оконного контроллера, используя мои соглашения:

// EmployeeWindowController.h
#import <AppKit/NSWindowController.h>

@interface EmployeeWindowController : NSWindowController {
@private
    // model object this window is presenting
    Employee *_employee;

    // outlets connected to views in the window
    IBOutlet NSTextField *nameField;
    IBOutlet NSTextField *titleField;
}

- (id)initWithEmployee:(Employee *)employee;

@property(readwrite, retain) Employee *employee;

@end

// EmployeeWindowController.m
#import "EmployeeWindowController.h"

@implementation EmployeeWindowController

@synthesize employee = _employee;

- (id)initWithEmployee:(Employee *)employee {
    if (self = [super initWithWindowNibName:@"Employee"]) {
        _employee = [employee retain];
    }
    return self;
}

- (void)dealloc {
    [_employee release];

    [super dealloc];
}

- (void)windowDidLoad {
    // populates the window's controls, not necessary if using bindings
    [nameField setStringValue:self.employee.name];
    [titleField setStringValue:self.employee.title];
}

@end

Вы увидите, что я использую переменную экземпляра, которая ссылается на Employee непосредственно в моих методах -init и -dealloc, в то время как я использую свойство в других методах. Как правило, это хороший шаблон со свойствами: всегда прикасайтесь к базовой переменной экземпляра для свойства в инициализаторах, в -dealloc, а также в методах получения и установки для свойства.

8 голосов
/ 10 ноября 2008

Я следую совету Криса Хэнсона в отношении префикса подчеркивания ivar, хотя признаюсь, что использую подчеркивание и для IBOutlets. Однако недавно я начал перемещать свои объявления IBOutlet в строку @property, согласно предложению @ mmalc . Преимущество состоит в том, что все мои ивары теперь имеют подчеркивание и называются стандартными сеттерами KVC (т.е. setNameField:). Кроме того, имена выходов не имеют подчеркивания в Интерфейсном Разработчике.

@interface EmployeeWindowController : NSWindowController {
@private
    // model object this window is presenting
    Employee *_employee;

    // outlets connected to views in the window
    NSTextField *_nameField;
    NSTextField *_titleField;
}

- (id)initWithEmployee:(Employee *)employee;

@property(readwrite, retain) Employee *employee;
@property(nonatomic, retain) IBOutlet NSTextField *nameField;
@property(nonatomic, retain) IBOutlet NSTextField *titleField;

@end
3 голосов
/ 15 сентября 2008

Вы можете использовать префикс underbar на своих ivars и при этом использовать имя, не являющееся символом underbar, для ваших свойств. Для синтезированных методов доступа просто сделайте это:

@synthesize foo = _foo;

Это говорит компилятору синтезировать свойство foo с помощью the_foo ivar.

Если вы пишете свои собственные методы доступа, тогда вы просто используете в своей реализации знак подчеркивания ivar и сохраняете имя метода без подчеркивания.

2 голосов
/ 15 сентября 2008

С введением свойств я не вижу необходимости добавлять префикс "_" к переменным экземпляра класса. Вы можете установить простое правило (описанное в вашем заголовочном файле), что любые переменные, к которым нужно обращаться вне класса, должны быть доступны через свойство или с помощью пользовательских методов класса, чтобы воздействовать на значения. Мне кажется, это намного чище, чем иметь имена с «_» на передней части. Он также правильно инкапсулирует значения, чтобы вы могли контролировать их изменение.

2 голосов
/ 14 августа 2008

Лично я следую соглашениям о присвоении имен Какао, использую верблюжий слоган для функций и переменных и заглавный верблюд за окном верблюдов для имен объектов (без начального NS, конечно).

Я считаю, что префикс типа делает код более непрозрачным для тех, кто его не писал (поскольку каждый неизменно использует разные префиксы), и в современной IDE не так уж сложно определить тип чего-либо.

1 голос
/ 18 ноября 2008

Наряду с тем, что было сказано здесь, обязательно прочитайте документацию Cocoa по именованию в соответствии с Key Value Observing. Строгое следование этой схеме поможет вам в долгосрочной перспективе.

1 голос
/ 10 ноября 2008

Хотя мне нравится использовать префикс подчеркивания для иваров, я ненавижу писать @synthesize строки из-за всего дублирования (это не очень DRY ). Я создал макрос, чтобы помочь сделать это и уменьшить дублирование кода. Таким образом, вместо:

@synthesize employee = _employee;

Я пишу это:

ddsynthesize(employee);

Это простой макрос, использующий вставку токена для добавления подчеркивания справа:

#define ddsynthesize(_X_) @synthesize _X_ = _##_X_

Единственным недостатком является то, что это может сбить с толку инструмент рефакторинга XCode, и он не будет переименован, если вы переименуете свойство путем рефакторинга.

1 голос
/ 01 октября 2008

Мой стиль гибридный и действительно пережиток дней PowerPlant:

Самые полезные префиксы, которые я использую, это "in" и "out" для параметров функции / метода. Это поможет вам понять, для чего нужны параметры, и действительно поможет предотвратить конфликты между параметрами метода и переменными экземпляра (сколько раз вы видели, как параметр «таблица» конфликтует с переменной экземпляра с тем же именем). E.g.:

- (void)doSomethingWith:(id)inSomeObject error:(NSError **)outError;

Затем я использую голое имя для переменных экземпляра и имен свойств:

Затем я использую «the» в качестве префикса для локальных переменных: theTable, theURL и т. Д. Опять же, это помогает дифференцировать локальные переменные и переменные экземпляра.

Затем, следуя стилю PowerPlant, я использую несколько других префиксов: k для констант, E для перечислений, g для глобалов и s для статики.

Я использую этот стиль уже около 12 лет.

1 голос
/ 15 августа 2008

Эндрю: На самом деле есть много разработчиков Cocoa, которые вообще не используют префиксы переменных экземпляра. Это также чрезвычайно распространено в мире Smalltalk (на самом деле, я бы сказал, что в Smalltalk практически не слышно использовать префиксы для переменных экземпляра).

Префиксы переменных экземпляра всегда казались мне C ++ - измом, перенесенным в Java, а затем в C #. Так как мир Objective-C был в значительной степени параллелен миру C ++, где, как миры Java и C #, являются его преемниками, это объяснило бы «культурную» разницу, которую вы можете увидеть в этом между различными наборами разработчиков.

1 голос
/ 14 августа 2008

Мне не нравится использовать подчеркивания в качестве префиксов для любых идентификаторов, потому что C и C ++ оба резервируют определенные префиксы подчеркивания для использования реализацией.

Я думаю, что использование "self.variable" ужасно.

В общем, я использую незакрашенные идентификаторы (то есть без префиксов и суффиксов) для переменных экземпляра. Если ваш класс настолько сложен, что вы не можете вспомнить переменные экземпляра, у вас проблемы. Поэтому для вашего примера я бы использовал «rect» в качестве имени переменной экземпляра, а «newRect» или «aRect» в качестве имени параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...