Соглашения

Когда Вы будете работать с классами платформы, Вы заметите, что код Objective C очень просто считать. Имена классов и имена методов являются намного более дескриптивными, чем Вы могли бы найти с функциями кода генерала К или Стандартной Библиотекой C, и Camel-регистр используется для имен с многократными словами. Необходимо следовать тем же соглашениям, используемым Касанием Какао и Какао, когда Вы пишете свои собственные классы для создания кода более читаемым, и для Вас и для других разработчиков Objective C, которые, возможно, должны работать с Вашими проектами и сохранить Вашу кодовую базу непротиворечивой.

Кроме того, многие Objective C и функции платформы требуют, чтобы Вы следовали строгим соглашениям о присвоении имен для различных механизмов для работы правильно. Имена метода доступа, например, должны следовать соглашениям для работы с методами, такими как Key-Value Coding (KVC) или Key-Value Observing (KVO).

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

Некоторые имена должны быть уникальными через Ваше приложение

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

Имена классов должны быть уникальными через целое приложение

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

Для хранения имен классов уникальными, соглашение состоит в том, чтобы использовать префиксы на всех классах. Вы заметите, что Какао и Сенсорные имена классов Какао обычно запускают любого с NS или UI. Префиксы с двумя буквами как они резервируются Apple для использования в классах платформы. Поскольку Вы узнаете больше о Касании Какао и Какао, Вы встретитесь со множеством других префиксов, касающихся определенных платформ:

Префикс

Платформа

NS

Основа (OS X и iOS) и Набор Приложения (OS X)

UI

UIKit (iOS)

AB

Адресная книга

CA

Базовая анимация

CI

Базовое изображение

Ваши собственные классы должны использовать три префикса буквы. Они могли бы коснуться комбинации Вашего названия компании и Вашего имени приложения, или даже определенного компонента в Вашем приложении. Как пример, если Вашу компанию вызвали, Шепча Дубу, и Вы разрабатывали игру под названием Удивление Зебры, Вы могли бы выбрать WZS или WOZ как Ваш префикс класса.

Необходимо также назвать классы с помощью существительного, проясняющего, что класс представляет, как эти примеры от Касания Какао и Какао:

NSWindow

CAAnimation

NSWindowController

NSManagedObjectContext

Если многократные слова необходимы в имени класса, необходимо использовать Camel-регистр путем капитализации первой буквы каждого последующего слова.

Имена методов должны быть выразительными и уникальными в классе

Как только Вы выбрали уникальное имя для класса, методы, что Вы объявляете потребность только быть уникальными в том классе. Распространено использовать то же имя в качестве метода в другом классе, например, или переопределить метод суперкласса или использовать в своих интересах полиморфизм. Методы, выполняющие ту же задачу в многократных классах, должны иметь то же имя, возвратить типы параметра и тип.

Имена методов не имеют префикса и должны запуститься со строчной буквы; Camel-регистр используется снова для многократных слов, как эти примеры от NSString класс:

length

characterAtIndex:

lengthOfBytesUsingEncoding:

Если метод берет один или несколько параметров, имя метода должно указать каждый параметр:

substringFromIndex:

writeToURL:atomically:encoding:error:

enumerateSubstringsInRange:options:usingBlock:

Первая часть имени метода должна указать основное намерение или результат вызова метода. Если метод возвращает значение, например, первое слово обычно указывает то, что будет возвращено, как length, character... и substring... методы, показанные выше. Если необходимо указать что-то важное относительно возвращаемого значения, как с, используются многократные слова mutableCopy, capitalizedString или lastPathComponent методы от NSString класс. Если метод выполняет действие, такое как запись в диск или перечисление содержания, первое слово должно указать что действие, как показано write... и enumerate... методы.

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

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

stringAfterFindingAndReplacingAllOccurrencesOfThisString:withThisString:

Слишком многословный

strReplacingStr:str:

Слишком краткий

stringByReplacingOccurrencesOfString:withString:

Просто право

Необходимо избежать сокращать слова в именах методов, если Вы не уверены, что сокращение известно через многократные языки и культуры. Список общих сокращений дан в Приемлемых Сокращениях и Акронимах.

Всегда используйте префикс для имен методов в категориях на классах платформы

При использовании категории для добавления методов к существующему классу платформы необходимо включать префикс на имени метода, чтобы избежать, чтобы столкновения, как описано в Избежали Столкновений Имени метода Категории.

Локальные переменные должны быть уникальными в том же объеме

Поскольку Objective C является надмножеством языка C, переменные правила объема C также применяются к Objective C. Имя локальной переменной не должно сталкиваться ни с какими другими переменными, объявленными в том же объеме:

- (void)someMethod {
    int interestingNumber = 42;
    ...
    int interestingNumber = 44; // not allowed
}

Несмотря на то, что язык C действительно позволяет Вам объявлять новую локальную переменную с тем же именем как один объявленный в объеме включения, как это:

- (void)someMethod {
    int interestingNumber = 42;
    ...
    for (NSNumber *eachNumber in array) {
        int interestingNumber = [eachNumber intValue]; // not advisable
        ...
    }
}

это делает код запутывающим и менее читаемым, таким образом, это - наиболее успешная практика для предотвращения этого по мере возможности.

Некоторые имена методов должны следовать соглашениям

В дополнение к рассмотрению уникальности для нескольких важных типов методов также важно следовать строгим соглашениям. Эти соглашения используются некоторыми базовыми механизмами Objective C, компилятора и время выполнения, в дополнение к поведению, требующемуся классами в Касании Какао и Какао.

Имена метода доступа должны следовать соглашениям

Когда Вы используете @property синтаксис для объявления свойств на объекте, как описано в Инкапсуляции Данных, компилятор автоматически синтезирует соответствующего метода get и методы установщика (если Вы не указываете иначе). Если необходимо обеспечить собственные реализации метода доступа по какой-либо причине, важно удостовериться, что Вы используете правильные имена методов для свойства для Ваших методов, которые вызовут через точечный синтаксис, например.

Если не указано иначе, метод получателя должен использовать то же имя в качестве свойства. Для вызванного свойства firstName, метод доступа нужно также вызвать firstName. Исключение к этому правилу для булево свойств, для которых метод получателя должен запуститься с is. Для вызванного свойства paused, например, метод получателя нужно вызвать isPaused.

Метод установщика для свойства должен использовать форму setPropertyName:. Для вызванного свойства firstName, метод установщика нужно вызвать setFirstName:; для вызванного булево свойства paused, метод установщика нужно вызвать setPaused:.

Несмотря на то, что @property синтаксис позволяет Вам указывать различные имена метода доступа, необходимо только сделать так для ситуаций как булево свойство. Важно следовать соглашениям, описанным здесь, иначе методы как Кодирование Значения ключа (возможность добраться или установить использование свойства valueForKey: и setValue:forKey:) не будет работать. Для получения дополнительной информации о KVC посмотрите, что Значение ключа Кодирует Руководство по программированию.

Имена методов создания объекта должны следовать соглашениям

Как Вы видели в более ранних главах, часто существуют многократные способы создать экземпляры класса. Вы могли бы использовать комбинацию выделения и инициализации, как это:

    NSMutableArray *array = [[NSMutableArray alloc] init];

или используйте new удобный метод как альтернатива вызову alloc и init явно:

    NSMutableArray *array = [NSMutableArray new];

Некоторые классы также предлагают методы фабрики классов:

    NSMutableArray *array = [NSMutableArray array];

Методы фабрики классов должны всегда запускаться с имени класса (без префикса), что они создают, за исключением подклассов классов с существующими методами фабрики. В случае NSArray класс, например, методы фабрики запускаются с array. NSMutableArray класс не определяет ни одного из своих собственных специфичных для класса методов фабрики, таким образом, методы фабрики для непостоянного массива все еще начинаются array.

Существуют различные правила управления памятью, подкрепляющие Objective C, который использование компилятора гарантировать объекты поддерживается настолько же долго по мере необходимости. Несмотря на то, что Вы обычно не должны волноваться слишком много об этих правилах, постановляющие судьи компилятора, что это должно следовать на основе имени метода создания. Объектами, создаваемыми через методы фабрики, управляют немного по-другому от объектов, создающихся посредством традиционного выделения и инициализации или new из-за использования автовыпуска объединяют блоки. Для получения дополнительной информации о блоках пула автовыпуска и управлении памятью в целом, см. Усовершенствованное Руководство по программированию управления памятью.