Считается ли плохой практикой помещать все типы перечислений в приложении в заголовочный файл с другими константами?

#ios #objective-c

#iOS #objective-c

Вопрос:

В моем приложении iOS objective-C есть несколько типов перечислений, которые используются в разных классах, для них, я думаю, неплохо поместить их в файл constants.h, но как насчет других, которые не обязательно используются в нескольких классах? будет ли это считаться плохой практикой?

Комментарии:

1. Правила «один размер подходит всем» не существует.

Ответ №1:

Хотя ответ sapi верен, вот что я склонен делать…

Группа констант, которые используются в нескольких файлах, перейдет в файл. Допустим, все мои Foo константы входят FooConstants.h .

Теперь другая группа, скажем, Bar константы, они все войдут BarConstants.h .

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

Я импортирую Foo только те файлы, которым нужны FooConstants.h константы.

Я импортирую Bar только те файлы, которым нужны BarConstants.h константы.

И в зависимости от проекта, у меня может быть только 1 из этих файлов, или у меня может быть 10 или больше. Обычно у меня будет файл с именем SegueNames.h , где все идентификаторы перехода в моей раскадровке создаются как константы и помещаются в этот файл, чтобы я никогда не ошибался в написании имени перехода. У меня также обычно есть DefaultsKeys.h , где я храню ключи ко всему, что я добавляю NSUserDefaults .

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

Constants.h в нем нет ничего, кроме импорта всех других файлов констант. Это очищает верхнюю часть некоторых моих файлов.

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

Ответ №2:

Да, это плохая практика.

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

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

Комментарии:

1. Хорошо, спасибо за ваши ответы @sapi, итак, в заключение, я согласен с тем, что эти константы, ключи или типы перечислений хранятся в файле constants.h только тогда, когда они будут использоваться в нескольких классах, в противном случае я должен поместить их в один класс, где они используются, правильно?

2. Также существует промежуточный подход, @Andresp Ch. Смотрите мой ответ.

Ответ №3:

Это зависит от контекста. Насколько хорошо организованы ваши классы? Если это немного запутанно, не помешает начать с файла Errors.h / m, где вы определяете свои коды ошибок как перечисления в файле .h, а свои домены ошибок как NSStrings в файле .m (с соответствующими extern NSString * const в вашем файле .h).

Если ваша организация немного лучше, то вы разделили свои классы на модули, и у каждого модуля есть точка входа, где вы должны определять эти вещи. Однако результат не меняется: заголовок ошибки для значений enum и объявлений extern, ошибка реализации для назначений extern.

Все мои файлы объявлений об ошибках выглядят следующим образом:

 // ErrorFile.h
typedef enum {
    ModuleErrorOne = 1,
    ModuleErrorTwo,
    ModuleErrorThree
} ModuleError;

extern NSString * const ModuleErrorDomain;

// ErrorFile.m
NSString * const ModuleErrorDomain = @"ModuleErrorDomain";
  

Вы можете вставить это в свой предварительно скомпилированный заголовок для повышения скорости компиляции.

РЕДАКТИРОВАТЬ: Спасибо за комментарии nhgrif и GraniteRobert, они улучшили мой ответ.

Комментарии:

1. Не используется NS_ENUM ? Не ставить перед константами префикс k? И рекомендовать вставить его в .pch , чтобы сделать его еще более глобальным и не давать вам буквально никакого контроля над тем, в каких файлах он отображается? Также …. вы заявляете, что const совершенно неправильно… а затем даже не продолжать определять его как const в .m….

2. Хотя вы знаете, что это NSString const * неправильно, не так ли? Вам не нужно объявлять NSString как const (что вы и делаете)… это неизменяемый объект. Вам нужно, чтобы указатель на объект был const . codereview.stackexchange.com/a/55217/36366

3. @nhgrif если вы правы, так и должно быть NString * const .

4. @nhgrif Дайте мне немного времени, чтобы закончить редактирование, прежде чем отвечать, жаль, что я не мог просто отправить вам сообщение напрямую 🙂

5. @Tony: Все иногда бывают идиотами. Определение в файле .m должно быть таким же const , как и объявление в файле .h. Таким образом, когда у кого-то возникает идиотский момент, компилятор обнаружит ошибку.