Как фанатично Вы устраняете Дублирование Кода? [закрытый]

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

CREATE OR REPLACE FUNCTION in_sort(anyarray, out id anyelement, out ordinal int)
LANGUAGE SQL AS
$$
    SELECT $1[i], i FROM generate_series(array_lower($1,1),array_upper($1,1)) i;
$$;

SELECT 
    * 
FROM 
    comments c
    INNER JOIN (SELECT * FROM in_sort(ARRAY[1,3,2,4])) AS in_sort
        USING (id)
ORDER BY in_sort.ordinal;
24
задан 2 revs 23 August 2009 в 11:52
поделиться

17 ответов

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

0
ответ дан rmeador 28 November 2019 в 22:14
поделиться

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

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

я смущаюсь называть процесс "рефакторингом", потому что это - модное словечко от лагеря XP, и я делал этот назад в начале 80-х с ФОРТРАНОМ и C.

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

С наилучшими пожеланиями,

-Richard

17
ответ дан 2 revs, 2 users 95% 28 November 2019 в 22:14
поделиться

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

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

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

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

Вообще-то, если задуматься, интересно, могу ли я быть , Крутой поворот парня QA относится к;-)

1
ответ дан 2 revs 28 November 2019 в 22:14
поделиться

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

1
ответ дан rich 28 November 2019 в 22:14
поделиться

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

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

1
ответ дан Echostorm 28 November 2019 в 22:14
поделиться

Я был довольно фанатичен для начала, но недавний опыт, вероятно, сделал меня больше и дал мне другой набор инструментов для использования. А именно, алгоритмы/понятия от биоинформатики. В новом положении мы обновляем веб-UI для использования CSS управляемое расположение вместо таблиц, таким образом, я анализирую 700 существующих файлов JSP. Я поместил все строки кода в базу данных и 100K общих строк, меньше, чем 20K были уникальны. Тогда я представляю каждый файл как последовательность идентификаторов строки и нахожу общие подпоследовательности 2 или больше строк; самыми длинными были почти 300 строк, дублированных между несколькими файлами JSP и вопиющим случаем сокращения и мимо. Это - то, где я стою теперь, но мой следующий план состоит в том, чтобы повторно представить файлы как последовательность ИЛИ (общего) subsequence_id line_id, отсортировать их, и затем выполнить сравнение Levenshtein файлов, непрерывных друг другу в порядке сортировки. Это должно помочь в нечетком соответствии файлов, которые не только содержат общие подпоследовательности, но и подпоследовательности, которые выключены одним и таким.

1
ответ дан George Jempty 28 November 2019 в 22:14
поделиться

ОЧЕНЬ. Насколько я заинтересован почти все наши подсказки по разработке, высказывания и основу "лучших практик" от принципа не повторяющегося кода и создания его допускающий повторное использование. MVC, декоратор, ООП и т.д. и т.д.

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

2
ответ дан Quibblesome 28 November 2019 в 22:14
поделиться

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

кажется, что почти все другие практики программирования являются просто способами получить Ваш DRY кода.

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

2
ответ дан Bill K 28 November 2019 в 22:14
поделиться

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

4
ответ дан Sara Chipps 28 November 2019 в 22:14
поделиться

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

Тогда я запустил свое текущее задание.

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

Так, ЧТО все были пересмотрены. И теперь я - фанатик удаления простофили.

4
ответ дан Electrons_Ahoy 28 November 2019 в 22:14
поделиться

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

7
ответ дан Eyvind 28 November 2019 в 22:14
поделиться

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

13
ответ дан JaredPar 28 November 2019 в 22:14
поделиться

Как был сказан, я пытаюсь жить принципом "DRY" - но я также сказал бы, что существует другое условие, где я часто отказываюсь устранить дублирование:

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

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

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

14
ответ дан Ken Gentle 28 November 2019 в 22:14
поделиться

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

15
ответ дан Nerdfest 28 November 2019 в 22:14
поделиться

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

4
ответ дан 2 revs, 2 users 67% 28 November 2019 в 22:14
поделиться

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

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

5
ответ дан 28 November 2019 в 22:14
поделиться

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

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

Function workingReserve(itemCode, someDate)
     ' Inside here is a looping structure that adds up the requirements for the next six weeks (because that's 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.

Функция рабочей силы работает дважды на одних и тех же данных. Производительность может быть улучшена путем объединения бизнес-логики функции SafetyStock () в функции Minmistonhand ().

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

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

0
ответ дан 28 November 2019 в 22:14
поделиться