Польза и области применения генераторов кода
От: vaa  
Дата: 06.11.22 01:01
Оценка:
Используете ли данную фичу, насколько активно, кейсы?
По-моему, ограниченность partial сильно сужает область применения.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Польза и области применения генераторов кода
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.11.22 08:37
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Используете ли данную фичу, насколько активно, кейсы?

Весьма активно.
Порождаю однотипный код.
https://github.com/evilguest/linq2d/blob/master/Linq2d/Array2d.N.Recurrent.Sources.tt превращается в https://github.com/evilguest/linq2d/blob/master/Linq2d/Array2d.N.Recurrent.Sources.cs

vaa>По-моему, ограниченность partial сильно сужает область применения.

?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Польза и области применения генераторов кода
От: vaa  
Дата: 06.11.22 11:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>?


https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Польза и области применения генераторов кода
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 06.11.22 11:57
Оценка: 6 (1)
Здравствуйте, vaa, Вы писали:

vaa>Используете ли данную фичу, насколько активно, кейсы?

Раньше (на паре проектов) был небольшой опыт, но не "кодогенерации вообще", а подхода MDA (Model Driven Architecture), т.е. мы генерировали базовый код для сущностей предметной области: таблицы, CRUD-хранимки (у заказчика было требование доступа к данным таблицы через слой хранимок), модели DTO, CRUD-сервисы, ... — на основе описанной модели.

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

В одном из проектов для описания модели мы использовали DSL Tools. Для генерации — T4.
В другом случае был самописный генератор (этакий монстрик с прямой записью через StringBuilder), который в качестве модели брал на вход набор XML-ек.

Первый вариант был достаточно удобным и технологичным. Мы использовали самую простую модель — просто диаграмму "Сущность-связь", но в которой были:
— любые нужные нам атрибуты как у сущностей, так и у связей (в основном у сущностей, конечно)
— некоторые дополнительные валидации по самой модели (сейчас всех подробностей не помню, но, например, что-то типа того, что генерация зависела от некоторой комбинации параметров и некоторые сочетания были не допустимыми и мы это сразу при рисовании диаграммы проверяли).

vaa>По-моему, ограниченность partial сильно сужает область применения.

О каких именно ограничениях речь? Хотелось бы увидеть конкретный пример.
От себя могу сказать, что мы особо не натыкались на такое, но у нас, возможно, ситуация была проще — мы могли управлять процессом генерации.
Например, можно было включать/выключать необходимость валидации всей сущности. И, тогда, в первом случае требовать наличия метода валидации с любой сигнатурой (а то и не метода — а отдельного класса!) и без использования partial (т.е. код просто не соберется, пока нужного метода/класса не будет), а во втором — ничего не делать.

Основная проблема с которой столкнулись мы по мере роста сложности проекта, приходилось перепроектировать генерацию, добавляя всё больше разных точек расширения (а за одно — усложняя логику самой генерации).
И если на первых порах, когда генерация была простой и легко поддерживаемой, выхлоп от неё был очевиден.
А вот когда затраты на поддержку самой генерации (точнее, в нашем случае, модели + генерации) стали ощутимыми — всё уже было не так очевидно.
Re[3]: Польза и области применения генераторов кода
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 06.11.22 11:59
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview

А можно конкретнее?
Какая связь между Source Generators и ограничениями partial?
Re: Польза и области применения генераторов кода
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 06.11.22 12:38
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Используете ли данную фичу, насколько активно, кейсы?

vaa>По-моему, ограниченность partial сильно сужает область применения.

В ядре Линукса есть 2-3 миллиона строк кода из драйвера АМД, который был автоматически сгенерирован.
Re[4]: Польза и области применения генераторов кода
От: vaa  
Дата: 06.11.22 12:39
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, vaa, Вы писали:


vaa>>https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview

МР>А можно конкретнее?
МР>Какая связь между Source Generators и ограничениями partial?

ну, если я правильно понял ман, то работает этот инструмент только для реализации класса|метода в имеющего ключевое слово partial.
Хотя во введении что-то и говорится о модификации IL, но примеров я не видел.
И получается новый класс нельзя сгенерить, только модификация(реализация) частичных, уже имеющихся членов.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Польза и области применения генераторов кода
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 06.11.22 14:22
Оценка: 86 (2)
Здравствуйте, vaa, Вы писали:

vaa>ну, если я правильно понял ман, то работает этот инструмент только для реализации класса|метода в имеющего ключевое слово partial.

vaa>И получается новый класс нельзя сгенерить, только модификация(реализация) частичных, уже имеющихся членов.
Нет, вы поняли не совсем верно. Source Generators позволяют "на лету" (во время компиляции), добавить код, который тут же будет скомпилирован.
А вот что там будет — новые типы, или классы/методы с partial — это уже вы сами решаете, как разработчик Source Generator
Чтобы не повторяться, сошлюсь на свой ответ в теме про SG
Автор: Михаил Романов
Дата: 02.05.20
чуть ранее.

vaa>Хотя во введении что-то и говорится о модификации IL, но примеров я не видел.

Если вы про вот этот раздел, то я тоже не очень понял, что может дать SG для bytecode weaving. Возможно, как с рефлексией (этот вариант расписывается) можно перенести анализ кода на этап компиляции... Не знаю.
Re[2]: Польза и области применения генераторов кода
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 06.11.22 14:30
Оценка: 18 (1)
Здравствуйте, Михаил Романов, Вы писали:

Ну и еще сошлюсь вот на такой цикл статей как раз про разные подходы и механизмы генерации кода в .Net
Назвать его исчерпывающим нельзя, конечно, но как минимум из первой статьи можно найти кучку примеров где и как кодогенерация используется прямо сейчас в самом .Net.
Re: Польза и области применения генераторов кода
От: hi_octane Беларусь  
Дата: 06.11.22 14:38
Оценка:
vaa>Используете ли данную фичу, насколько активно, кейсы?
vaa>По-моему, ограниченность partial сильно сужает область применения.
Кодогенерацию использую максимально. В ключевом для меня проекте каждая функция написана очень тупо и просто, а в partial-классе для неё создаётся обвязка, которая пишет трейсы/логи/дампы вызовов, синхронизацию если функция не многопоточная, код который нужен чтобы вызвать её через API и вернуть результат, код который нужен чтобы настроить в конфиге всякие "статические" параметры (таймауты, размер входного буфера, и т.д.).

Но эта генерация у меня работала ещё на Core 3, и на source generators я так и не переехал. Делал пару попыток, но код, генерирующий эти обвязки, сам использует типы из проекта, и студии от этого делается плохо-плохо.
Re: Польза и области применения генераторов кода
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 06.11.22 16:04
Оценка: 9 (1)
Здравствуйте, vaa, Вы писали:

vaa>Используете ли данную фичу, насколько активно, кейсы?

vaa>По-моему, ограниченность partial сильно сужает область применения.
Там как раз partial то расширили https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/partial-method
Просто для

Разделяемый метод может не иметь реализацию в следующих случаях.

У него нет модификаторов доступа (включая private по умолчанию).
Он возвращает значение void.
У него нет параметров out.
У него нет ни одного из следующих модификаторов: virtual, override, sealed, new или extern.
Любой метод, не соответствующий всем этим ограничениям (например, метод public virtual partial void), должен предоставлять реализацию. Эта реализация может быть предоставлена генератором источника.


Часто нужно для реализации интерфейсов https://github.com/canton7/PropertyChanged.SourceGenerator?ysclid=la5jiof4n5132379398
Для работы с .Native AOT когда можно сгенерировать тот же Linq to DB
Ну и для всего для чего были T4, только теперь отлаживать проще
и солнце б утром не вставало, когда бы не было меня
Re: Польза и области применения генераторов кода
От: _FRED_ Черногория
Дата: 07.11.22 16:18
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Используете ли данную фичу, насколько активно, кейсы?


В основном, генерация типов по неким "внешним" данным (например, по xsd).
Хочу таки сделать генератор для компараторов. Run-time генерация у меня уже есть ([C# 4 и 3] Построитель компараторов), теперь охота того же, но compile-time.

В силу использования старого фреймворка:

vaa>По-моему, ограниченность partial сильно сужает область применения.


Приведёте примеры, где "partial сильно сужает область применения"?

На мой взгляд "partial" это как раз то, что не "сужает", а, наоборот, позволяет практически бесшовно соединять сгенерированный и рукописный код.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Польза и области применения генераторов кода
От: vaa  
Дата: 08.11.22 05:43
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, vaa, Вы писали:


vaa>>Используете ли данную фичу, насколько активно, кейсы?


_FR>В основном, генерация типов по неким "внешним" данным (например, по xsd).

_FR>Хочу таки сделать генератор для компараторов. Run-time генерация у меня уже есть ([C# 4 и 3] Построитель компараторов), теперь охота того же, но compile-time.


_FR>Приведёте примеры, где "partial сильно сужает область применения"?


_FR>На мой взгляд "partial" это как раз то, что не "сужает", а, наоборот, позволяет практически бесшовно соединять сгенерированный и рукописный код.

но заготовка должна быть заранее, это связывает руки. Хотя имеется техническая возможность модифицировать IL, просто генерить классы которых нет в рукописном коде.
или в частиный класс можно вложить сгенереный класс, это уже неплохо звучит.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Польза и области применения генераторов кода
От: Silver_S Ниоткуда  
Дата: 08.11.22 12:24
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>но заготовка должна быть заранее, это связывает руки. Хотя имеется техническая возможность модифицировать IL, просто генерить классы которых нет в рукописном коде.

vaa>или в частиный класс можно вложить сгенереный класс, это уже неплохо звучит.

Не понятно какая заготовка? Возможные сценарии:
1) Переписывание существующего тела метода. Методу даешь спец. имя, например: MyMethod_ и помечаешь атрибутом, а генератор создаст и добавит без подчеркивания MyMethod.
Единственная проблема — останется мусор MyMethod_ . Здесь у них недоработка, но исправить это будет не так сложно (удалять мусор).
2) От заготовки метода требуется передать в генератор только определение без тела. Для этого есть partial методы.
3) Генерировать методы класса совсем без заготовки. Тогда сам класс пометить атрибутом, а генератор создаст методы в этом классе (в partial).
4) Генерировать классы по заготовке. Дать особое имя классу, например, MyClass_ и пометить атрибутом. Генератор создаст с другим именем MyClass
5) Генерировать несколько классов без заготовки. Атрибутом помечать или класс или на уровне assembly.
Re[3]: Польза и области применения генераторов кода
От: _FRED_ Черногория
Дата: 08.11.22 13:12
Оценка: +1
Здравствуйте, vaa, Вы писали:

_FR>>Приведёте примеры, где "partial сильно сужает область применения"?

_FR>>На мой взгляд "partial" это как раз то, что не "сужает", а, наоборот, позволяет практически бесшовно соединять сгенерированный и рукописный код.

vaa>но заготовка должна быть заранее, это связывает руки. Хотя имеется техническая возможность модифицировать IL, просто генерить классы которых нет в рукописном коде.

vaa>или в частиный класс можно вложить сгенереный класс, это уже неплохо звучит.

Ничего не понял, сорри. Сложно оспаривать ваше предположение без конкретики, потому что не ясно, где же и от чего вам "узко". Вы можете привести пример, когда "partial сильно сужает область применения"?
Help will always be given at Hogwarts to those who ask for it.
Re: Польза и области применения генераторов кода
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.11.22 20:14
Оценка:
Здравствуйте, vaa, Вы писали:

Source Generators в действии
https://github.com/dotnet/roslyn-sdk/blob/main/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
https://github.com/dotnet/roslyn-sdk/blob/d7d6a76464f4f5a14a0ac7ec00384b372be19d80/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs

То есть можно прекрасно обходиться и без partial methods
и солнце б утром не вставало, когда бы не было меня
Re[4]: Польза и области применения генераторов кода
От: vaa  
Дата: 09.11.22 00:35
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, vaa, Вы писали:


_FR>>>Приведёте примеры, где "partial сильно сужает область применения"?

_FR>>>На мой взгляд "partial" это как раз то, что не "сужает", а, наоборот, позволяет практически бесшовно соединять сгенерированный и рукописный код.

vaa>>но заготовка должна быть заранее, это связывает руки. Хотя имеется техническая возможность модифицировать IL, просто генерить классы которых нет в рукописном коде.

vaa>>или в частиный класс можно вложить сгенереный класс, это уже неплохо звучит.

_FR>Ничего не понял, сорри. Сложно оспаривать ваше предположение без конкретики, потому что не ясно, где же и от чего вам "узко". Вы можете привести пример, когда "partial сильно сужает область применения"?


модификации применяются только к partial, я так понимаю обычным образом исходный код в проект сложно добавить налету,
а разделенные наверное автоматом подхватываются.
Если я захочу какой-нибудь класс из внешней сборки расширить, то это получится лишь если его автор сделал его partial, верно?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Польза и области применения генераторов кода
От: _FRED_ Черногория
Дата: 09.11.22 07:23
Оценка: +2
Здравствуйте, vaa, Вы писали:

vaa>>>но заготовка должна быть заранее, это связывает руки. Хотя имеется техническая возможность модифицировать IL, просто генерить классы которых нет в рукописном коде.

vaa>>>или в частиный класс можно вложить сгенереный класс, это уже неплохо звучит.

_FR>>Ничего не понял, сорри. Сложно оспаривать ваше предположение без конкретики, потому что не ясно, где же и от чего вам "узко". Вы можете привести пример, когда "partial сильно сужает область применения"?


vaa>модификации применяются только к partial, я так понимаю обычным образом исходный код в проект сложно добавить налету,

vaa>а разделенные наверное автоматом подхватываются.

Мне показалось, что вы совершенно не правильно смотрите на это всё: partial как раз наобопрот позволяет догенерировать что-либо к существующим типам.

vaa>Если я захочу какой-нибудь класс из внешней сборки расширить, то это получится лишь если его автор сделал его partial, верно?


Нет, после компиляции ("внешней сборки") partial на типах из этой сборки и методах этих типов уже не будет иметь значение.

За столько дней, что вы тут выясняете свой вопрос уже можно было бы попробовать или почитать побольше на эту тему
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Польза и области применения генераторов кода
От: Aquilaware  
Дата: 09.11.22 14:03
Оценка: 123 (1)
Здравствуйте, Sinclair, Вы писали:

S>Порождаю однотипный код.

S>https://github.com/evilguest/linq2d/blob/master/Linq2d/Array2d.N.Recurrent.Sources.tt превращается в https://github.com/evilguest/linq2d/blob/master/Linq2d/Array2d.N.Recurrent.Sources.cs

У вас там на главной странице:

"C# is an awesome language, .Net Core is an awesome platform, and I wanted to probe the boundaries of possible with this."

Лучше сказать так: "... and I wanted to probe the boundaries of what's possible with it."
Re[2]: Польза и области применения генераторов кода
От: Sharov Россия  
Дата: 27.12.22 14:15
Оценка:
Здравствуйте, hi_octane, Вы писали:

vaa>>Используете ли данную фичу, насколько активно, кейсы?

vaa>>По-моему, ограниченность partial сильно сужает область применения.
_>Кодогенерацию использую максимально. В ключевом для меня проекте каждая функция написана очень тупо и просто, а в partial-классе для неё создаётся обвязка, которая пишет трейсы/логи/дампы вызовов, синхронизацию если функция не многопоточная, код который нужен чтобы вызвать её через API и вернуть результат, код который нужен чтобы настроить в конфиге всякие "статические" параметры (таймауты, размер входного буфера, и т.д.).
_>Но эта генерация у меня работала ещё на Core 3, и на source generators я так и не переехал. Делал пару попыток, но код, генерирующий эти обвязки, сам использует типы из проекта, и студии от этого делается плохо-плохо.

А можно пример шаблоно, если не NDA, который все это делает?
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.