Витяг підкласу
Клас має фічі, які використовуються лише у певних випадках.
Створіть підклас та використовуйте його у цих випадках.
Причини рефакторингу
В основному класі знаходяться методи та поля для реалізації якогось рідкісного випадку використання класу. Цей випадок, хоч і дуже рідкісний, є частиною обов'язків класу, тому всі пов'язані з ним поля та методи неправильно було б винести абсолютно інший клас. Але, з іншого боку, їх можна винести до підкласу за допомогою цього рефакторингу.
Переваги
Створити підклас досить легко та швидко.
Можна виділити кілька різних підкласів, якщо основний клас реалізує кілька особливих випадків.
Недоліки
Незважаючи на всю очевидну простоту, Спадкування може завести вас у глухий кут, якщо доведеться виділити кілька різних ієрархій класів. Наприклад, якщо у вас був клас Собаки, поведінка якого відрізняється залежно від розміру та довжини вовни собак. Ви виділили з нього дві ієрархії:
за розміром: Великі , Середні та Маленькі
по довжині вовни: Гладкошерсті та Довгошерсті
І все б добре, але у вас почнуться проблеми, коли потрібно буде створити одночасно Великий і Гладкошерст собаку, так як об'єкт можна створити лише з одного класу. З іншого боку, цю проблему можна обійти, використовуючи Композицію замість успадкування (див. Патерн Стратегія). Іншими словами, клас Собака матиме два поля-компоненти — розмір та довжину вовни. У ці поля ви підставлятимете об'єкти-компоненти необхідних класів. Наприклад, ви зможете створити Собаку, що має Великий Розмір і Довгу Шерсть.
Порядок рефакторингу
Створіть новий підклас з класу, що вас цікавить.
Якщо для створення об'єктів із підкласупотрібні будуть якісь додаткові дані, створіть конструктор і доповніть його потрібними параметрами. Не забудьте викликати батьківську реалізацію конструктора.
Знайдіть усі виклики конструктора батьківського класу. У випадках, коли потрібна функціональність підкласу, замініть батьківський конструктор конструктором підкласу.
Перемістіть потрібні методи та поля з батьківського класу до підкласу. Використовуйте для цього спуск методу та спуск поля. Найпростіше розпочинати перенесення з методів. Так поля будуть доступні їм весь час: з батьківського класу до перенесення, і з підкласу після закінчення перенесення.
Після того, як підклас готовий, знайдіть усі старі поля, які керували тим, який набір функцій повинен виконуватись. Ці поля можна видалити, замінивши поліморфізм всі умовні оператори, в яких вони використовувалися. Простий приклад - у вас у класі Авто було поле isElectricCar , і залежно від нього, в методі refuel() в машину або заливається бензин, або заряджається електрика. В результаті рефакторингу, поле isElectricCar буде видалено, а класи Автомобіль та ЕлектроАвтомобіль будуть мати свої реалізації методу refuel() .
Збігайте за подушкою, у нас тут контенту на 7 годин читання.
Або спробуйте наш інтерактивний курс. Він набагато цікавіший, ніж банальний текст.
Цей рефакторинг - мала частина інтерактивногоонлайн курсу з рефакторингу.