причини рефакторінга
Цей рефакторинг може допомогти, якщо у вас в коді є умовні оператори, які виконують різну роботу, в залежності від:
- класу об'єкта або інтерфейсу, який він реалізує;
- значення якогось із полів об'єкта;
- результату виклику одного з методів об'єкта.
При цьому якщо у вас з'явиться новий тип або властивість об'єкта, потрібно буде шукати і додавати код в усі схожі умовні оператори. Таким чином, користь від даного рефакторінга збільшується, якщо умовних операторів більше одного, і вони розкидані по всьому методам об'єкта.
переваги
- Цей рефакторинг реалізує принцип говори, а не питай. замість того, щоб питати об'єкт про його стан, а потім виконувати на підставі цього якісь дії, набагато простіше просто сказати йому, що потрібно робити, а як це робити він вирішить сам.
- Вбиває дублювання коду. Ви рятуєтеся від безлічі майже однакових умовних операторів.
- Якщо вам буде потрібно додати новий варіант виконання, все, що доведеться зробити, це додати новий підклас, не чіпаючи існуючий код (принцип відкритості / закритості).
порядок рефакторінга
Підготовка до рефакторингу
Щоб виконати цей рефакторинг, вам слід мати готову ієрархію класів, в яких будуть міститися альтернативні поведінки. Якщо такої ієрархії ще немає, потрібно створити її. У цьому можуть допомогти інші рефакторингом:
- Заміна кодування типу підкласами. При цьому для всіх значень якогось властивості об'єкта будуть створені свої підкласи. Це хоч і простий, але менш гнучкий спосіб, тому що не можна буде створити підкласи для інших властивостей об'єкта.
- Заміна кодування типу станом / стратегією. При цьому для певної властивості об'єкта буде виділено свій клас і з нього створені підкласи для кожного значення цієї властивості. Поточний клас буде містити посилання на об'єкти такого типу і делегувати їм виконання.
Наступні кроки цього рефакторінга увазі, що ви вже створили ієрархію.
кроки рефакторінга
- Якщо умовний оператор знаходиться в методі, який виконує ще якісь дії, витягніть його в новий метод.
- Для кожного підкласу ієрархії, перевизначите метод, що містить умовний оператор, і скопіюйте туди код відповідної гілки оператора.
- Видаліть цю гілку з умовного оператора.
- Повторюйте заміну, поки умовний оператор не спорожніє. Потім видаліть умовний оператор і оголосіть метод абстрактним.
Збігайте за подушкою, у нас тут контенту на 7 годин читання.
Або спробуйте наш інтерактивний курс. Він набагато цікавіший, ніж банальний текст.