Також відомий як Extract Class

Рефакторинг Відокремлення класу

Проблема

Один клас працює за двох.

Рішення

Створіть новий клас, перемістіть в нього поля і методи, що відповідають за певну функціональність.
До
Extract Class - Before
Після
Extract Class - After

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

Класи завжди спочатку виглядають чіткими і зрозумілими. Вони виконують свою роботу і не лізуть в обов'язки інших класів. Проте, з ходом життя програми додається один метод – тут, одно поле – там. В результаті деякі класи отримують масу додаткових обов'язків.

Переваги

  • Цей рефакторинг покликаний допомогти в дотриманні принципу єдиного обов'язку класу. Це робить код ваших класів очевидніше і зрозуміліше.

  • Класи з єдиним обов'язком надійніші і стійкіші до змін. Наприклад, у вас є клас, що відповідає за десять різних речей. І коли вам доведеться вносити в нього зміни, ви ризикуєте при коригуваннях однієї речі зламати інші.

Недоліки

  • Якщо при проведенні цього рефакторингу ви занадто захопитеся, доведеться вдатися до вбудовування класу.

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

Перед початком рефакторингу обов'язково визначите, як саме слід розділити обов'язки класу.

  1. Створіть новий клас, який міститиме виділену функціональність.

  2. Створіть зв'язок між старим і новим класом. Краще за всього, якщо цей зв'язок буде одностороннім; при цьому другий клас можна буде без проблем використати повторно. З іншого боку, якщо ви вважаєте, що це необхідно, завжди можна створити двосторонній зв'язок.

  3. Використайте переміщення поля і переміщення методу для кожного поля і методу, які ви вирішили перенести в новий клас. Для методів має сенс розпочинати з приватних, таким чином ви знижуєте вірогідність допустити масу помилок. Намагайтеся рухатися помалу і тестувати результат після кожного переміщення, це позбавить вас від необхідності виправляти багато помилок в самому кінці роботи.

  • Коли з переміщенням було покінчено, подивіться ще раз на класи, що вийшли. Можливо, старий клас тепер має сенс назвати по-іншому, зважаючи на його нові обов'язки. Перевірте ще раз, чи можна позбавитися від двостороннього зв'язку між класами, якщо він з'явився.
  1. Ще одним нюансом є доступність нового класу ззовні. Ви можете повністю сховати його від клієнта, зробивши приватним, і в той же час управляти його полями із старого класу. Або зробити його публічним, надавши клієнтові можливість безпосередньо міняти значення. Рішення залежить від того, наскільки безпечні для поведінки старого класу будуть несподівані прямі зміни значень в новому класі.

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

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

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

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

Живий приклад

Перший раз у нас? Нічого страшного!

У нас тут все просто – цей інтерактивний приклад дуже схожий на відео (хоча й виглядає набагато крутіше).

  1. Натискаєте велику кнопку "Почати", а далі слідуєте усім підказкам.
  2. Ви можете перемотувати програвання, використовуючи стрілки зліва.
  3. Окрім того, ви можете подивитися різницю між стартовим та отриманим кодом, натиснувши кнопку ока ().
  4. Кнопка компіляції та тестування () дає змогу перевірити код на наявність помилок.