Заміна умовного оператора поліморфізмом

причини рефакторінга

Цей рефакторинг може допомогти, якщо у вас в коді є умовні оператори, які виконують різну роботу, в залежності від:

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

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

переваги

  • Цей рефакторинг реалізує принцип говори, а не питай. замість того, щоб питати об'єкт про його стан, а потім виконувати на підставі цього якісь дії, набагато простіше просто сказати йому, що потрібно робити, а як це робити він вирішить сам.
  • Вбиває дублювання коду. Ви рятуєтеся від безлічі майже однакових умовних операторів.
  • Якщо вам буде потрібно додати новий варіант виконання, все, що доведеться зробити, це додати новий підклас, не чіпаючи існуючий код (принцип відкритості / закритості).

порядок рефакторінга

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

Щоб виконати цей рефакторинг, вам слід мати готову ієрархію класів, в яких будуть міститися альтернативні поведінки. Якщо такої ієрархії ще немає, потрібно створити її. У цьому можуть допомогти інші рефакторингом:

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

Наступні кроки цього рефакторінга увазі, що ви вже створили ієрархію.

кроки рефакторінга

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

Заміна умовного оператора поліморфізмом

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

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