Autumn SALE

Передача всего объекта

Также известен как: Preserve Whole Object

Проблема

Вы получаете несколько значений из объекта, а затем передаёте их в метод как параметры.

Решение

Вместо этого передавайте весь объект.

До
int low = daysTempRange.getLow();
int high = daysTempRange.getHigh();
boolean withinPlan = plan.withinRange(low, high);
После
boolean withinPlan = plan.withinRange(daysTempRange);
До
int low = daysTempRange.GetLow();
int high = daysTempRange.GetHigh();
bool withinPlan = plan.WithinRange(low, high);
После
bool withinPlan = plan.WithinRange(daysTempRange);
До
$low = $daysTempRange->getLow();
$high = $daysTempRange->getHigh();
$withinPlan = $plan->withinRange($low, $high);
После
$withinPlan = $plan->withinRange($daysTempRange);
До
low = daysTempRange.getLow()
high = daysTempRange.getHigh()
withinPlan = plan.withinRange(low, high)
После
withinPlan = plan.withinRange(daysTempRange)
До
let low = daysTempRange.getLow();
let high = daysTempRange.getHigh();
let withinPlan = plan.withinRange(low, high);
После
let withinPlan = plan.withinRange(daysTempRange);

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

Проблема заключается в том, что перед вызовом вашего метода нужно каждый раз вызывать методы будущего объекта-параметра. Если способ вызова этих методов либо количество данных, получаемых для метода, поменяется, то изменения придётся искать и вносить в дюжину мест по всей программе.

Вместо этого код получения всех нужных данных может храниться одном месте — в самом методе.

Достоинства

  • Вместо пачки разнообразных параметров вы видите один объект с понятным названием.

  • Если методу понадобятся ещё какие-то данные из объекта, не нужно будет переписывать все места, где вызывается этот метод, а только лишь внутренности самого метода.

Недостатки

  • В некоторых случаях после такого преобразования метод теряет в универсальности, так как он мог получать данные из множества разных источников, а в результате рефакторинга мы ограничиваем круг его применения только для объектов с определённым интерфейсом.

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

  1. Создайте параметр в методе для объекта, из которого можно получить нужные значения.

  2. Теперь начинайте по одному удалять старые параметры из метода, заменяя их в коде вызовами соответствующих методов объекта-параметра. Тестируйте программу после каждой замены параметра.

  3. Удалите код получения значений из объекта-параметра, который стоял перед вызовом метода.