Переміщення функцій між об'єктами
Якщо ви розмістили функціональність по класах не найвдалішим чином - це ще не привід впадати у відчай.
Рефакторинги цієї групи показують як безпечно переміщати функціональність з одних класів в інші, створювати нові класи, а також приховувати деталі реалізації з публічного доступу.
Проблема: Метод використовується в іншому класі більше, ніж у власному.
Рішення: Створіть новий метод в класі, який використовує його більше інших, і перенесіть туди код із старого методу. Код оригінального методу перетворіть на звернення до нового методу в іншому класі або приберіть його взагалі.
Проблема: Поле використовується в іншому класі більше, ніж у власному.
Рішення: Створіть поле в новому класі і перенаправляйте до нього всіх користувачів старого поля.
Проблема: Один клас працює за двох.
Рішення: Створіть новий клас, перемістіть в нього поля і методи, що відповідають за певну функціональність.
Проблема: Клас майже нічого не робить, ні за що не відповідає, і ніякої відповідальності для цього класу не планується.
Рішення: Перемістіть усі фічі з цього класу в інший.
Проблема: Клієнт отримує об’єкт B з поля або методу об’єкта А. Потім клієнт викликає якийсь метод об’єкта B.
Рішення: Створіть новий метод в класі А, який би делегував виклик об’єкта B. Таким чином, клієнт перестане знати про клас В і залежати від нього.
Проблема: Клас має занадто багато методів, які просто делегують роботу іншим об’єктам.
Рішення: Видаліть ці методи і змусьте клієнта викликати кінцеві методи безпосередньо.
Проблема: Службовий клас не містить методу, який вам потрібен, при цьому у вас немає можливості додати метод в цей клас.
Рішення: Додайте метод в клієнтський клас і передавайте в нього об’єкт службового класу в якості аргументу.
Проблема: В службовому класі відсутні деякі методи, які вам потрібні. При цьому додати їх в цей клас ви не можете.
Рішення: Створіть новий клас, який би містив ці методи, і зробіть його спадкоємцем службового класу, або його обгорткою.