Как фанатично вы устраняете дублирование кода?
Как вы фанатичны по поводу устранения дубликата кода?
Лично, всякий раз, когда я вижу повторяющийся код, либо в тестировании кода, либо в производстве, я стараюсь реорганизовать дублирование. Единственное исключение, которое я делаю:
- Иногда сокращение дублирования очень минимальное, потому что недавно рефакторизованный метод имеет слишком много параметров, чтобы быть действительно полезным/читаемым.
- Иногда в тестовом коде, когда в нескольких тестах используется один и тот же фрагмент кода, который на самом деле не является когерентным потоком, я оставляю только дублирование (но не всегда - в зависимости от размера дубликата).
Ответы
Ответ 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
В реальном коде у меня есть комментарии в коде, объясняющем бизнес-логику, но опустив их здесь для краткости.