Summer SALE

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

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