Autumn SALE

Заміна підкласу полями

Також відомий як: Replace Subclass with Fields

Проблема

У вас є підкласи, які відрізняються тільки методами, що повертають дані-константи.

Рішення

Замініть методи полями в батьківському класі і видаліть підкласи.

До
Replace Subclass with Fields - Before
Після
Replace Subclass with Fields - After

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

Буває так, що вам треба розгорнути дію рефакторингу позбавлення від кодування типу.

В одному з подібних випадків ієрархія підкласів може відрізнятися тільки значеннями, які повертають певні методи. Причому ці значення не є результатом обчислення, а жорстко прописані або в самих методах, або в полях, які повертають методи. Щоб спростити архітектуру класів, така ієрархія може бути згорнута в один клас, що містить одне або декілька полів з потрібними значеннями залежно від ситуації.

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

Переваги

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

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

  1. Застосуйте до підкласів заміну конструктора фабричним методом.

  2. Якщо якийсь код посилається на підкласи, замініть його використанням суперкласу.

  3. Оголосіть в суперкласі поля для зберігання значень кожного з методів підкласів, що повертають константні значення.

  4. Створіть захищений конструктор суперкласу для ініціалізації нових полів.

  5. Створіть або модифікуйте наявні конструктори підкласів, щоб вони викликали новий конструктор батьківського класу і передавали в нього відповідні значення.

  6. Реалізуйте кожен константний метод у батьківському класі так, щоб він повертав значення відповідного поля, а потім видаліть метод з підкласу.

  7. Якщо конструктор підкласу має якусь додаткову функціональність, застосуйте вбудовування методу для вбудовування конструктора у фабричний метод суперкласу.

  8. Видаліть підклас.