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

Сколько дублированного кода вы терпите?

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

Я знаю, что DRY - это руководство, а не абсолютное правило. Но в целом, готовы ли вы болеть читабельность от имени DRY?

4b9b3361

Ответ 1

Рефакторинг: улучшение дизайна существующего кода

Правило трех

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

Три удара и рефакторинг.


Кодеры на работе

Seibel: Итак, для каждого из этих XII-вызовов вы пишете осуществление.
Вы когда-нибудь находили, что накапливали много биты очень похожего кода?

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

Ответ 2

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

Говоря о том, что это ухудшит читаемость, можно только предположить, что вы плохо набираете имена: -)

Ответ 3

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

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

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

Ответ 4

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

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

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

Инструмент, который может надежно найти клоны, по крайней мере, может помешать вам избежать ошибок обслуживания клонирования с ошибкой. Одним из таких инструментов (я автор) является CloneDR. CloneDR находит клоны, используя целевую структуру langauge в качестве руководства, и, таким образом, находит клоны независимо от макета пробелов, изменений в комментариях, переименованных переменных и т.д. (Он реализуется для числа языков, включая C, С++, Java, С#, COBOL и PHP). CloneDR найдет клоны в больших системах, не давая никаких указаний. Показаны выявленные клоны, а также антивоунитель, который по существу является абстракцией, которую вы могли бы написать вместо этого. Версии его (для COBOL) теперь интегрируются с Eclipse и показывают вам, когда вы редактируете внутри клона в буфере, а также где находятся другие клоны, чтобы вы могли проверять/пересматривать другие, пока вы там. (Одна вещь, которую вы можете сделать, это реорганизовать их:).

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

Ответ 5

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

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

Это ваш код, с вашими стандартами, но мой основной ответ на ваш вопрос "сколько?" нет...

Ответ 6

вы не сказали, на каком языке, но в большинстве IDE это простой метод Refactor → Extract. Насколько это проще, и один метод с некоторыми аргументами гораздо удобнее, чем два блока дублированного кода.

Ответ 7

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

Ответ 8

Точка DRY - это ремонтопригодность. Если код сложнее понять, его сложнее поддерживать, поэтому, если рефакторинг ушибит читаемость, вы, возможно, не сможете выполнить СУШУЮ цель. Для менее 15 строк кода я был бы склонен согласиться с вашим одноклассником.

Ответ 9

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

Часто дублирование кода LOGIC происходит, когда два объекта с разными базовыми классами имеют сходство в том, как они работают. Например, два компонента GUI отображают значения, но не реализуют общий интерфейс для доступа к этому значению. Рефакторинг такой системы требует либо методов, содержащих более общие объекты, чем необходимо, с последующей проверкой меток и кастингом, иначе иерархия классов должна быть переосмыслена и реструктурирована.

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

Ответ 10

В общем, нет. В любом случае, для удобства чтения. Всегда есть способ реорганизовать дублированный код в намерение, раскрывающее общий метод, который читается как книга, ИМО.

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

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

ВН

Ответ 11

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

Лучшая строка кода - это строка кода, не написанная.

Ответ 12

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

Ответ 13

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

Как говорится, здесь есть проблемы.

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

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