-
Notifications
You must be signed in to change notification settings - Fork 128
Кодогенерация
Создание нового модуля - одно из самых узких мест в VIPER, особенно с точки зрения стороннего человека. Для того, чтобы создать новый модуль-экран, нужно как минимум:
- Пять новых классов (Assembly, ViewController, Presenter, Interactor, Router)
- Пять новых протоколов (ViewInput, ViewOutput, InteractorInput, InteractorOutput, RouterInput)
- Пять новых тестов (AssemblyTests, ViewControllerTests, PresenterTests, InteractorTests, RouterTests)
Кроме этого, нужно установить все необходимые связи, добавить реализацию протоколов, настроить dependency injection контейнер - и в частных случаях еще множество других действий. Такая сложность несет за собой две основные проблемы:
- Слишком много времени уходит на простую механическую работу,
- Повышается вероятность опечаток, которые могут повредить не только стилю кода, но и логике работы.
Один из способов решения проблемы, которым долгое время пользовались и мы в Rambler&Co, это создание собственных шаблонов для Xcode. Такой подход решает все обозначенные вопросы, но имеет ряд собственных недостатков:
- Создание нового темплейта - сложный процесс из-за достаточно громоздкого синтаксиса,
- Периодически при обновлении Xcode темплейты могут слететь,
- Нет удобного механизма добавления новых шаблонов в Xcode (Alcatraz не в счет),
- Принципиально отсутствует возможность добавления файлов шаблона в разные таргеты (к примеру, при автогенерации тестов),
- Настройка шаблонов и параметров кодогенерации во многом ориентирована на конкретного пользователя, а не на проект.
Чтобы не быть ограниченными деталями реализации и работы нашей IDE, мы решили вынести процесс кодогенерации на другой уровень и написали небольшую утилиту - Generamba.
gem install generamba
Настройка параметров проекта
Все параметры, нужные для кодогенерации, содержатся в основной папке проекта в файле Rambafile
. Настраивается он полуавтоматически в результате вызова команды generamba setup
. В нем находятся такие данные, как название проекта, префикс, компания, пути до папок модулей и тестов, перечисление используемых шаблонов. Этот файл держится в git и используется всеми разработчиками проекта.
Генерация нового модуля
Создание шаблона осуществляется командой generamba gen ModuleName TemplateName
. В результате будут созданы все файлы, описанные в конкретном шаблоне - причем добавятся в Xcode, так и в файловую систему.
Работа с шаблонами
Все шаблоны, используемые в текущем проекте, описываются в Rambafile
. При запуске команды generamba template install
поочередно устанавливается каждый из указанных шаблонов - либо из локальной папки, либо из удаленного git-репозитория, либо из общего каталога шаблонов. Все шаблоны хранятся в папке Templates
текущего проекта.
Проект выложен в open source, поэтому каждый желающий может помочь нам в его развитии, сообщить об ошибках и оставить свои идеи Кроме того, мы с радостью добавляем новые шаблоны в наш каталог через Pull Request'ы.