Привіт! Я знизив ціни на усі продукти. Час разом готувати свої програмерські скіли до пост-COVID-ної ери. Перевірити »

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

Також відомий як: 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 = self.getSeasonalDiscount()
fees = self.getFees()
finalPrice = discountedPrice(basePrice, seasonalDiscount, fees)
Після
basePrice = quantity * itemPrice
finalPrice = discountedPrice(basePrice)
До
let basePrice = quantity * itemPrice;
const seasonDiscount = this.getSeasonalDiscount();
const fees = this.getFees();
const finalPrice = discountedPrice(basePrice, seasonDiscount, fees);
Після
let basePrice = quantity * itemPrice;
let finalPrice = discountedPrice(basePrice);

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

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

Переваги

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

Недоліки

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

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

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

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

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

  4. Використайте видалення параметра, щоб видалити невживаний тепер параметр.