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

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

Проблема

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

Рішення

Створіть новий клас, який би містив ці методи, і зробіть його спадкоємцем службового класу, або його обгорткою.
До
Introduce Local Extension - Before
Після
Introduce Local Extension - After

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

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

У вас є два шляхи:

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

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

Переваги

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

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

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

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

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

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

Замучились читати?

Збігайте за подушкою, в нас тут контенту приблизно на 7 годин читання.

Або спробуйте наш новий інтерактивний курс з рефакторингу. Він більш інформативний та набагато цікавіший за банальний тест.

Дізнатися більше...

Живий приклад

Перший раз у нас? Нічого страшного!

У нас тут все просто – цей інтерактивний приклад дуже схожий на відео (хоча й виглядає набагато крутіше).

  1. Натискаєте велику кнопку "Почати", а далі слідуєте усім підказкам.
  2. Ви можете перемотувати програвання, використовуючи стрілки зліва.
  3. Окрім того, ви можете подивитися різницю між стартовим та отриманим кодом, натиснувши кнопку ока ().
  4. Кнопка компіляції та тестування () дає змогу перевірити код на наявність помилок.