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

Как фанатично вы устраняете дублирование кода?

Как вы фанатичны по поводу устранения дубликата кода?

Лично, всякий раз, когда я вижу повторяющийся код, либо в тестировании кода, либо в производстве, я стараюсь реорганизовать дублирование. Единственное исключение, которое я делаю:

  • Иногда сокращение дублирования очень минимальное, потому что недавно рефакторизованный метод имеет слишком много параметров, чтобы быть действительно полезным/читаемым.
  • Иногда в тестовом коде, когда в нескольких тестах используется один и тот же фрагмент кода, который на самом деле не является когерентным потоком, я оставляю только дублирование (но не всегда - в зависимости от размера дубликата).
4b9b3361

Ответ 1

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

Однако, как только я начну делать вторую копию, я переписываю все три, чтобы удалить дублирование. Это потому, что теперь он (по-моему) перешел от "одного" к "тренду". Скорее всего, я снова использую код, поэтому теперь стоит попытаться удалить дубликаты.

Я смущаюсь назвать процесс "рефакторинг", потому что это модное слово из лагеря XP, и я делал это еще в начале 80-х с FORTRAN и C.

Хорошая практика программирования нестареет (и, как правило, тоже модно).

Приветствия,

-Ричард

Ответ 2

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

Ответ 3

Как уже было сказано, я стараюсь жить по принципу "СУХОЙ", но я бы также сказал, что есть еще одно условие, когда я часто неохотно устраняю дублирование:

  • Не изменяйте код, для которого у вас нет (или не может экономически/практически не развиваться) unit test.

Этот набор тестов будет включать код вызова для любого извлеченного метода.

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

Ответ 4

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

Ответ 5

Я всегда стараюсь сначала подумать, почему этот код дублируется. В большинстве случаев ответ - ленивость/невежество/etc, и я рефакторинг. Но, время от времени, случай, когда дублирование действительно действителен, появляется. То, о чем я говорю здесь, - это два фрагмента кода, которые семантически не связаны друг с другом, но только произойдет, чтобы иметь ту же (или аналогичную) реализацию в настоящий момент. Рассмотрим, например, бизнес-правила для совершенно несвязанных (реальных) процессов. Правила могут быть равны на один день, а затем на следующий день один из них изменится. Вам лучше надеяться, что они не представлены одним и тем же фрагментом кода или не молятся, чтобы разработчик, выполняющий модификацию, мог определить, что происходит (модульные тесты, кто-нибудь?)).

Ответ 6

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

CloneDR находит дублирующий код, как точные копии, так и пропущенные, в больших системах источников, параметризованных синтаксисом langauge. Он поддерживает Java, С#, COBOL, С++, PHP и многие другие языки. Мы сами используем его, чтобы помочь управлять нашим собственным кодом.

Ответ 7

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

Ответ 8

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

Затем я начал свою текущую работу.

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

Итак, все они получили рефакторинг. И теперь я фанатик-обманщик.

Ответ 9

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

Ответ 10

Я считаю это самым важным индикатором хорошего программиста. Если вы можете написать полностью факторизованный код - тогда почти по определению это хороший код.

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

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

Ответ 11

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

Очевидно, нужно время от времени поддерживать чувство прагматизма, но я склоняюсь очень сильно к СУШЕ.

Ответ 12

С самого начала я был довольно фанатичен, но недавний опыт, вероятно, сделал меня еще больше, и дал мне еще один набор инструментов для использования. В частности, алгоритмы/концепции из биоинформатики. В новой позиции мы обновляем веб-интерфейс для использования макета с поддержкой CSS вместо таблиц, поэтому я анализирую 700 существующих JSP файлов. Я поместил все строки кода в базу данных и 100 тыс. Строк, менее 20 тыс. Были уникальными. Затем я представляю каждый файл как последовательность идентификаторов строк и нахожу общие подпоследовательности из 2 или более строк; самая длинная была почти 300 строк, дублированных между двумя файлами JSP и вопиющим случаем сокращения и прошлого. То, что я сейчас стою, но мой следующий план состоит в том, чтобы повторно представлять файлы в виде последовательности line_id OR (common) substence_id, сортировать их, а затем выполнять сравнение версий файлов, смежных друг с другом в порядке сортировки, Levenshtein. Это должно помочь в нечетком сопоставлении файлов, которые не только содержат общие подпоследовательности, но и подпоследовательности, которые отключены одним и тем же.

Ответ 13

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

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

Ответ 14

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

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

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

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

С другой стороны, я задаюсь вопросом, может ли я быть QA guy Zig ссылаться на; -)

Ответ 15

Так как дублирование придает копию-вставке, я всегда стараюсь избегать дублирования или рефакторинга, где уже существует дублирование в существующем коде.

Ответ 16

Нормализовать код, нормализовать переменные, нормализовать базу данных, нормализовать корпоративную иерархию, нормализовать правительство...

Ответ 17

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

Пример: При управлении запасами минимальное количество товара для товара равно количеству в вашем рабочем резерве плюс количество в запасе безопасности. Запасы безопасности равны половине рабочего резерва.

Function workingReserve(itemCode, someDate)
     ' Inside here is a looping structure that adds up the requirements for the next six weeks (because that how long it takes between reorder and receipt).
End Function

Function safetyStock(itemCode, someDate)
    safetyStock = workingReserve(itemCode, someDate) / 2
End Function

Function minimumOnHand(itemCode, someDate)
    minimumOnHand = workingReserve(itemCode, someDate) + safetyStock(itemCode, someDate)
End Function

Извиняюсь, что это написано в VB, но это из функции Excel VBA.

По сути, функция workingReserve работает дважды на одних и тех же данных. Эффективность может быть улучшена путем объединения бизнес-логики функции safeStock() в функции minimumOnHand().

Function minimumOnHand(itemCode, someDate)
    minimumOnHand = workingReserve(itemCode, someDate) * 1.5
End Function

В реальном коде у меня есть комментарии в коде, объясняющем бизнес-логику, но опустив их здесь для краткости.