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

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

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