Должен ли сгенерированный код быть удобочитаемым для человека?

StackOverflow https://stackoverflow.com/questions/63257

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Вот ссылка, которую я только что нашел о рассматриваемой теме;На самом деле я искал ссылку на одну из глав из книга "прагматичный программист" чтобы указать, почему мы сначала заглянули в наш код.

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

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

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

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

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

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

Поэтому удобочитаемость для человека должна иметь более низкий приоритет;такие вещи, как скорость выполнения или функциональность, гораздо важнее.Это особенно актуально, когда вы смотрите на такие инструменты, как bison и flex, которые используют сгенерированный код для предварительной генерации таблиц быстрого поиска для сопоставления с шаблоном, что было бы просто безумием поддерживать вручную.

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

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

-Адам

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

Я много раз находил полезным перепроверять различия в сгенерированном коде по сравнению с исходным кодом.

Таким образом, вы могли бы даже иногда находить ошибки в инструментах, генерирующих код.

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

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

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

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

Сгенерированный код должен быть читабельным (форматирование и т.д. Обычно может быть обработано наполовину приличной IDE).На каком-то этапе жизненного цикла кода кто-то увидит его, и он захочет разобраться в нем.

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

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

Логика всегда должна быть читабельной.Если кто-то другой собирается читать код, попробуйте поставить себя на его место и посмотреть, сможете ли вы полностью понять код на высоком (и низком?) уровне, не читая этот конкретный фрагмент кода.

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

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

Существуют различные типы сгенерированного кода, но наиболее простыми типами будут:

  1. Сгенерированный код, который не предназначен для просмотра разработчиком.например, xml-код, который определяет макеты (например, файлы .frm или ужасные файлы, сгенерированные SSIS)
  2. Сгенерированный код, который должен стать основой для класса, который позже будет настроен вашим разработчиком, например, код сгенерирован для уменьшения утомительного набора текста

Если вы делаете последнее, вы определенно хотите, чтобы ваш код был удобочитаемым для человека.

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

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

Для примера из реального мира - посмотрите на все, что генерирует Visual Studio.Хорошо отформатированный, с комментариями и всем прочим.

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

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

Абсолютно да по множеству веских причин, уже упомянутых выше.И еще одно: если ваш код должен быть проверен экспертом (на предмет безопасности и надежности), гораздо лучше, если код доступен для повторного использования человеком.В противном случае эксперт откажется оценивать его, и ваш проект будет отклонен компетентными органами.Тогда единственным решением будет провести оценку...генератор кода (обычно это намного сложнее ;))

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

Я думаю, что ответ таков:это зависит от обстоятельств.

* Это зависит от того, нужно ли вам настраивать и сохранять сгенерированный код как артефакт.Например, люди очень редко сохраняют или настраивают объектный код, выводимый c-компилятором, потому что они знают, что могут воспроизводить его из исходного кода каждый раз.Я думаю, что здесь может быть аналогичная аналогия.* Это зависит от того, нужно ли вам сертифицировать код в соответствии с каким-либо стандартом, напримерМисра-С или ДО178.* Это зависит от того, будет ли исходный код генерироваться с помощью вашего инструмента каждый раз при компиляции кода, или он будет сохранен вами для включения в сборку позже.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top