Именование методов
Методы являются, возможно, наиболее распространенным элементом Вашего интерфейса программирования, таким образом, необходимо проявить определенную заботу в том, как Вы называете их. В этом разделе рассматриваются следующие аспекты именования метода:
Общие правила
Вот несколько общих руководящих принципов для учета при именовании методов:
Запустите имя со строчной буквы и капитализируйте первую букву встроенных слов. Не используйте префиксы. Посмотрите Типографские условные обозначения.
Существует два определенных исключения к этим инструкциям. Можно начать имя метода с известного акронима в верхнем регистре (таком как TIFF или PDF)), и можно использовать префиксы, чтобы сгруппировать и идентифицировать закрытые методы (см. Закрытые методы).
Для методов, представляющих меры, которые принимает объект, запустите имя с глагола:
- (void)invokeWithTarget:(id)target;
- (void)selectTabViewItem:(NSTabViewItem *)tabViewItem
Не используйте «делают» или «действительно» как отделяется имени, потому что эти вспомогательные глаголы редко добавляют значение. Кроме того, никогда не используйте наречия или прилагательные перед глаголом.
Если метод возвращает атрибут получателя, назовите метод в честь атрибута. Использование «добирается», является ненужным, если одно или более значений не возвращаются косвенно.
- (NSSize)cellSize;
Право.
- (NSSize)calcCellSize;
Неправильно.
- (NSSize)getCellSize;
Неправильно.
См. также Методы доступа.
Используйте ключевые слова перед всеми параметрами.
- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag;
Право.
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
Неправильно.
Сделайте слово, прежде чем параметр опишет параметр.
- (id)viewWithTag:(NSInteger)aTag;
Право.
- (id)taggedView:(int)aTag;
Неправильно.
Добавьте новые ключевые слова до конца существующего метода при создании метода, который является более определенным, чем наследованный.
- (id)initWithFrame:(CGRect)frameRect;
NSView
,UIView
.- (id)initWithFrame:(NSRect)frameRect mode:(int)aMode cellClass:(Class)factoryId numberOfRows:(int)rowsHigh numberOfColumns:(int)colsWide;
NSMatrix, подкласс NSView
Не используйте «и» соединить ключевые слова, которые являются атрибутами получателя.
- (int)runModalForDirectory:(NSString *)path file:(NSString *) name types:(NSArray *)fileTypes;
Право.
- (int)runModalForDirectory:(NSString *)path andFile:(NSString *)name andTypes:(NSArray *)fileTypes;
Неправильно.
Несмотря на то, что «и» может звучать хорошим в этом примере, он вызывает проблемы, поскольку Вы создаете методы со все большим количеством ключевых слов.
Если метод описывает два отдельных действия, используйте «и» соединить их.
- (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;
NSWorkspace
.
Методы доступа
Методы доступа являются теми методами, устанавливающими и возвращающими значение свойства объекта. У них есть определенные рекомендуемые формы, в зависимости от того, как выражено свойство:
Если свойство выражено как существительное, формат:
- (
ввести)
существительное;
- (void)set
Существительное:(
ввести)
aNoun;Например:
- (NSString *)title;
- (void)setTitle:(NSString *)aTitle;
Если свойство выражено как прилагательное, формат:
- (BOOL)is
Прилагательное;
- (void)set
Прилагательное:(BOOL)flag
;Например:
- (BOOL)isEditable;
- (void)setEditable:(BOOL)flag;
Если свойство выражено как глагол, формат:
- (BOOL)
«действие-объект»;
- (void)set
VerbObject:(BOOL)flag
;Например:
- (BOOL)showsAlpha;
- (void)setShowsAlpha:(BOOL)flag;
Глагол должен быть в простом настоящем времени.
Не скручивайте глагол в прилагательное при помощи причастия:
- (void)setAcceptsGlyphInfo:(BOOL)flag;
Право.
- (BOOL)acceptsGlyphInfo;
Право.
- (void)setGlyphInfoAccepted:(BOOL)flag;
Неправильно.
- (BOOL)glyphInfoAccepted;
Неправильно.
Можно использовать модальные глаголы (глаголы, которым предшествует «банка», «должен», «быть», и т.д.) разъяснить значение, но не используйте, «делают» или «делает».
- (void)setCanHide:(BOOL)flag;
Право.
- (BOOL)canHide;
Право.
- (void)setShouldCloseDocument:(BOOL)flag;
Право.
- (BOOL)shouldCloseDocument;
Право.
- (void)setDoesAcceptGlyphInfo:(BOOL)flag;
Неправильно.
- (BOOL)doesAcceptGlyphInfo;
Неправильно.
Использование «добирается» только для методов что эхо-сигналы и значения косвенно. Необходимо использовать эту форму для методов только, когда должны быть возвращены многократные элементы.
- (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;
NSBezierPath
.В методах, таких как они, реализация должна принять
NULL
для этих изменяемых параметров как индикация, что вызывающая сторона не интересуется один или больше возвращенных значений.
Методы делегата
Методы делегата (или методы делегации) являются теми, которых объект вызывает в его делегате (если делегат реализует их), когда определенные события имеют место. У них есть отличительная форма, которые применяются одинаково к методам, вызванным в источнике данных объекта:
Запустите имя путем идентификации класса объекта, который это отправляет сообщению:
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
Имя класса опускает префикс, и первая буква находится в нижнем регистре.
Двоеточие присоединяется к имени класса (параметром является ссылка на объект делегирования), если метод не имеет только один параметр, отправителя.
- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
Исключение к этому является методами, вызвавшими в результате отправляемого уведомления. В этом случае единственным параметром является объект уведомления.
- (void)windowDidChangeScreen:(NSNotification *)notification;
Использование сделало, или «будет» для методов, вызывающихся, чтобы уведомить делегата, что что-то произошло или собирается произойти.
- (void)browserDidScroll:(NSBrowser *)sender;
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window;
Несмотря на то, что можно использовать, сделал, или «будет» для методов, вызывающихся, чтобы попросить, чтобы делегат сделал что-то от имени другого объекта, «должен» предпочитаться.
- (BOOL)windowShouldClose:(id)sender;
Методы сбора
Для объектов, управляющих набором объектов (каждый вызвал элемент того набора), соглашение состоит в том, чтобы иметь методы формы:
- (void)add
Элемент:(
elementType)
anObj;
- (void)remove
Элемент:(
elementType)
anObj;
- (NSArray *)
элементы;
Например:
- (void)addLayoutManager:(NSLayoutManager *)obj; |
- (void)removeLayoutManager:(NSLayoutManager *)obj; |
- (NSArray *)layoutManagers; |
Следующее является некоторыми квалификациями и улучшениями к этой инструкции:
Если набор действительно не упорядочивается, возвратите объект NSSet, а не объект NSArray.
Если важно вставить элементы в определенное расположение в наборе, используйте методы, подобные следующему вместо или в дополнение к тем выше:
- (void)insertLayoutManager:(NSLayoutManager *)obj atIndex:(int)index;
- (void)removeLayoutManagerAtIndex:(int)index;
Существует несколько подробных данных реализации для учета с методами сбора:
Эти методы обычно подразумевают владение вставленных объектов, таким образом, код, добавляющий или вставляющий их, должен сохранить их, и код, удаляющий их, должен также выпустить их.
Если вставленные объекты должны иметь указатель назад на основной объект, Вы (обычно) делаете это с a
set...
метод, устанавливающий обратный указатель, но не сохраняющий. В случаеinsertLayoutManager:atIndex:
метод, класс NSLayoutManager делает это в этих методах:- (void)setTextStorage:(NSTextStorage *)textStorage;
- (NSTextStorage *)textStorage;
Вы обычно не вызывали бы
setTextStorage:
непосредственно, но мог бы хотеть переопределить его.
Другой пример вышеупомянутых соглашений для методов сбора прибывает из класса NSWindow:
- (void)addChildWindow:(NSWindow *)childWin ordered:(NSWindowOrderingMode)place; |
- (void)removeChildWindow:(NSWindow *)childWin; |
- (NSArray *)childWindows; |
- (NSWindow *)parentWindow; |
- (void)setParentWindow:(NSWindow *)window; |
Аргументы метода
Существует несколько общих правил относительно имен аргументов метода:
Как с методами, параметры запускаются со строчной буквы, и первая буква последовательных слов капитализируются (например,
removeObject:(id)anObject
).Не используйте «указатель» или «ptr» на имя. Позвольте типу параметра, а не его имя объявляют, является ли это указателем.
Избегите одного - и два названия буквы для параметров.
Избегите сокращений, сохраняющих только несколько букв.
Традиционно (в Какао), следующие ключевые слова и параметры используются вместе:
...action:(SEL)aSelector |
...alignment:(int)mode |
...atIndex:(int)index |
...content:(NSRect)aRect |
...doubleValue:(double)aDouble |
...floatValue:(float)aFloat |
...font:(NSFont *)fontObj |
...frame:(NSRect)frameRect |
...intValue:(int)anInt |
...keyEquivalent:(NSString *)charCode |
...length:(int)numBytes |
...point:(NSPoint)aPoint |
...stringValue:(NSString *)aString |
...tag:(int)anInt |
...target:(id)anObject |
...title:(NSString *)aString |
Закрытые методы
В большинстве случаев имена закрытого метода обычно соблюдают те же правила как имена открытого метода. Однако общее соглашение состоит в том, чтобы дать закрытым методам префикс, таким образом, просто отличить их от открытых методов. Даже с этим соглашением, имена, данные закрытым методам, могут вызвать специфический тип проблемы. При разработке подкласса класса платформы Какао Вы не можете знать, переопределяют ли Ваши закрытые методы непреднамеренно частные методы платформы, которые тождественно называют.
Имена большинства закрытых методов в платформах Какао имеют префикс подчеркивания (например, _fooData
) отметить их как частных. От этого факта следуют двум рекомендациям.
Не используйте символ подчеркивания в качестве префикса для Ваших закрытых методов. Apple резервирует это соглашение.
Если Вы разделяете большой класс платформы Какао на подклассы (такой как
NSView
илиUIView
) и Вы хотите быть абсолютно уверенными, что Ваши закрытые методы имеют имена, отличающиеся от тех в суперклассе, можно добавить собственный префикс к закрытым методам. Префикс должен быть максимально уникальным, возможно один на основе Вашей компании или проекта и формы «XX _». Таким образом, если Ваш проект вызывают Плоским деревянным бочарным молотком Байта, префикс мог бы бытьBF_addObject:
Несмотря на то, что уведомление дать именам закрытого метода, префикс, могло бы казаться, противоречил бы более раннему требованию, что методы существуют в пространстве имен их класса, намерение здесь, отличается: предотвратить неумышленное переопределение закрытых методов суперкласса.