Також відомий як Replace Parameter with Explicit Methods

Рефакторинг Заміна параметра набором спеціалізованих методів

Проблема

Метод було розбито на частини, кожна з яких виконується залежно від значення якогось параметра.

Рішення

Витягніть окремі частини методу у власні методи і викликайте їх замість оригінального методу.
До
void setValue(String name, int value) {
  if (name.equals("height")) {
    height = value;
    return;
  }
  if (name.equals("width")) {
    width = value;
    return;
  }
  Assert.shouldNeverReachHere();
}
Після
void setHeight(int arg) {
  height = arg;
}
void setWidth(int arg) {
  width = arg;
}
До
void SetValue(string name, int value) 
{
  if (name.Equals("height")) 
  {
    height = value;
    return;
  }
  if (name.Equals("width")) 
  {
    width = value;
    return;
  }
  Assert.Fail();
}
Після
void SetHeight(int arg) 
{
  height = arg;
}
void SetWidth(int arg) 
{
  width = arg;
}
До
function setValue($name, $value) {
  if ($name == "height") {
    $this->height = $value;
    return;
  }
  if ($name == "width")) {
    $this->width = $value;
    return;
  }
  assert("Should never reach here");
}
Після
function setHeight($arg) {
  $this->height = $arg;
}
function setWidth($arg) {
  $this->width = $arg;
}
До
def output(self, type):
    if name == "banner"
        # Print the banner.
        # ...
    if name == "info"
        # Print the info.
        # ...
Після
def outputBanner(self):
    # Print the banner.
    # ...

def outputInfo(self):
    # Print the info.
    # ...

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

Метод, що містить варіанти виконання, розрісся до грандіозних розмірів. У кожному з таких ланцюжків виконується нетривіальний код. При цьому нові варіанти додаються дуже рідко.

Переваги

  • Покращує читабельність коду. Куди очевидніше, що робить метод startEngine(), ніж setValue("engineEnabled", true).

Коли не слід застосовувати

  • Не варто застосовувати заміну параметра явними методами, якщо метод рідко міняється, а нові варіації усередині нього не додаються.

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

  1. Для кожного варіанту виконання методу створіть свій метод. Запускайте ці методи залежно від значення параметра в основному методі.

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

  3. Коли не залишиться жодного виклику оригінального методу, його можна буде видалити.

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

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

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

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

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

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

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

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