Подтвердить что ты не робот

Является ли генерация кода плохим?

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

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

  • отображение xml файла, который должен быть закодирован вручную
  • Класс сущностей, которому требуется ручное кодирование

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

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

Как вы думаете?

4b9b3361

Ответ 1

Вообще говоря, вы не хотите редактировать сгенерированный код после его создания (особенно, если ввод в генератор кода сложный и/или может измениться).

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

Мой опыт генерации кода "один выстрел" (где код генерируется, а затем настраивается и расширяется вручную) заключается в том, что он является источником боли. Если вы когда-нибудь захотите вернуться и сменить данные, из которых был сгенерирован код, вам почти всегда приходится вручную объединять свои пользовательские изменения...

Ответ 2

Генерация кода - это хорошо, когда все сделано правильно, но слишком часто делается неправильно.

IMO, генераторы кода должны быть достаточно умными, чтобы обрабатывать изменения в сгенерированном коде. Вернувшись в .NET 1.0 дней, даже блестящие новые генераторы кода Visual Studio.NET могли это сделать - в разумных пределах. С .NET 2.0 мы получили частичные классы, чтобы сделать его еще более простым.

И все же есть еще некоторые генераторы, которые не могут работать более одного раза.

Мои правила для "хорошего" генерации кода:

  • Код должен быть сгенерирован в среде IDE, для которой генерируется код. Нет сторонних исполняемых файлов. Обычно это плагин Visual Studio, но это правило применяется и к другим языкам.
  • Сгенерированный код должен обеспечивать четкие и простые возможности расширения.
  • Сгенерированный код должен быть невидимым для разработчика.
    • Другими словами, разработчик должен использовать конструктор только для изменения сгенерированного кода.

Ответ 3

Это обоюдоострый меч. С одной стороны, это может быть огромное время. Посмотрите на размер заглушек, которые генерирует VS, когда вы указываете его на WSDL файле - мне бы не хотелось, чтобы каждый раз, когда я хотел использовать новую веб-службу, мне приходилось кодировать этот код.

С другой стороны, как вы указываете, вам почти всегда нужно тонко настроить сгенерированный код, что может привести к ошибкам, если вы не знаете точно, что вы делаете, поскольку сгенерированный код может быть довольно лабиринт. Итак, я полагаю, что мой ответ: сначала познакомьтесь с тем, что испускало генератор кода, прежде чем полагаться на него.

Ответ 4

Ларри Уолл (создатель Perl) говорит, что три кардинальных достоинства - это лень, нетерпение и высокомерие, и что есть хорошие и плохие версии каждого из них.

Вы являетесь примером лень (хороший способ) в попытке автоматизировать скучную и некреативную работу. Хорошо для вас.

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

Ответ 5

Я абсолютно ничего не имею против создания кода, который не нужно изменять: что делают компиляторы: -)

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

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

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

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

Ответ 6

Генерация кода прекрасна до тех пор, пока вы понимаете, что генерируется или когда оно заменило значение по умолчанию на пользовательский (пример) Напр. Это часть отображения nhibernate, генерируемого MyGeneration
Почему существует

IsChanged

свойство

/// <summary>
/// Returns whether or not the object has changed its values.
/// </summary>
Public virtual bool IsChanged { get; private set; }

Будет ли это изменено? Когда это изменится? и что происходит, когда оно меняется.

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

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

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

К счастью, такие рамки, как .net, допускают частичные классы, методы расширения и т.д., которые помогут вам справиться с ситуациями.

Ответ 7

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

Я написал 3 генератора кода, но в настоящее время я использую Code Smith. Иногда я использую шаблоны NETTiers. Иногда я использую свои собственные.

Мне все равно, какой генератор вы используете. CodeBreeze, CodeSmith, LLBLGen, xslt файлы и т.д.

Получите, узнайте, любите.

КАЖДЫЙ проект, в котором я работал уже 10 лет и более, включал в себя сгенерированный код.

Начните здесь: < http://www.dotnetrocks.com/default.aspx?showNum=63 >

< http://www.dotnetrocks.com/default.aspx?showNum=304 >

< http://www.dnrtv.com/default.aspx?showNum=77 >

< http://www.dnrtv.com/default.aspx?showNum=133 >

< http://www.nettiers.org/Home.ashx >

Должен бежать. Наслаждайтесь.

Ответ 8

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

Если это будет хорошо, вам вряд ли придется вернуться и настроить его через пару месяцев. После того, как вы получите свой код и внесите некоторые изменения, вы найдете мир в этом проекте: P

Ответ 9

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

Ответ 10

Нет - почему это должно быть? Если я смогу получить инструмент, чтобы сделать раздражающий, скучный код для меня - я могу делать более интересные вещи, в то же время!

Марк

Ответ 11

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

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

Что ты на самом деле меня: "Я в порядке, чтобы взять некоторые из этих удивительных сил для моего собственного использования?"

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

Ответ 12

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

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

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

Ответ 13

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

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

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

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

Ответ 14

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

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

Ответ 15

Генерация кода времени сборки плохо, потому что:

  • его сложнее поддерживать - новый программист, смотрящий на проект, может потерять понимание недели, что какой-то код действительно сгенерирован;

  • для этого требуется полная сборка, и в среде разработки вы не хотите часто проходить полную сборку;

  • когда возникает исключение в сгенерированном коде, вы застряли;

  • для его игнорирования требуются дополнительные (часто сложные) настройки SCM,

  • вы не можете изменить его, даже если хотите, потому что он будет переопределен в следующей сборке;

  • изменение определений, из которых генерируется код, может оказаться разбитым на кодовую базу, но это не будет найдено до конца (т.е. вы можете успешно развиваться при нарушении кода).

Ответ 16

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


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

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

Ответ 17

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

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

Ответ 18

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

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

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

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

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

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

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

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

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

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

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

Ответ 19

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

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

Ответ 20

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

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

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