По крайней мере, вы правильно сформулировали вопрос =)
Обычными причинами использования генератора кода являются продуктивность и согласованность, поскольку они предполагают, что решение последовательной и повторяющейся проблемы состоит в том, чтобы добавить в нее больше кода. Я бы сказал, что каждый раз, когда вы думаете о генерации кода, посмотрите, почему вы генерируете код, и посмотрите, сможете ли вы решить проблему другими способами.
Классический пример этого - доступ к данным; вы можете сгенерировать 250 классов (по 1 для каждой таблицы в схеме), эффективно создав решение табличного шлюза, или вы можете создать что-то более похожее на модель предметной области и использовать NHibernate / ActiveRecord / LightSpeed / [выберите свой orm] для отображения богатой модели предметной области в базу данных.
Хотя и ручное решение, и ORM фактически являются генераторами кода, основное различие заключается в том, когда код генерируется. В ORM это неявный шаг, который происходит во время выполнения и, следовательно, является односторонним по своей природе. Решение, созданное вручную, требует явного шага для генерации кода во время разработки и вероятности того, что сгенерированные классы потребуют настройки в какой-то момент, что создаст проблемы при повторной генерации кода. Явный шаг, который должен произойти во время разработки, вносит трение в процесс разработки и часто приводит к коду, который нарушает DRY (хотя некоторые утверждают, что сгенерированный код никогда не может нарушать DRY).
Другая причина рекламировать генерацию кода связана с миром MDA / MDE (Model Driven Architecture / Engineering). Я не придаю этому большого значения, но вместо того, чтобы приводить ряд плохо выраженных аргументов, я просто собираюсь кооптировать кого-то другого - http://www.infoq.com/articles/8-reasons-why-MDE-fails.
Генерация кода IMHO - единственное решение в чрезвычайно узком наборе проблем, и всякий раз, когда вы его рассматриваете, вам, вероятно, следует еще раз взглянуть на реальную проблему, которую вы пытаетесь решить, и посмотреть, есть ли лучшее решение.
Одним из типов генерации кода, который действительно повышает производительность, является «генерация микрокода», когда использование макросов и шаблонов позволяет разработчику генерировать новый код непосредственно в среде IDE и вводить / вводить свой путь через заполнители (например, пространство имен / имя класса и т. Д.) . Такая генерация кода - это функция resharper, и я интенсивно использую ее каждый день. Причина того, что микрогенерация выигрывает там, где большинство крупномасштабных генераций кода терпит неудачу, заключается в том, что сгенерированный код не привязан к какому-либо другому ресурсу, который должен быть синхронизирован, и поэтому, как только код сгенерирован, он такой же, как и весь другой код в решение.
@John
Перенос создания «базовых классов» из IDE в xml / dsl часто наблюдается при разработке «большого взрыва» - классическим примером может быть попытка разработчиков преобразовать базу данных в модель предметной области. Если генератор кода не очень хорошо написан, он просто создает дополнительную нагрузку на разработчика, поскольку каждый раз, когда им нужно обновить модель предметной области, им придется либо переключать контекст и обновлять xml / dsl, либо расширять модель предметной области. а затем перенесите эти изменения обратно в xml / dsl (эффективно выполняя работу дважды).
Есть некоторые генераторы кода, которые очень хорошо работают в этом пространстве (дизайнер LightSpeed - единственный, о котором я могу думать о atm), выступая в качестве движка для поверхности дизайна, но часто эти генераторы кода генерируют ужасный код, который невозможно поддерживать (например, winforms / webforms, поверхность дизайна EF1) и, следовательно, быстро сводит на нет любые преимущества производительности, полученные от использования генератора кода в первую очередь.
22.03.2010
Response.Write("<b>blah</b>")
все свои страницы? 25.03.2010