Нещодавно я знайшов хорошу відповідь на своє запитання у «Чистому коді» дядька Боба, яким хочу поділитися. Він розрізняє три типи дублювання
Шматки однакового коду слід замінити єдиним методом. Таким чином, виправленням було б вилучення методу та делегування загальній поведінці.
- тим же методом виконайте Extract Local Variable і повторно використовуйте його.
- в цьому ж класі виконують метод рефакторингу Extract Method.
- в класах тієї ж ієрархії Метод вилучення та витягніть його вгору. Для створення місця для методів може бути створена ієрархія.
- у класах окремих ієрархій використовують делегування на нові об’єкти.
- Якщо для методів не потрібен який-небудь закриваючий стан, тоді може бути застосований шаблон "lib" (тобто контейнер для статичних методів, як правило, називається
SthUtil
або SthLib
).
випадки switch/case
і if/else
що завжди випробування для того ж набору умов .
- Їх слід замінити поліморфізмом.
Модулі, що реалізують подібні алгоритми . Їх найважче знайти, оскільки жоден детектор клонів не може їх знайти.
- Оскільки сфера застосування більша, використовуються дизайнерські малюнки. Шаблон дизайну методу шаблону може бути застосований для алгоритмів всередині ієрархії класів.
- Шаблон дизайну стратегії може застосовуватися для будь-якого алгоритму, який використовується в різних місцях.
Також дійсна точка, згадана Одедом, при роботі з різними версіями бібліотек
- консолідуватись за єдиною версією. Тут може допомогти модель дизайну фасадів.
Зрештою, найкраще одне речення, щоб відповісти на моє запитання - це стимулами:
метод повторного використання коду, що використовується в мовах ОО, - це об'єкти.