metaclass: (Default)
[personal profile] metaclass
Кодогенератор-шаблонизатор T4 оказался весьма удобной вещью, на которой кодогенераторы пишутся и расширяются просто со страшной скоростью.

И поначалу это гораздо понятнее, чем кодогенератор с использованием AST целевого языка и претти-принтингом оного AST в исходники.
Но есть одно НО.
Результат без подсветки синтаксиса и автоформатирования к поддержке практически непригоден. Исходник представляет собой смесь C# кода, который выполняется и C# кода который генерируется, с разделителями вида <#,<#=,<#+ и #>. Без заточенного под это дело редактора после определенного уровня сложности кодогенератора в этом понять ничего невозможно.

Например, я, упившись крепким чаем, в припадке безумия таки реализовал свою старую идею - генерацию из простой модели иммутабельных сущностей и методов сохранения и загрузки оных сущностей в простой XML, где полям-значениям соответствуют атрибуты, полям-объектам - элементы, полям-спискам(List<>) - элементы с вложенными списками. Т.е. вариант XML, в котором это дело наиболее читабельно глазами. Если не боитесь пауков - можете глянуть на этот мрак.
По мере расширения этого кодогенератора (простые сущности-записи -> сущности с полями-списками -> поддержка enum -> поддержка полей-вложенных объектов -> поддержка memo-полей (строки в которых длинный текст с переносами)) это все понемногу превратилось в жопный ад. 10 кб текста, 300 строк, в которых даже я с трудом ориентируюсь уже.
Использовать это очень просто, расширять дальше - уже сложно.

Кроме того, во всей этой кодогенерации очень бесит необходимость постоянно расширять систему типов. Т.к. один и тот же string в целевой проге - это может быть и коротенькое имя, и текст SQL запроса и RTF-документ. А при показе поля с датой пользователю может быть необходимо использовать culture-invariant формат (например я для служебных данных и для себя пользуюсь везде только им, чтобы не вспоминать "на какой локали я сижу") а может и формат из текущей локали.
В общем, если делать классическими дотнетовскими средствами, как положено, то на каждое поле или проперть в POCO-сущности навешивается еще 5-10 атрибутов, и по всему коду расползается анализ этих атрибутов, т.е. фактически мало того, что мы расширяем систему типов дополнительными описаниями, так еще и всю их обработку делаем в рунтайме, как с какой-то динамической типизацией.



PS: Во, вспомнил еще идею, которая мне насчет T4 в голову пришла.
Частенько в C# не хватает ADT, но их можно сымитировать, сделав базовый класс и унаследовав от него все варианты ADT с нужными полями. Чтобы сделать pattern matching поверх этого, нужно написать в базовом классе метод, в который передается в качестве параметров по одному делегату на каждый вариант ADT и он анализирует текущий тип объекта, вызывая соответствующий делегат, подставляя поля варианта в качестве параметров делегату.

Руками такое писать очевидно влом. Но можно сделать на T4 мелкий шаблончик, который из описания ADT в привычном виде сгенерит все классы, конструктора, прототипы делегатов и метод для pattern matching.

Date: 2010-08-12 12:09 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
какэто чяем

Date: 2010-08-12 12:10 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ну ложки три заварки, литр воды и 6 кубиков сахара.
Глаза в общем-то на лоб лезут :)

Date: 2010-08-12 12:15 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
а тащемта в том же чае дохуя кофеина, например, и от него вымывается кальций из организма, например
но три ложки это както по-божески
я хуярил полкружки заварки типа принцесса нури или ещё какаято и полкружки воды, потом приходилось пить кальций, потому что начали разваливаться зубы, например
а потом перешёл на пуэр, он вроде полегче и както очень доставляет
только правильный пуэр в чорных блинах, а не рассыпное тащетам гуано от ооо кофеин, например

Date: 2010-08-12 12:16 pm (UTC)
From: [identity profile] metaclass.livejournal.com
А где покупается пуэр в черных блинах?
Хотя вообще всякие оолонги обычно пью.

Нащот кальция это чо-то да.

(no subject)

From: [identity profile] aamonster.livejournal.com - Date: 2010-08-12 12:18 pm (UTC) - Expand

(no subject)

From: [identity profile] berezovsky.livejournal.com - Date: 2010-08-12 12:19 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 06:47 pm (UTC) - Expand

Date: 2010-08-12 12:27 pm (UTC)
wizzard: (Default)
From: [personal profile] wizzard
>> один и тот же string в целевой проге - это может быть и коротенькое имя, и текст SQL запроса и RTF-документ

А если заворачивать в прокси-обьекты, которые для работы с внешними API умеют implicit operator string(RTFText text) { return text.value; }
?

Date: 2010-08-12 12:39 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Если делать такое вручную - дорога в ад. Мелкие объекты с одним полем, засоряют код, ничего не делая.
С кодогенератором завернуть не проблема, но в итоге это выглядит как натягивание совы на глобус, то бишь обход ограничений ООП еще большим ООП.

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

Date: 2010-08-12 12:27 pm (UTC)
From: [identity profile] paranoekk.livejournal.com
И что делать, кодогенерация тоже тупиковый путь?

Date: 2010-08-12 12:43 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Не, не тупиковый. Главное вовремя остановится и не уйти в дебри.

Тут по самой сути задачи безумие - в одной модели хранятся описания данных и описания маппингов этих данных на другие представления. Тут это "удобный" XML и юзерочитабельное представление, а у меня ж еще предстоит генерить схему БД, маппинги в нее, желательно GUI и что там еще, бинарную сериализацию какую-нибудь. Но это все я уже делаю на F#, с AST и прочими заморочками, т.к. C# из-за отсутствия ADT не хватает для некоторых сложных случаев.

Date: 2010-08-12 12:54 pm (UTC)
From: [identity profile] zelanton.livejournal.com
Эх, я себе давно уже такой написал и много лет уже пользую. Такими жабами оброс - мама дорогая. Например не только в XML и БД серилизация, но в ini-шки (и это древовидные полиморфные структуры).

Date: 2010-08-12 12:57 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Во-во, обрастает жабами, натурально.

Date: 2010-08-12 12:59 pm (UTC)
From: [identity profile] zelanton.livejournal.com
ребе, я потом этих жаб подрезал аккуратненько и сейчас оно прекрасно, пользуюсь с удовольствием.
Одно плохо - всё это счастье теперь на C# переписать, оно ж у меня на делфи. Но перепишу обязательно, универсальный же инструмент получился.

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 01:09 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 01:13 pm (UTC) - Expand

Date: 2010-08-12 01:03 pm (UTC)
From: [identity profile] zamotivator.livejournal.com
И чем это отличается от Template Haskell?

P.S. Упс, походу я этим комментом шаблоны порву

Date: 2010-08-12 01:06 pm (UTC)
From: [identity profile] zamotivator.livejournal.com
Ну или от camlp4.
Тоже самое по сути.

Выглядит пиздато, писать заебёшься.

Date: 2010-08-12 01:12 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Именно так.
Я, правда, camlp4 не смотрел, но подумываю, что неплохо было бы T4 на F# портировать :)

Date: 2010-08-12 01:11 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ээээ, нетипизированностью?

У TH выход вроде AST как раз и тайпчекинг там на ходу как-то делается. А тут выход - текст.
Кстати, для отладки промежуточный текст очень сильно удобен, в отличие от генерации кода на ходу типа лиспов и TH.

Date: 2010-08-19 11:32 am (UTC)
From: [identity profile] permea-kra.livejournal.com
>>тайпчекинг там на ходу как-то делается
Как-то. Руками.

>>Кстати, для отладки промежуточный текст очень сильно удобен
-ddump-*

Date: 2010-08-12 03:12 pm (UTC)
From: [identity profile] norguhtar.livejournal.com
Товарищи объясните мне, зачем все это вуду таки надо?

Date: 2010-08-12 03:45 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Чтобы ничего не делать, а все работало :)

Date: 2010-08-12 03:52 pm (UTC)
From: [identity profile] norguhtar.livejournal.com
Непокатит. Какой профит оно дает и за счет чего?

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 04:18 pm (UTC) - Expand

(no subject)

From: [identity profile] norguhtar.livejournal.com - Date: 2010-08-12 04:21 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 04:31 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 04:32 pm (UTC) - Expand

(no subject)

From: [identity profile] norguhtar.livejournal.com - Date: 2010-08-12 04:34 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 04:45 pm (UTC) - Expand

(no subject)

From: [identity profile] norguhtar.livejournal.com - Date: 2010-08-12 05:24 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 05:31 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 04:59 pm (UTC) - Expand

Date: 2010-08-12 06:15 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
А вот спорим не будет такого момента, когда все будет работать и ребе метакласс ничего не будет делать?

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2010-08-12 06:17 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 06:29 pm (UTC) - Expand

Date: 2010-08-12 06:14 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Это называется Model Driven Development. На Software Engineering Radio ему уже давно всякие немцы дифирамбы пели.

Date: 2010-08-13 01:25 am (UTC)
From: [identity profile] norguhtar.livejournal.com
Просто это вуду похлеще Spring Framework который я использую.

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-13 05:18 am (UTC) - Expand

(no subject)

From: [identity profile] norguhtar.livejournal.com - Date: 2010-08-13 05:28 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-13 05:40 am (UTC) - Expand

(no subject)

From: [identity profile] norguhtar.livejournal.com - Date: 2010-08-13 05:44 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-13 08:32 am (UTC) - Expand

Date: 2010-08-12 06:48 pm (UTC)
From: [identity profile] theiced.livejournal.com
А теперича, ребе, посмотрите на макросы в лиспе и начинайте завидовать чОрной завистью.

Date: 2010-08-12 07:08 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Не, не, я не представляю, как ЭТО отлаживать.

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 07:16 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 07:18 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 07:23 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 07:26 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 07:31 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 07:35 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 07:37 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2010-08-12 07:40 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-12 07:37 pm (UTC) - Expand

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 6th, 2025 05:02 am
Powered by Dreamwidth Studios