Приступив к очередному (не буду умничать - ко второму) проекту с участием Cairngorm, представил сколько однотипного кода придётся написать ручками. На прошлом (читай - первом) проекте с участием Cairngorm был полный хэндмейд. Это дало мне возможность научиться произносить название фреймворка покопаться в кишочках архитектуры и досконально разобраться что к чему, но теперь - совсем другое дело. Нужно создать дерево классов максимально быстро и эффективно, посему свой взор обратил я в сторону генераторов кода.
Поиск был начат с гугла, ничего подходящего под мои задачи найдено не было.
Найденные генераторы были негибкими и генерировали весь код для клиента и сервера (какой-либо одной платформы, например, Ruby или Java), либо выглядели кривыми поделками.
Было решено написать свой (ну конечно же, это так актуально :), простой и быстрый (в написании).
Формализация требований к сему генератору выглядела так:
- Должен быть максимально гибким в переконфигурации.
- Не привязываться к какой-то конкретной IDE.
- Обеспечивать генерацию кода как для клиента (Flex/Cairngorm), так и для сервера (AMFPHP, .NET).
- Использовать для описания классов VO данные из какого-нибудь общего ресурса, будь то UML, структура БД или чорта лысого, лишь бы было удобно парсить.
- Использовать по-минимуму внешних ресурсов для генератора кода.
С учётом того, что, собственно, сам генератор кода будет запускаться не так уж часто, потратить минимальное время на его реализацию.
Также я согласен с тем, что он будет работать только на моей Windows XP, то есть никакой задачи кроссплатформенности на ставилось, однако, было бы неплохо, чтобы при необходимости его можно было бы портировать без особых заморочек.
Мне понравилась идея брать данные для VO из структуры базы данных, а не описывать их вручную. Вручную, конечно, получается гораздо лучше и ближе к истине, потому что, конечно же, структура БД никогда не совпадает с моделью данных приложения. Но при добавлении сущности в БД, делать каждый раз ту же процедуру руками для генератора, мне показалось неоправданной тратой моего личного и рабочего времени. Пусть это будет не так универсально, но автоматически, подумал я. А нестыковки модели БД и данных приложения можно править руками. Да, в конце концов, в любом случае, сгенерированый код придётся прочёсывать вручную и просматривать (вглазную, хехе), так что чевоужтам.
Неплохо было бы входные данные получать в XML или преобразовывать в него, чтобы для дальнейшей генерации кода применять шаблоны XSL-трансформаций. Люблю я их за чрезвычайную гибкость и универсальность. В генераторе я использовал MSXSL, оболочку командной строки для процессора MSXML.
Скачать её можно забесплатно с сайта Microsoft (25k)
Таким образом, суть генератора кода свелась к пакетному файлу, паре скриптов и шаблонам трансформации.
Процедура работы описана в batch-файле, который так же, как и всё остальное находится в репозитории проекта на гуглокоде.
Слава нанотехнологиям!
UPD: http://www.tylerbeck.com/CairngormCreator/ Щщикарно!
UPD2: http://nsdevaraj.wordpress.com/2008/08/07/flex-code-generator-flex-php/ Здесь ссылка на AIR-приложение. Отучаемся писАть в консоли, приучаемся кликать мышкой по гую.