strongself/The-Book-of-VIPER

Именование в Swift

NikKovIos opened this issue · 5 comments

Хочу поднять вопрос правильного именования протоколов в Swift

Если в Objective-C понять протокол это или нет - можно по скобкам <>, то в swift 3 именование протоколов и названий классов не разделено и в связи с этим бывает происходит путаница класс это или протокол. Может в конце протоколов добавлять Protocol? Например ViewOutputProtocol.

Однако согласно конвенции добавлять Protocol в конце считается некрасиво и рекомендуют использовать прилагательные или причастия, образованные от существительного типа (..able, ..ing).

Каково ваше мнение?

В частности, у нас на проекте мы придерживаемся следующего правила: протоколы называем без суффикса "Protocol", а конкретные реализации - с суффиксом "Implementation" (например, CalendarDataDisplayManager - CalendarDataDisplayManageImplementation).

Отдельный naming convention существует для VIPER модулей. Например, Presenter соответствует протоколам ViewOutput, ModuleInput и InteractorOutput (здесь мы понимаем, что суффиксы Input и Output могут быть только у протоколов).

Если протокол отражает какое-то свойство объекта, то мы добавляем окончание "able" (например, Mappable, SomethingConfigurable etc).

Спасибо за ответ!

Ещё вопрос - как вы относитесь к объединению файлов интерфейса и имплементации в один свифтовый файл? В случае, если нужно сменить имплементацию просто добавляем новый файл имплементации и инджектим его к нужному интерфейсу?

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

Мы храним протоколы и реализации в разных файлах по следующим причинам:

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

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

Тогда вопросец - может вы придумали способ быстро и удобно переключаться между протоколами и реализациями (как например можно в objective-C между файлами интерфеса и имплементации). Вся боль в разделении в том, что нужно часто переключаться между файлами и это неудобно.

Есть 2 основных способа:

  • поскольку протокол и реализация находятся в одной папке, то можно использовать Command-Shift-J (переходит на текущий файл в файл-менеджере слева и подсвечивает его) и стрелки вниз/вверх для перехода между файлами,
  • использовать Command-Shift-O для поиска файла по имени.

Также некоторые шорткаты можно еще подсмотреть вот здесь: https://medium.com/ios-geek-community/bobs-favorite-xcode-8-shortcuts-part-1-3-36381e07284d#.r72henn21