Глянь мій новий курс по Git! Привіт! Глянь мій новий курс по Git! Привіт! Глянь мій новий курс по Git на GitByBit.com! Привіт! Хочеш класно освіжити Git? Глянь мій новий курс на GitByBit.com!

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

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

Проблема

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

Рішення

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

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

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

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

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

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

Переваги

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

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

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

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

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

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

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

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

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

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