Задачі узагальнення объектів

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

Підйом поля

Проблема: Два класи мають одне і те ж поле.

Рішення: Перемістіть поле в суперклас, прибравши його з підкласів.

Підйом методу

Проблема: Підкласи мають методи, які роблять схожу роботу.

Рішення: В цьому випадку треба зробити методи ідентичними, а потім перемістити їх в суперклас.

Підйом тіла конструктора

Проблема: Підкласи мають конструктори з переважно однаковим кодом.

Рішення: Створіть конструктор в суперкласі і винесіть в нього спільний для підкласів код. Викликайте конструктор суперкласу в конструкторах підкласу.

Спуск методу

Проблема: Поведінка, реалізована в суперкласі, використовується тільки одним або декількома підкласами.

Рішення: Перемістіть цю поведінку в підкласи.

Спуск поля

Проблема: Поле використовується тільки в деяких підкласах.

Рішення: Перемістіть поле в ці підкласи.

Витягання підкласу

Проблема: Клас має фічи, які використовуються тільки в певних випадках.

Рішення: Створіть підклас і використовуйте його в цих випадках.

Відокремлення суперкласу

Проблема: У вас є два класи із схожими полями і методами.

Рішення: Створіть для них спільний суперклас і перенесіть туди схожі поля і методи.

Відокремлення інтерфейсу

Проблема: Декілька клієнтів користуються однією і тією ж частиною інтерфейсу класу. Або в двох класах частина інтерфейсу виявилася спільною.

Рішення: Виділіть цю спільну частину в свій власний інтерфейс.

Згортання ієрархії

Проблема: У вас є деяка ієрархія класів, в якій підклас мало чим відрізняється від суперкласу.

Рішення: Злийте підклас і суперклас воєдино.

Створення шаблонного методу

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

Рішення: Винесіть структуру алгоритму і однакові кроки в суперклас, а в підкласах залиште реалізацію кроків, що відрізняються.

Заміна наслідування делегуванням

Проблема: У вас є підклас, який використовує тільки частину методів суперкласу або не хоче наслідувати його дані.

Рішення: Створіть поле і помістіть в нього об'єкт суперкласу, делегуйте виконання методів объекту-суперклассу, приберіть наслідування.

Заміна делегування наслідуванням

Проблема: Клас містить безліч простих делегуючих методів до усіх методів іншого класу.

Рішення: Зробіть клас спадкоємцем делегата, що після чого делегують методи втратять сенс.

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

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

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

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