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