4.7 KiB
#рефакторинг #методы_рефакторинга
Проблема
Вы помещаете результат какого-то выражения в локальную переменную, чтобы использовать её далее в коде.
get discountedTotal() {return this._discountedTotal;}
set discount(aNumber) {
const old = this._discount;
this._discount = aNumber;
this._discountedTotal += old - aNumber;
}
Решение
Выделите все выражение в отдельный метод и возвращайте результат из него. Замените использование вашей переменной вызовом метода. Новый метод может быть использован и в других методах.
get discountedTotal() {return this._baseTotal - this._discount;}
set discount(aNumber) {this._discount = aNumber;}
Причины рефакторинга
Применение данного рефакторинга может быть подготовительным этапом для применения Извлечение функции (Extract Function).
Кроме того, иногда можно найти это же выражение и в других методах, что заставляет задуматься о создании общего метода для его получения.
Достоинства
- Улучшает читабельность кода. Намного проще понять, что делает метод
getTax()чем строкаorderPrice() * -2. - Помогает убрать дублирование кода, если заменяемая строка используется более чем в одном методе.
Вопрос производительности
При использовании этого рефакторинга может возникнуть вопрос, не скажется ли результат рефакторинга не лучшим образом на производительности программы. Честный ответ — да, результирующий код может получить дополнительную нагрузку за счёт вызова нового метода. Однако в наше время быстрых процессоров и хороших компиляторов такая нагрузка вряд ли будет заметна. Зато взамен мы получаем лучшую читабельность кода и возможность использовать новый метод в других местах программы.
Тем не менее, если ваша временная переменная служит для кеширования результата действительно трудоёмкого выражения, имеет смысл остановить этот рефакторинг после выделения выражения в новый метод.
Порядок рефакторинга
- Убедитесь, что переменной в пределах метода присваивается значение только один раз. Если это не так, используйте Расщепление переменной (Split Variable) для того, чтобы гарантировать, что переменная будет использована только для хранения результата вашего выражения.
- Используйте Извлечение функции (Extract Function) для того, чтобы переместить интересующее вас выражение в новый метод. Убедитесь, что этот метод только возвращает значение и не меняет состояние объекта. Если он как-то влияет на видимое состояние объекта, используйте Отделение запроса от модификатора (Separate Query from Modifier).
- Замените использование переменной вызовом вашего нового метода
