Лучшие практики для соглашений о присвоении имен категории Какао - PullRequest
9 голосов
/ 08 января 2012

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

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

Мой вопрос: как насчет метода категории NSDictionary, такого как -copyDeep, который делает глубокое копирование?Раньше метод назывался -deepCopy, но я поменял слова, когда анализатор ищет префикс «copy».Поэтому я предположительно не смог добавить префикс.И наличие «префикса» в середине или конце имени метода кажется грязным и непоследовательным.

Меня также интересуют мысли о стиле префикса - в настоящее время я использую DS (для DejalСистемы) для префиксов классов.Но я знаю, что Apple теперь хочет зарезервировать все двухсимвольные префиксы для себя, поэтому думаю об использовании Dejal, например, мой класс DSManagedObject будет переименован в DejalManagedObject.И возвращаясь к категориям, их методы будут переименованы, чтобы добавить префикс dejal, например, от -substringFromString: до -dejalSubstringFromString:.Но -dejalCopyDeep может привести к путанице в анализаторе, поэтому, возможно, мне придется быть непоследовательным для таких методов, и использовать -copyDeepDejal или -copyDeep_dejal?

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

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Я написал об этом по электронной почте Евангелисту Apple Application Frameworks и получил ответ, в котором рекомендовано , а не с префиксами имен методов категорий.Что противоречит рекомендациям в вышеупомянутой сессии WWDC10, но я полагаю, отражает текущее мышление Apple.

Он порекомендовал просто посмотреть API-интерфейсы бета-семени, чтобы определить конфликты, что я всегда делал.

1 голос
/ 11 февраля 2012

Я согласен с Кевином Баллардом: вам следует добавлять префиксы к именам методов вашей категории, особенно если вы собираетесь распространять их среди других. Но у вас есть действительное опасение, что анализатор будет сбит с толку DScopy. Компилятор ARC также будет сбит с толку, если определение / реализация DScopy выполняется без ARC и используется другим классом, использующим ARC (или наоборот).

Мое предпочтительное решение - использовать «аннотации передачи права собственности», например:

NS_RETURNS_NOT_RETAINED 
NS_RETURNS_RETAINED

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

-(DSManagedObject *)DScopy; NS_RETURNS_RETAINED;

Источник для NS_RETURNS... WWDC 2011, Сессия 322 - Достижения Objective-C в глубине. Мясо этого вопроса начинается примерно в 9: 10.

Примечание о "Но я знаю, что Apple теперь хочет зарезервировать все двухсимвольные префиксы для себя". В качестве личного предпочтения я предпочитаю использовать символ _ для отделения префикса от имени, он мне подходит. Вы можете попробовать что-то вроде:

-(DSManagedObject *)ds_copy; NS_RETURNS_RETAINED;

Это даст вам три символа и, возможно, сделает имя метода более читабельным.

Редактировать В ответ на ссылку, размещенную в комментарии.

Однако, поскольку ответ Джастина на ваш первоначальный вопрос говорит, что это может быть сломано.

Что касается атрибутов; Я не предложил использовать __attribute__((objc_method_family(copy))) Я предложил использовать NS_RETURNS_RETAINED, что означает: __attribute__((ns_returns_retained)). Хотя первый пример там даже не будет компилироваться (как он говорит) с использованием - (NSString *)string __attribute__((objc_method_family(copy)));, он компилируется с - (NSString *)string; NS_RETURNS_RETAINED; просто отлично.

Очевидно также, что если NS_RETURNS_.. "скрыты" от компилятора в отдельных .m или перенаправлены каким-либо другим способом и компилятор не может видеть директивы, тогда он не будет работать. В связи с этим я бы предложил поместить объявление для любых методов, которые могут вызвать путаницу анализатора / компилятора в вашем основном файле .h (тот, который импортирует все остальные), чтобы ограничить вероятность возникновения проблемы.

...