twitterfacebookrss

Кодогенераторы

Кодогенераторы

«Программы, пишущие программы» – чёрная зависть овладела мною, когда я прочитал эту мысль в книге «Программист-прагматик». Это же так очевидно, что можно написать программу, которая сама будет писать программу! Почему мне раньше не приходила в голову эта банальность?! Это же мечта программиста! Просыпаешься ты, значит, с утра, часов в 13, подходишь к рабочему месту, откидываешь полы фрака, мутным взглядом высматриваешь на экране монитора кнопку «генерировать код», жмакаешь, и всё – идёшь спать дальше, рабочий день окончен.

Давайте немного пообщаемся по поводу генераторов исходного кода, а точнее, я расскажу, в каком объёме их применяю, и (на свой страх и риск) поделюсь примером исходного текста.

Какие генераторы бывают

Авторы «Программист-прагматик» делят генераторы на пассивные и активные, соответственно:

  • Пассивные – экономят время на набор текста, это могут быть различные шаблоны для файлов исходного текста, к примеру, Visual Studio всегда вам сгенерирует новый файл с вписанными туда по умолчанию пространствами имён, пустым классом и т.д.
  • Активные – используются для преобразования для одного вида знания в другое. Ну, к примеру, вы можете на основании метаданных базы данных сгенерировать хранимую процедуру выборки, или сразу весь набор CRUD.

На мой взгляд, деление достаточно условное – в обоих случаях мы генерируем код, который может быть добавлен в проект и скомпилирован.

Какие генераторы использую

Я, в основном, занимаюсь программированием, которое вертится вокруг баз данных, поэтому начал писать генераторы применительно к этой области. Автоматизации своей деятельности обычно начинается с того, что ты замечаешь за собой, что в сотый раз пишешь одну и ту же конструкцию. А потом её ещё и правишь.

Вот, к примеру, такая ситуация. Есть таблица в реляционной базе данных с тремя полями. Ты хочешь, чтобы у тебя в программе было представление её записи в объектном виде. Ну, т.е. делаешь структуру с тремя полями и с каким-нибудь витиеватым названием типа «НазваниеТаблицыRecord». И тут, вот зараза, решают один столбец переименовать. Ты же апологет красивого кода, ты лезешь в свою структуру и меняешь название свойства. Компилируешь. Потом добавляется ещё один столбец в таблицу. Ты лезешь в свою структуру и добавляешь новое свойство. Компилируешь. (Ну сколько можно?). Разработчик базы данных удаляет второй столбец. Ты лезешь в свою структуру и удаляешь свойство. Компилируешь. (Может хватит?!). Друг Пётр, просматривая код, замечает: «Хм, смотри, а ты вот здесь на одну букву ошибся, второй столбец с буквы А начинается… » (!@@№%!).

Ближе к делу

Вот, собственно, две основные вещи, которые за меня создаёт генератор – хранимые процедуры и классы, представляющие одну запись из таблицы. Код генерируется на основе метаданных, в MS SQL Serve это View, которые находятся SystemView и начинающиеся с INFORMATION_SCHEMA. Для MySql это база данных information_schema. Из этих метаданных извлекаются сведения об именах столбцов, их типов данных, размеров, связей и на их основе генерируется исходный код. Как видите, на любом нужном вам языке.

Самое главное

1. Когда вы генерируете клиентский код, к примеру, класс, который представляет собой одну запись в таблице, важно понимать, что генерировать вы должны по одному шаблону, а это в свою очередь от выбранной архитектуры. Будет ли это «Active Record» или «Value Object»? Зависит от архитектуры и практик проектирования, использующихся в вашем проекте. Именно поэтому, я забил на написание общего решающего сто задач генератора, и пишу маленькие программы, беря за основу работающий генератор.

2. Молодёжь, ещё не уставшая писать сто раз один кусок кода, исходя из принципа «бешеной собаке и семь вёрст не крюк», будет вовсю сопротивляться использованию кодогенераторов. Я предложил одному собрату по несчастью замерить, сколько у него уйдёт времени на написание процедур вставки и выборки, и класса «Value Object». Работа заняла у него более 40 минут, мой генератор забомбил за пару секунд. И всё равно это не убедило его пользоваться генератором. И это не единственный случай.

Заключение

Практика кодогенерации стара как мир. Ещё лет сто назад, я видел в одном из продуктов Rational Software как на основании даже не схемы БД, а ещё более высокой, инфологической модели, генерировалась схема БД под кучу диалектов, генерировались формы на куче языков. (Кажется вот этот продукт) И вы тоже можете генерировать, что вашей душе угодно. Как вы увидите в исходниках, что я выложил для примера, там создаются хранимые процедуры CRUD + GetById, клиентский код для репозитория, «Value Object», код для вызова хранимых процедур из нашей библиотеки доступа к данным. В общем, вагон и маленькая тележка. Туда ещё генерацию GUI – и прототип приложения готов. За пару секунд.

Это ли не фантастика?

P.S. Генераторы, которые я использую, не избавляют от компиляции, но и этот момент можно автоматизировать.
P.P.S. Кодогенераторы очень простые – процедурное программирование, местами даже говнокод (надо же где-нибудь расслабиться!?)
P.P.S.S. Мой кодогенератор видимо подходит под определение «Скафолдинг»

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс
Автор статьи: Александр Шибанов

Александр Шибанов IT - предприниматель с более чем 10 летним стажем в индустрии. Принимал участие в различных по сложности проектах, на позициях программиста и руководителя проектов. С 2011 - года индивидуальный предприниматель.

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

Написать комментарий