Кодогенерацію, development

Кодогенерацію, development

«Програми, які пишуть програми» - чорна заздрість опанувала мною, коли я прочитав цю думку в книзі «Програміст-прагматик». Це ж так очевидно, що можна написати програму, яка сама буде писати програму! Чому мені раніше не приходила в голову ця банальність. Це ж мрія програміста! Прокидаєшся ти, значить, з ранку, годині о 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. Мій кодогенератор мабуть підходить під визначення «Скафолдінг»

Схожі статті