Дублирование кода (Duplicate Code)

4471

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

Симптомы и признаки дублирование кода

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

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

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

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

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

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

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

Лечение

  • Один и тот же участок кода присутствует в двух методах одного и того же класса: необходимо применить извлечение метода и вызывать код созданного метода из обоих участков.
Один и тот же участок кода присутствует в двух методах одного и того же класса:
Один и тот же участок кода присутствует в двух методах одного и того же класса:
  • Один и тот же участок кода присутствует в двух подклассах, находящихся на одном уровне:
    • Необходимо применить извлечение метода для обоих классов с последующим подъёмом поля для полей, которые используются в поднятом методе.
    • Если общий код находится в конструкторе, следует использовать подъём тела конструктора.
    • Если участки кода похожи, но не совпадают полностью, нужно пользоваться созданием шаблонного метода.
    • Если оба метода делают одно и то же, но с помощью разных алгоритмов, можно выбрать более чёткий из этих алгоритмов и применить замещение алгоритма.
  • Дублирующийся код находится в двух разных классах:
    • Если эти классы не являются частью какой-то иерархии, следует использовать извлечение суперкласса, чтобы создать для интересующих классов один суперкласс, содержащий всю общую функциональность.
    • Если создание суперкласса нежелательно или невозможно, следует применить извлечение класса в одном классе, а затем использовать новый компонент в другом.
  • Присутсвует череда условных операторов, которые исполняют один и тот же код и отличаются только условиями, следует объединить эти операторы в один с общим условием с помощью объединения условных операторов, а также применить извлечение метода, чтобы вынести это условие в отдельный метод с понятным названием.
  • Один и тот же код выполняется во всех ветках условного оператора: необходимо вынести одинаковый код за пределы условного оператора с помощью объединения дублирующихся фрагментов в условных операторах.

Выигрыш

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

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

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

Источник https://refactoring.guru/