Також відомий як Replace Parameter with Method Call

Рефакторинг Заміна параметра викликом методу

Проблема

Викликаємо метод і передаємо його результати в параметри іншого методу. При цьому значення параметрів могли б бути отримані і всередині викликаємого методу.

Рішення

Замість передачі значення через аргументи, спробуйте перемістити код отримання значення всередину самого методу.
До
int basePrice = quantity * itemPrice;
double seasonDiscount = this.getSeasonalDiscount();
double fees = this.getFees();
double finalPrice = discountedPrice(basePrice, seasonDiscount, fees);
Після
int basePrice = quantity * itemPrice;
double finalPrice = discountedPrice(basePrice);
До
int basePrice = quantity * itemPrice;
double seasonDiscount = this.GetSeasonalDiscount();
double fees = this.GetFees();
double finalPrice = DiscountedPrice(basePrice, seasonDiscount, fees);
Після
int basePrice = quantity * itemPrice;
double finalPrice = DiscountedPrice(basePrice);
До
$basePrice = $this->quantity * $this->itemPrice;
$seasonDiscount = $this->getSeasonalDiscount();
$fees = $this->getFees();
$finalPrice = $this->discountedPrice($basePrice, $seasonDiscount, $fees);
Після
$basePrice = $this->quantity * $this->itemPrice;
$finalPrice = $this->discountedPrice($basePrice);
До
basePrice = quantity * itemPrice
seasonalDiscount = this.getSeasonalDiscount()
fees = this.getFees()
finalPrice = discountedPrice(basePrice, seasonalDiscount, fees)
Після
basePrice = quantity * itemPrice
finalPrice = discountedPrice(basePrice)

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

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

Переваги

  • Позбавляємося від зайвих параметрів, спрощуючи виклики методів. Ці параметри частенько створюються як заділ на майбутнє (яке може так і не настати).

Недоліки

  • Параметр може знадобитися завтра для якихось інших цілей і метод доведеться переписати.

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

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

  2. Якщо код отримання значення складніший, ніж один виклик якогось методу або функції, застосуйте відокремлення методу, щоб виділити цей код в новий метод і зробити виклик простішим.

  3. У коді головного методу замініть усі звернення до замінюваного параметра викликами методу отримання значення.

  4. Використайте «видалення параметра» (Remove parameter), щоб видалити невживаний тепер параметр.

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

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

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

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

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

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

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

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