Должен ли сгенерированный код быть читаемым человеком? - PullRequest
6 голосов
/ 15 сентября 2008

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

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

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

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

Ответы [ 22 ]

16 голосов
/ 15 сентября 2008

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

6 голосов
/ 15 сентября 2008

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

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

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

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

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

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

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

3 голосов
/ 15 сентября 2008

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

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

2 голосов
/ 15 сентября 2008

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

2 голосов
/ 15 сентября 2008

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

1 голос
/ 15 сентября 2008

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

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

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

1 голос
/ 15 сентября 2008

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

1 голос
/ 15 сентября 2008

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

Нет абсолютно НИКАКОЙ причины НЕ делать человека разборчивым, так почему же в мире вы хотите это сделать?

-Adam

1 голос
/ 15 сентября 2008

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

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

0 голосов
/ 15 сентября 2008

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

...