Відокремлення методу

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Відокре́млення ме́тоду (англ. Extract Method) - прийом рефакторингу, що дозволяє розбити код на дрібніші та зрозуміліші частини, прибрати дублювання коду і полегшити подальшу роботу з ним.

Проблема[ред. | ред. код]

Є фрагмент коду (C#), який можна згрупувати.

void PrintOwing()
{
  List<Order> orders = orders.Elements;
  double outstanding = 0.0;
  // print owings
  foreach (Order order in orders)
  {
    outstanding += order.GetAmount();
  }
  // print details
  Console.WriteLine("name: " + name);
  Console.WriteLine("amount: " + outstanding);
}

Рішення[ред. | ред. код]

Перенести ці фрагменти в нові методи (чи функції) і викликати замість старого коду.

void PrintOwing()
{
 double outstanding = GetOutstanding();
  PrintDetails(outstanding);
}


void PrintDetails(double outstanding)
{
  Console.WriteLine("name: " + name);
  Console.WriteLine("amount: " + outstanding);
}


double GetOutstanding()
{
  List<Order> orders = orders.Elements;
  double outstanding = 0.0;

  foreach (Order order in orders)
  {
    outstanding += order.GetAmount();
  }

  return outstanding;
}

Причини рефакторингу[ред. | ред. код]

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

Переваги[ред. | ред. код]

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

Порядок рефакторингу[ред. | ред. код]

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

Анти-рефакторинг[ред. | ред. код]

  • Вбудовування методу

Схожі рефакторинги[ред. | ред. код]

  • Переміщення методу

Допомагає іншим рефакторингам[ред. | ред. код]

  • Заміна параметрів об'єктом
  • Створення шаблонного методу
  • Параметризація методу

Бореться з запахом[ред. | ред. код]

  • Дублювання коду
  • Довгий метод
  • Заздрісні функції
  • Оператори switch
  • Ланцюжок викликів
  • Коментарі
  • Клас даних

Див. також[ред. | ред. код]

Посилання[ред. | ред. код]