атака клонів

Атака клонів. Як боротися з дублюванням коду? +15

  • 08.08.17 12:57 •
  • crazy_llama •
  • # 335172 •
  • Хабрахабр •
  • З пісочниці •
  • 7 •
  • 9000

- такий же як Forbes, тільки краще.

Незважаючи на те, що проблеми, пов'язані з дублюванням коду, згадуються досить часто, актуальність цих проблем з року в рік залишається майже незмінною. У багатьох популярних проектах кількість клонів вимірюється сотнями або навіть тисячами.

атака клонів

Звідки беруться клони?

Можна виділити наступні основні причини виникнення клонів:

Чи потрібно боротися з клонами?

З одного боку, дубльований код має низку очевидних недоліків. Такий код важче змінювати і розвивати, через дублікатів збільшується розмір проекту і ускладнюється його розуміння. Крім того, при копіюванні також виникають ризики поширення помилок з вихідних фрагментів.

З іншого боку, видалення дублікатів також може привести до помилок, особливо, якщо для цього необхідно вносити суттєві зміни в текст програми. Однак головним аргументом проти видалення клонів є те, що таке видалення часто призводить до збільшення числа залежностей. Досить цікаво про це написано в статті "Redundancy vs dependencies: which is worse?".

З моєї точки зору, клони є ознакою не надто якісного вихідного коду і, відповідно, тягнуть за собою ті ж проблеми. На жаль, їх не завжди можна ефективно видалити, та й не завжди саме вони є справжньою проблемою. У деяких випадках вони можуть вказувати на невдалий вибір архітектури або на надмірну захаращеність функції.

В кінцевому рахунку, видаляти клони чи ні - залежить від конкретної ситуації. Однак, в будь-якому випадку, дубльований код - це завжди привід задуматися.

Інструменти для пошуку клонів

На жаль, в основному ці інструменти не інтегровані з середовищем розробки. Відсутність інтеграції значно ускладнює навігацію і рефакторинг клонів. При цьому, інструментів, вбудованих в середу розробки, виявляється не так багато. Наприклад, в разі IntelliJ IDEA вибір варто тільки між стандартними інспекціями і двома плагінами (PMD і Duplicate Detector).

Основні можливості плагіна Duplicate Detector:


  • Аналіз коду на льоту (під час редагування)
  • Аналіз проектів промислового масштабу (з мільйонами рядків коду)
  • Зручна навігація і порівняння дублікатів
  • Підтримка мов Java і Kotlin

Для чого може стане в нагоді інструмент виявлення клонів?

  • Для роботи з legacy кодом
  • Для зручного code review
  • Для відстеження клонів, які не можна видалити
  • Для рефакторінга, якщо Ви використовуєте методологію, схожу з XP

рефакторинг клонів

По суті, існує лише один спосіб видалення клонів - узагальнити схожу функціональність. Для цього можна створити допоміжний метод або клас, або спробувати виразити один дублікат через інший. При цьому не варто забувати, що рефакторинг робиться для підвищення якості коду. Тому до нього краще підходити творчо, так як іноді проблема може бути ширше або вже, або взагалі полягати в чомусь іншому.

Давайте розглянемо декілька конкретних прикладів з популярного фреймворку Spring. Для цього скористаємося середовищем розробки IntelliJ IDEA і плагіном Duplicate Detector.

Можливості середовища розробки і плагіна

Середовище розробки IntelliJ IDEA і плагін Duplicate Detector надають безліч можливостей, які спростять рефакторинг клонів. Наприклад, досить багато функцій можна знайти в контекстному меню Refactor або в підказках до інспекцій коду (Alt + Enter в рамках інспекції).

Показати панель порівняння дублікатів

атака клонів

атака клонів

Узагальнити фрагмент у вигляді методу

Схожі статті