Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена команды функцией (Replace Command with Function).md
2026-02-23 19:52:05 +03:00

2.9 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20250213090245.png

Проблема

Цена командного объекта оказывается слишком велика

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;
}

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

Командные объекты предоставляют мощный механизм обработки сложных вычислений. Их можно легко разбить на отдельные методы, совместно использующие общее состояние через поля; для разных действий они могут быть вызваны разными способами; они могут поэтапно создавать свои данные. Но эта мощь имеет свою стоимость. А в большинстве случаев мне достаточно просто вызвать функцию и заставить ее делать свое дело.

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

  1. Примените рефакторинг Извлечение функции (Extract Function) к созданию команды и вызова метода выполнения команды.
  2. Примените рефакторинг Встраивание функции (Inline Function) к каждому методу, вызываемому методом выполнения команды.
  3. Воспользуйтесь рефакторингом Изменение объявления функции (Change Function Declaration) для того, чтобы поместить все параметры конструктора в метод выполнения команды.
  4. Для каждого поля измените обращение к нему в методе выполнения команды на использование параметра. Проведите тестирование после внесения каждого изменения.
  5. Встройте вызовы конструктора и метода выполнения команды в вызывающую функцию.
  6. Примените рефакторинг Удаление неработающего кода (Remove Dead Code) к классу команды.

Обратный рефакторинг

Ссылки