42 lines
2.9 KiB
Markdown
42 lines
2.9 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[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]] |