Я нахожусь в философском лагере, который считает генераторы кода "неправильными", потому что они указывают на то, что должно стать частью языка.
Но большая часть этики Pragmatic Programmer заключалась в написании кода, который пишет код, и на практике генерация кода работает хорошо, если сгенерированный код скрыт по умолчанию. Неважно, насколько философски чистым вы хотите быть, язык никогда не будет развиваться так быстро, как проблемы, которые вы хотите решить.
На ум приходит код, который генерируется при создании формы Windows в Visual Studio. Вы можете посмотреть на сгенерированный код, если хотите, но лучше не делать этого. Однако переход на декларативный язык с использованием WPF был более значительным, поскольку он более чист и более надежен в манипулировании декларативным кодом программно, чем императивный.
Они должны были сделать то же самое с классами LINQ-To-SQL. Им нужен декларативный язык для классов, которые просто имеют свойства и не имеют собственного поведения. Вероятно, было бы легче сделать эти классы сущностей динамическими - автоматически изменяющимися при изменении базовой схемы базы данных.
Мы пытались использовать CodeSmith для генерации классов .NetTiers для всех таблиц в нашей базе данных, но столкнулись с двумя проблемами:
.NetTiers был раздут, и сгенерированный код был огромен. Я думаю, что инструменты генерации кода делают слишком легким создание существа.
Поскольку схема активно развивалась и изменялась, нам также пришлось много регенерировать, и в результате нам было очень трудно поддерживать все под контролем исходного кода, поскольку все файлы регенерировались и заменялись. В итоге я не был уверен, должен ли сгенерированный код вообще находиться в системе контроля версий.
Лучшее место для генерации кода должно быть на этапе компиляции или сборки, а не на этапе проектирования. Когда вы используете анонимный тип или метод в C #, компилятор выполняет генерацию кода на лету. Если вы генерируете код на этапе проектирования, вы получаете кусок stuff , который должен регенерироваться каждый раз при изменении базовых параметров.