54 lines
2.8 KiB
Markdown
54 lines
2.8 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250212084022.png]]
|
||
|
||
### **Проблема**
|
||
Метод разбит на части, каждая из которых выполняется в зависимости от значения какого-то параметра.
|
||
```typescript
|
||
setValue(name: string, value: number): void {
|
||
if (name.equals("height")) {
|
||
height = value;
|
||
return;
|
||
}
|
||
if (name.equals("width")) {
|
||
width = value;
|
||
return;
|
||
}
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Извлеките отдельные части метода в собственные методы и вызывайте их вместо оригинального метода.
|
||
```typescript
|
||
setHeight(arg: number): void {
|
||
height = arg;
|
||
}
|
||
setWidth(arg: number): number {
|
||
width = arg;
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Метод, содержащий варианты выполнения, разросся до грандиозных размеров. В каждой из таких цепочек выполняется нетривиальный код. При этом новые варианты добавляются очень редко.
|
||
|
||
### **Достоинства**
|
||
- Улучшает читабельность кода. Куда очевидней, что делает метод `startEngine()` чем `setValue("engineEnabled", true)`.
|
||
|
||
### **Когда нельзя применить**
|
||
- Не стоит применять замену параметра явными методами, если метод редко меняется, а новые вариации внутри него не добавляются.
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Для каждого варианта исполнения метода создайте свой метод. Запускайте эти методы в зависимости от значения параметра в основном методе.
|
||
2. Найдите все места, где вызывается оригинальный метод. Подставьте туда вызов одного из новых методов в зависимости от передающегося параметра.
|
||
3. Когда не останется ни одного вызова оригинального метода, его можно будет удалить
|
||
|
||
### **Борется с запахом**
|
||
- [[Повторяющиеся switch]]
|
||
- [[Длинная функция]]
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Параметризация функции (Parameterize Function)]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/replace-parameter-with-explicit-methods
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |