2.9 KiB
2.9 KiB
#рефакторинг #методы_рефакторинга
Проблема
Цена командного объекта оказывается слишком велика
class ChargeCalculator {
constructor (customer, usage){
this._customer = customer;
this._usage = usage;
}
execute() {
return this._customer.rate * this._usage;
}
}
Решение
Его следует превратить в обычную функцию
function charge(customer, usage) {
return customer.rate * usage;
}
Причины рефакторинга
Командные объекты предоставляют мощный механизм обработки сложных вычислений. Их можно легко разбить на отдельные методы, совместно использующие общее состояние через поля; для разных действий они могут быть вызваны разными способами; они могут поэтапно создавать свои данные. Но эта мощь имеет свою стоимость. А в большинстве случаев мне достаточно просто вызвать функцию и заставить ее делать свое дело.
Порядок рефакторинга
- Примените рефакторинг Извлечение функции (Extract Function) к созданию команды и вызова метода выполнения команды.
- Примените рефакторинг Встраивание функции (Inline Function) к каждому методу, вызываемому методом выполнения команды.
- Воспользуйтесь рефакторингом Изменение объявления функции (Change Function Declaration) для того, чтобы поместить все параметры конструктора в метод выполнения команды.
- Для каждого поля измените обращение к нему в методе выполнения команды на использование параметра. Проведите тестирование после внесения каждого изменения.
- Встройте вызовы конструктора и метода выполнения команды в вызывающую функцию.
- Примените рефакторинг Удаление неработающего кода (Remove Dead Code) к классу команды.
