Автоматические генераторы кода [закрыто]

13

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

Стоит ли затрат на использование генератора кода из-за затрат времени на обслуживание и за сокращение времени на создание?

Mumbles
источник

Ответы:

10

Давайте перефразируем это:

Стоит ли платить хороший автоматический генератор кода?

Да.

Стоит ли платить за плохой автоматический генератор кода, который создает больше работы для всех остальных, но стоит ли это автора?

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

Wheaties
источник
16
Я не согласен с вашей второй точкой. Сгенерированный код должен быть достаточно хорошим, чтобы он работал и не создавал проблем с производительностью / безопасностью или какими-либо другими проблемами. Поскольку вы никогда не должны поддерживать сгенерированный код вручную, не имеет значения, если он не соответствует вашим обычным стандартам кодирования.
Хила
4
Это нормально, что вы не согласны. Однако, если вы собираетесь потратить время на создание генератора кода, то почему бы не потратить время на то, чтобы код сгенерировался красиво? После генерации я не знаю, кто это сделал, как это было сделано, и каковы его намерения, если только он не так удобен для чтения / сопровождения, как все остальные части. Иногда генераторы существуют только для того, чтобы создать отправную точку, а не полноценный готовый продукт.
пшеница
1
Кроме того, если генерация кода является частью вашей сборки (т. Е. Она генерируется заново при каждой сборке), тогда не имеет особого смысла создавать «красивый» код. Но если вы собираетесь сгенерировать код один раз и все, тогда это другая история.
Дин Хардинг
5
Хила, вы никогда не должны поддерживать сгенерированный код вручную, но когда придет время, когда вам нужно изменить этот код в связи с новыми / изменяющимися требованиями, вам нужно, чтобы код был ясным и понятным, чтобы вы могли легко внести необходимые изменения в генератор , а затем заново сгенерировать.
Carson63000
6
Сгенерированный код не должен быть достаточно красивым для обслуживания, но он должен быть достаточно понятным для отладки и проверки.
Гуперникетес
23

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

Аналогия: хотя процессор моего компьютера всегда выполняет машинный код, мне не нужно ничего знать об этом, пока я знаю, как создать этот машинный код, используя язык высокого уровня и компилятор. Я слышал, что GCC иногда производит некачественный машинный код, но кого это волнует, если он работает отлично. Уровни абстракции базы данных производят SQL для работы с механизмом БД, но кого волнует, как выглядит этот SQL, если уровень абстракции ясен и работает?

При правильном использовании генераторы кода могут определенно сэкономить не только на создании, но и на обслуживании.

Joonas Pulakka
источник
4
Тогда возникает проблема: инструмент есть только у одного человека, а у кого-то еще нет, и поэтому ему приходится вручную поддерживать код.
бормочет
Это проходит мимо. Как разработчики программного обеспечения, наш бизнес - это код, независимо от того, как мы его производим.
Стивен Эверс
12
@ Дэвид, если инструмент есть только у одного человека, вы не должны использовать его для проекта, в котором участвует более одного человека.
Мэтт Оленик
2
@Matt, точно. Генераторы являются частью проекта (сопоставимы со сценариями сборки) и должны храниться в системе контроля версий или аналогичном центральном хранилище.
Joonas Pulakka
2
@SnOrfus: Я думаю, что наш бизнес - производить рабочие продукты, которые люди готовы использовать и покупать. Вот откуда наша зарплата. Код это просто среда.
Joonas Pulakka
6

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

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

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

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

Дэвид Торнли
источник
3

Из комментариев к другим ответам кажется, что вы спрашиваете о стандартах команды, а не о самих генераторах кода.

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

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

Роб Стивенсон-Леггетт
источник