Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!

Замена параметра вызовом метода

Также известен как: 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. Используйте удаление параметра, чтобы удалить неиспользуемый теперь параметр.