Також відомий як: Introduce Local Extension

Рефакторинг Введення локального розширення

Проблема

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

Рішення

Створіть новий клас, який би містив ці методи, і зробіть його спадкоємцем службового класу, або його обгорткою.

До
Introduce Local Extension - Before
Після
Introduce Local Extension - After

Причини рефакторингу

В класі, який ви використовуєте, немає потрібних вам методів. Або ще гірше — ви не можете їх туди додати (наприклад, тому що класи знаходяться в сторонній бібліотеці). У вас є два шляхи:

  • Створити підклас з класу, що цікавить, у якому будуть знаходитись нові методи, і який унаслідує все інше з батьківського класу. Цей шлях простіший, але іноді буває заблокований в самому службовому класі за допомогою директиви final.

  • Створити клас-обгортку, у якому будуть знаходитись усі нові методи, а решту він буде делегувати пов'язаному об'єкту службового класу. Цей шлях більш складний, оскільки вам треба буде написати не лише код підтримки зв'язку між обгорткою і службовим об'єктом, але і велику кількість простих делегуючих методів, які будуть емулювати публічний інтерфейс службового класу.

Переваги

  • Якщо додаткові методи розміщуються в окремому класі-розширенні (в обгортці або підкласі), ви не засмічуєте клієнтські класи кодом, який їм не належить по сенсу. Цим підвищується зв'язність компонентів програми і можливість їх повторного використання.

Порядок рефакторингу

  1. Створіть новий клас-розширення:

    • або зробіть його спадкоємцем службового класу;

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

  2. Створіть конструктор, що використовує параметри конструктору службового класу.

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

  4. Створіть в класі нові розширені методи. Перемістіть в нього зовнішні методи з інших класів, або видаліть їх, якщо розширення вже має такий функціонал.

  5. Замініть використання службового класу новим класом-розширенням в тих місцях, де потрібна розширена функціональність.