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

42 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[Pasted image 20250213090245.png]]
### **Проблема**
Цена командного объекта оказывается слишком велика
```typescript
class ChargeCalculator {
constructor (customer, usage){
this._customer = customer;
this._usage = usage;
}
execute() {
return this._customer.rate * this._usage;
}
}
```
### **Решение**
Его следует превратить в обычную функцию
```typescript
function charge(customer, usage) {
return customer.rate * usage;
}
```
### **Причины рефакторинга**
Командные объекты предоставляют мощный механизм обработки сложных вычислений. Их можно легко разбить на отдельные методы, совместно использующие общее состояние через поля; для разных действий они могут быть вызваны разными способами; они могут поэтапно создавать свои данные. Но эта мощь имеет свою стоимость. А в большинстве случаев мне достаточно просто вызвать функцию и заставить ее делать свое дело.
### **Порядок рефакторинга**
1. Примените рефакторинг [[Извлечение функции (Extract Function)]] к созданию команды и вызова метода выполнения команды.
2. Примените рефакторинг [[Встраивание функции (Inline Function)]] к каждому методу, вызываемому методом выполнения команды.
3. Воспользуйтесь рефакторингом [[Изменение объявления функции (Change Function Declaration)]] для того, чтобы поместить все параметры конструктора в метод выполнения команды.
4. Для каждого поля измените обращение к нему в методе выполнения команды на использование параметра. Проведите тестирование после внесения каждого изменения.
5. Встройте вызовы конструктора и метода выполнения команды в вызывающую функцию.
6. Примените рефакторинг [[Удаление неработающего кода (Remove Dead Code)]] к классу команды.
### **Обратный рефакторинг**
- [[Замена функции командой (Replace Function with Command)]]
### **Ссылки**
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]