Дублирование кода
Дублирование кода — явление в программировании, при котором некоторые участки исходного кода могут встречаться более чем однажды, как внутри одной, так и в нескольких программных сущностях. Является симптомом так называемого «дурно пахнущего кода». В первую очередь потому, что увеличивается его длина; именно из-за дублирования, а не из-за совпадений.
Причины появления
В большинстве случаев дублирование возникает тогда, когда в проекте работает несколько человек, причём над разными его частями. Они работают над похожими задачами, но не знают, что коллега уже написал похожий код, который можно использовать вместо написания своего.
Встречается и косвенное дублирование, когда конкретные участки кода отличаются внешне, хотя и выполняют одну и ту же задачу. Такое дублирование бывает довольно сложно обнаружить и исправить.
В отдельных случаях дублирование создаётся намеренно. Зачастую, в спешке, когда поджимают сроки сдачи проекта. Начинающий программист видит в уже написанном коде фрагмент, выглядящий «почти так, как нужно» и не может устоять перед соблазном просто скопировать код куда-то в другое место (и так десяток раз).
А в самых запущенных случаях программист просто слишком ленив, чтобы избавить код от дублирования.
Проблемы
Дублирование кода является признаком «низкого» или «ленивого» стиля программирования. Хороший стиль программирования обычно основан на повторном использовании кода. Может казаться, что использование дубликатов позволит несколько ускорить процесс создания программы, так как программисту не нужно будет задумываться над тем, как код уже используется и как он может использоваться в дальнейшем. Однако, проблема заключается в том, что написание кода — это лишь скромная часть жизненного цикла продукта, и дальнейшее сопровождение кода с дубликатами будет слишком осложнено. Проблемы, к которым приводит дублирование кода:
- большое количество кода: дублирование часто приводит к созданию длинных, повторяющихся последовательностей кода, которые отличаются лишь несколькими строками или символами, что в итоге затрудняет понимание программы;
- скрытое значение: трудно уловить разницу в повторяющихся участках кода и поэтому становится тяжелее понимать, для чего именно предназначен тот или иной кусок кода;
- аномалии обновления: при обновлении дублированного кода необходимо обновить несколько аналогичных участков, что сильно увеличивает затраты на обслуживание;
- размер исходного текста: без применения какого-либо сжатия исходный текст занимает больше места.
Пример
Следующий фрагмент кода вычисляет среднее значение массива целых чисел.
extern int array1[]; extern int array2[]; int sum1 = 0; int sum2 = 0; int average1; int average2; int i; for (i = 0; i < 4; ++i) sum1 += array1[i]; average1 = sum1/4; for (i = 0; i < 4; ++i) sum2 += array2[i]; average2 = sum2/4;
В нём два цикла могут быть выделены в отдельную функцию:
int calcAverage (int* Array_of_4) { int sum = 0; for (int i = 0; i < 4; ++i) sum += Array_of_4[i]; return sum/4; }
Использование этой функции избавит код от дубликатов:
extern int array1[]; extern int array2[]; int average1 = calcAverage(array1); int average2 = calcAverage(array2);