Является ли генерация кода плохой вещью? - PullRequest
25 голосов
/ 02 апреля 2009

Это субъективный вопрос.

Недавно я пытался изучить NHibernate. Проблема с ним как минимум в 2 раза:

  1. картографический xml-файл, который необходимо кодировать вручную
  2. Класс сущностей, для которого требуется ручное кодирование

Хотя NHibernate - это замечательная среда, но необходимость писать файл сопоставления и создавать классы сущностей, которые имитируют таблицы базы данных, - трудная задача для написания. Есть несколько инструментов, которые могут решить эту проблему, например Castle ActiveRecord или NHibernate Fluent.

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

Что вы думаете?

Ответы [ 20 ]

1 голос
/ 02 апреля 2009

Code Generator может сэкономить ваше драгоценное время, но имейте в виду, что если вы начинаете генерировать огромное количество кода, это также означает, что ваш код не СУХОЙ, что означает много повторений. Это может создать проблемы для обслуживания кода и ухудшить элегантность вашего кода.

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

Наконец, если у вас есть свобода выбора языка, вы можете попробовать ActiveRecord ruby ​​(пакет rails), DataMapper или Sequel. Все это отличные ORM, которые требуют минимальной конфигурации.

1 голос
/ 16 августа 2009

Я использую генераторы кода каждый день. Это значительно сократило время, необходимое для написания скучной / утомительной части приложения.

Я настоятельно рекомендую использовать Ruby в качестве инструмента для генерации кода. Я генерирую код C ++ и C # из Ruby. Вход в генератор кода - это простой внутренний DSL.

1 голос
/ 03 апреля 2009

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

НО в вашем случае я бы определенно проверил одну особенность Fluent NHibernate: автоматическое сопоставление! Подробнее здесь .

После настройки вы можете создавать постоянные классы, которые автоматически сопоставляются с БД, не записывая ничего, кроме ваших классов сущностей. Это правильный путь - определение вашей доменной модели в базе данных является довольно странным (по крайней мере, если вы можете избежать этого).

Мои 2 цента, по крайней мере.

1 голос
/ 02 апреля 2009

Мы не могли бы функционировать почти на том же уровне, что и без генерации кода. Это вездесущий.

Без генерации кода мы бы вручную устанавливали биты в широких словах микрокода для ввода данных в нужную шину.

Что вы на самом деле я, так это: «Это нормально для меня, чтобы использовать эту удивительную силу для своего собственного использования?»

На что я отвечу: «Конечно, нокаутируйте себя. Просто помните: 1) с большой силой приходит великая ответственность и 2) используйте ее только во благо, а не во зло».

1 голос
/ 02 апреля 2009

Использование генерации кода для начала работы, на мой взгляд, хорошо. Проблема возникает, когда вам нужно изменить сгенерированный код для обработки особых случаев, или когда вы обнаружите, что сгенерированный код не тот, каким он должен быть, тогда поиск сотрудника для работы с сгенерированным кодом может быть затруднен в зависимости от вашей команды. Недавно я работал над проектом, в котором код был сгенерирован одним человеком, и он использовал для этого свой собственный магический метод ... В итоге он стал узким местом, поэтому к концу мы прекратили генерацию кода, и все получилось довольно хорошо .

0 голосов
/ 21 января 2015

Я думаю, что большинство людей, которые отрицательно относятся к генерации кода, либо не являются разработчиками .NET, либо ничего не знают о генерации кода.

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

Я думаю, что большинство разработчиков .NET, читающих эту статью, уже используют генерацию кода и даже не знают об этом, Entity Framework использует шаблоны генерации кода T4

https://msdn.microsoft.com/en-us/library/bb126445.aspx

Почему генерация кода "хороша"?

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

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

Код, генерирующий структуру в C #, гарантирующую, что ваши шаблоны используют частичные классы и частичные методы ...

https://msdn.microsoft.com/en-us/library/wa80x488.aspx

... позволяет создавать расширения и дополнять сгенерированный код в каждом конкретном случае. Эти конструкции существуют в C # безо всякой другой причины.

Я создаю репозитории, объекты и интерфейсы для обоих. Я бы не стал создавать систему, которая работает с базой данных, не используя генерацию кода.

0 голосов
/ 14 апреля 2009

Много хороших ответов.

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

Основной вопрос, который я задаю генератору кода: «Я понимаю, что он делает?».
Если я этого не сделаю, то, вероятно, это мне не поможет.

0 голосов
/ 02 апреля 2009

Нет. Code-gen не является ни добром, ни злом. Это просто инструмент. Если вы используете его хорошо, это может сэкономить вам неизмеримое время. Если вы используете его плохо, с другой стороны, это может стоить вам того же неизмеримого количества времени.

Один маленький кусочек, если вы делаете code-gen в среде oo, я бы посоветовал вам обернуть сгенерированные классы, если вы хотите расширить их от сгенерированных.

0 голосов
/ 02 апреля 2009

Для отличного примера сгенерированного кода, который является очень расширяемым, посмотрите на DSL Toolkit, который является частью Visual Studio SDK. Один использует его для определения вашего собственного графического предметно-ориентированного языка (который генерируется), и большая часть поведения может быть настроена с помощью частичных классов и переопределений. Это очень мощная комбинация.


Два примечания: .NET довольно часто генерирует код за кулисами. Регулярные выражения, XML-преобразования и код XML-сериализатора создаются на лету. Конечно, то же самое относится и к ASP.NET, и я был бы удивлен, обнаружив, что он не используется больше, чем это (я думаю о XAML).

Кроме того, я хочу прямо сказать, что классы, сгенерированные конструктором DataSet, а также "Добавить веб-ссылку" и "Добавить сервисную ссылку", являются частичными классами. Вы можете оставить сгенерированные файлы в покое, и при этом расширять сгенерированные классы. Пример этого приведен в нижней части Способы настройки клиентского прокси ASMX .

0 голосов
/ 02 апреля 2009

Я думаю, вопрос о том, стоит ли использовать генерацию кода, зависит от ваших целей в коде.

Ваш пример уровня доступа к данным - хороший. Ваша проблема с NHibernate заключается в том, что вы должны сами генерировать классы домена. Если классы вашего домена отображаются непосредственно в схему базы данных, то это не проблема. Однако одной из сильных сторон NHibernate в этом сценарии является именно то, что вы МОЖЕТЕ определить свои собственные доменные классы и что они не должны точно отображаться на уровне базы данных. Это означает, что вы можете настроить свой слой БД позже, и единственный код, который вы должны изменить, это файл отображения. Если бы вы использовали генерацию кода, вам, вероятно, пришлось бы настроить намного больше кода, и настройки не всегда были бы такими простыми, как настройки файлов сопоставления.

...