Дублювання коду
Симптоми і ознаки
Два фрагменти коду виглядають майже однаковими.
Причини появи
У більшості випадків дублювання виникає тоді, коли в проекті працюють декілька авторів, причому над різними його частинами. Вони працюють над схожими задачами, але не знають, що колега вже написав схожий код, який можна використати замість написання свого.
Зустрічається і непряме дублювання, коли конкретні ділянки коду відрізняються зовні, хоча і виконують одну і ту ж задачу. Таке дублювання буває досить складно виявити і виправити.
В окремих випадках дублювання створюється навмисно. Найчастіше в поспіху, коли строки здачі проекту горять. Програміст-початківець бачить у вже написаному коді «майже такий, як треба» фрагмент, і не може встояти від спокуси просто скопіювати його як є і вставити десь в іншому місці (і так десяток разів).
В інших випадках програміст просто занадто ледачий, щоби позбавити код від дублювання.
Лікування
-
Одна і та ж ділянка коду присутня в двох методах одного і того ж класу: необхідно застосувати відокремлення методу, після чого викликати код створеного методу з обох ділянок.
-
Одна і та ж ділянка коду присутня в двох підкласах, що знаходяться на одному рівні:
-
Необхідно застосувати відокремлення методу для обох класів з подальшим підйомом поля для полів, які використовуються в піднятому методі.
-
Якщо спільний код знаходиться в конструкторі, слід використати підйом тіла конструктора.
-
Якщо ділянки коду схожі, але не співпадають повністю, треба користуватися створення шаблонного методу.
-
Якщо обидва методи роблять одне і те ж, але за допомогою різних алгоритмів, можна вибрати чіткіший з цих алгоритмів і застосувати заміщення алгоритму.
-
-
Код, що дублюється, знаходиться в двох різних класах:
-
Якщо ці класи не є частиною якоїсь ієрархії, слід використати відокремлення суперкласу, щоб створити для цих класів один суперклас, що містить усю спільну функціональність.
-
Якщо створення суперкласу небажане або неможливе, слід застосувати відокремлення класу в одному класі, а потім використати новий компонент в іншому.
-
-
Якщо присутня низка умовних операторів, які виконують один і той же код і відрізняються тільки умовами, слід об’єднати ці оператори в один із загальною умовою за допомогою об’єднання умовних операторів, а також застосувати відокремлення методу, щоб винести цю умову в окремий метод із зрозумілою назвою.
-
Однаковий код виконується в усіх гілках умовного оператора: необхідно винести однаковий код за межі умовного оператора за допомогою об’єднання фрагментів з дублюванням коду в умовних операторах.
Виграш
-
Об’єднання коду, що дублюєтся, дозволяє поліпшити структуру коду і зменшити його об’єм.
-
Це, у свою чергу, веде до спрощення і здешевлення підтримки коду в майбутньому.
Не варто чіпати, якщо...
- В окремих випадках об’єднання двох однакових ділянок коду може зробити код менш очевидним і зрозумілим.