Autumn SALE

Дублирование кода

Также известен как: Duplicate Code

Симптомы и признаки

Два фрагмента кода выглядят почти одинаковыми.

Причины появления

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

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

В отдельных случаях дублирование создаётся намеренно. Зачастую, в спешке, когда поджимают сроки сдачи проекта. Начинающий программист видит в уже написанном коде фрагмент, выглядящий «почти так, как нужно» и не может устоять перед соблазном просто скопировать код куда-то в другое место (и так десяток раз).

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

Лечение

  • Один и тот же участок кода присутствует в двух методах одного и того же класса: необходимо применить извлечение метода и вызывать код созданного метода из обоих участков.

  • Один и тот же участок кода присутствует в двух подклассах, находящихся на одном уровне:

  • Дублирующийся код находится в двух разных классах:

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

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

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

  • Один и тот же код выполняется во всех ветках условного оператора: необходимо вынести одинаковый код за пределы условного оператора с помощью объединения дублирующихся фрагментов в условных операторах.

Выигрыш

  • Объединение дублирующего кода позволяет улучшить структуру кода и уменьшить его объём.

  • Это, в свою очередь, ведёт к упрощению и удешевлению поддержки кода в будущем.

Не стоит трогать, если...

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