Недавно я нашел хороший ответ на свой вопрос в «Чистом коде» дяди Боба, которым хочу поделиться. Он различает три типа дублирования
Части идентичного кода должны быть заменены одним методом. Таким образом, исправление будет состоять в том, чтобы извлечь метод и делегировать обычное поведение.
- в том же методе выполните Извлечение локальной переменной и повторно используйте ее.
- в том же классе выполнить рефакторинг Extract Method.
- в классах той же иерархии Извлечь метод и потянуть его. Иерархия может быть создана, чтобы найти место для методов.
- в классах отдельных иерархий используют делегирование новым объектам.
- Если методы не нуждаются в каком-либо включающем состоянии, тогда может быть применен шаблон «lib» (это контейнер для статических методов, обычно вызываемых
SthUtil
или SthLib
).
случаи switch/case
и if/else
которые всегда проверяют один и тот же набор условий .
- Их следует заменить полиморфизмом.
Модули, которые реализуют аналогичные алгоритмы . Их труднее всего найти, поскольку их не может обнаружить ни один клон-детектор.
- Так как область применения больше, используются шаблоны дизайна. Шаблонный шаблон Метод проектирования может применяться для алгоритмов внутри иерархии классов.
- Шаблон разработки стратегии может применяться для любого алгоритма, который используется в разных местах.
Также допустимый момент, упомянутый Одедом, при работе с разными версиями библиотек
- консолидировать на одной версии. Шаблон дизайна фасада может помочь здесь.
В конце концов, лучшее предложение, чтобы ответить на мой вопрос:
Метод повторного использования кода, используемый в ОО-языках, - это объекты.