Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!

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

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

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

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

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

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

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

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

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

Лечение

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

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

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

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

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

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

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

Выигрыш

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

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

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

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