51 lines
2.3 KiB
Markdown
51 lines
2.3 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250213085811.png]]
|
||
|
||
### **Проблема**
|
||
Необходимо инкапсулировать функцию в свой собственный объект
|
||
```typescript
|
||
function score(candidate, medicalExam, scoringGuide) {
|
||
let result = 0;
|
||
let healthLevel = 0;
|
||
// long body code
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Такой объект в основном строится вокруг единственного метода, запрос и выполнение которого являются предназначением данного объекта.
|
||
```typescript
|
||
class Scorer {
|
||
constructor(candidate, medicalExam, scoringGuide) {
|
||
this._candidate = candidate;
|
||
this._medicalExam = medicalExam;
|
||
this._scoringGuide = scoringGuide;
|
||
}
|
||
|
||
execute() {
|
||
this._result = 0;
|
||
this._healthLevel = 0;
|
||
// long body code
|
||
}
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Команда обеспечивает большую гибкость, чем простой механизм функции.
|
||
Команды могут иметь дополнительные операции, такие как отмена действия и
|
||
возврат к предыдущему состоянию
|
||
|
||
### **Недостатки**
|
||
- Как обычно, эта гибкость имеет свою цену — а именно повышенную сложность
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Создайте для функции пустой класс. Дайте ему имя, основанное на функции, с которой вы работаете
|
||
2. Примените рефакторинг [[Перенос функции (Move Function)]] для переноса функции в пустой класс.
|
||
3. Рассмотрите возможность создания поля для каждого аргумента и перенесите эти аргументы в конструктор.
|
||
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Замена команды функцией (Replace Command with Function)]]
|
||
|
||
### **Ссылки**
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |