Дублирование кода
Симптомы и признаки
Два фрагмента кода выглядят почти одинаковыми.
Причины появления
В большинстве случаев дублирование возникает тогда, когда в проекте работает несколько человек, причём над разными его частями. Они работают над похожими задачами, но не знают, что коллега уже написал похожий код, который можно использовать вместо написания своего.
Встречается и косвенное дублирование, когда конкретные участки кода отличаются внешне, хотя и выполняют одну и ту же задачу. Такое дублирование бывает довольно сложно обнаружить и исправить.
В отдельных случаях дублирование создаётся намеренно. Зачастую, в спешке, когда поджимают сроки сдачи проекта. Начинающий программист видит в уже написанном коде фрагмент, выглядящий «почти так, как нужно» и не может устоять перед соблазном просто скопировать код куда-то в другое место (и так десяток раз).
А в самых запущенных случаях программист просто слишком ленив, чтобы избавить код от дублирования.
Лечение
-
Один и тот же участок кода присутствует в двух методах одного и того же класса: необходимо применить извлечение метода и вызывать код созданного метода из обоих участков.
-
Один и тот же участок кода присутствует в двух подклассах, находящихся на одном уровне:
-
Необходимо применить извлечение метода для обоих классов с последующим подъёмом поля для полей, которые используются в поднятом методе.
-
Если общий код находится в конструкторе, следует использовать подъём тела конструктора.
-
Если участки кода похожи, но не совпадают полностью, нужно пользоваться созданием шаблонного метода.
-
Если оба метода делают одно и то же, но с помощью разных алгоритмов, можно выбрать более чёткий из этих алгоритмов и применить замещение алгоритма.
-
-
Дублирующийся код находится в двух разных классах:
-
Если эти классы не являются частью какой-то иерархии, следует использовать извлечение суперкласса, чтобы создать для интересующих классов один суперкласс, содержащий всю общую функциональность.
-
Если создание суперкласса нежелательно или невозможно, следует применить извлечение класса в одном классе, а затем использовать новый компонент в другом.
-
-
Присутсвует череда условных операторов, которые исполняют один и тот же код и отличаются только условиями, следует объединить эти операторы в один с общим условием с помощью объединения условных операторов, а также применить извлечение метода, чтобы вынести это условие в отдельный метод с понятным названием.
-
Один и тот же код выполняется во всех ветках условного оператора: необходимо вынести одинаковый код за пределы условного оператора с помощью объединения дублирующихся фрагментов в условных операторах.
Выигрыш
-
Объединение дублирующего кода позволяет улучшить структуру кода и уменьшить его объём.
-
Это, в свою очередь, ведёт к упрощению и удешевлению поддержки кода в будущем.
Не стоит трогать, если...
- В очень редких случаях объединение двух одинаковых участков кода может сделать код менее очевидным и понятным.