Skip to content

Кодогенерация

Egor Tolstoy edited this page Nov 15, 2015 · 2 revisions

Создание нового модуля - одно из самых узких мест в 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.

Generamba


Установка

gem install generamba

Функциональность

Настройка параметров проекта

Все параметры, нужные для кодогенерации, содержатся в основной папке проекта в файле Rambafile. Настраивается он полуавтоматически в результате вызова команды generamba setup. В нем находятся такие данные, как название проекта, префикс, компания, пути до папок модулей и тестов, перечисление используемых шаблонов. Этот файл держится в git и используется всеми разработчиками проекта.

Генерация нового модуля

Создание шаблона осуществляется командой generamba gen ModuleName TemplateName. В результате будут созданы все файлы, описанные в конкретном шаблоне - причем добавятся в Xcode, так и в файловую систему.

Работа с шаблонами

Все шаблоны, используемые в текущем проекте, описываются в Rambafile. При запуске команды generamba template install поочередно устанавливается каждый из указанных шаблонов - либо из локальной папки, либо из удаленного git-репозитория, либо из общего каталога шаблонов. Все шаблоны хранятся в папке Templates текущего проекта.

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

Другие кодогенераторы