46 lines
3.5 KiB
Markdown
46 lines
3.5 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250212082915.png]]
|
||
|
||
### **Проблема**
|
||
Несколько методов выполняют похожие действия, которые отличаются только какими-то внутренними значениями, числами или операциями.
|
||
```typescript
|
||
function tenPercentRaise(aPerson) {
|
||
aPerson.salary = aPerson.salary.multiply(1.1);
|
||
}
|
||
function fivePercentRaise(aPerson) {
|
||
aPerson.salary = aPerson.salary.multiply(1.05);
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Объедините все эти методы в один с параметром, в который будет передаваться отличающееся значение.
|
||
```typescript
|
||
function raise(aPerson, factor) {
|
||
aPerson.salary = aPerson.salary.multiply(1 + factor);
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Если у вас есть схожие методы, скорей всего, в них присутствует дублирующий код со всеми вытекающими недостатками.
|
||
Кроме того, если вам нужно будет добавить ещё одну вариацию функциональности, вам придётся создавать ещё один метод. Вместо этого можно бы было запустить существующий метод с другим параметром.
|
||
|
||
### **Недостатки**
|
||
Иногда при проведении рефакторинга можно переусердствовать, в результате чего у вас появится длинный и сложный общий метод вместо нескольких простых.
|
||
|
||
Кроме того, будьте осторожны, выделяя в параметр переключатель какой-то функциональности. В дальнейшем это может привести к созданию большого условного оператора, который надо будет лечить с помощью [[Удаление аргумента-флага (Remove Flag Argument)]].
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Создайте новый метод с параметром и поместите в него общий для всех методов код, применяя [[Извлечение функции (Extract Function)]]. Обратите внимание, иногда общей оказывается только определённая часть методов. В этом случае рефакторинг сведётся к извлечению только этой общей части в новый метод.
|
||
2. Отличающееся значение замените параметром в коде нового метода
|
||
3. Для каждого старого метода найдите места, где они вызываются, и поменяйте их вызовы на вызовы нового метода с параметром. После чего старый метод можно удалить.
|
||
|
||
### **Борется с запахом**
|
||
- [[Дублируемый код]]
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Удаление аргумента-флага (Remove Flag Argument)]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/parameterize-method
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |