Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Извлечение функции (Extract Function).md
2026-02-23 19:52:05 +03:00

63 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 20241114081213.png]]
### **Проблема**
У вас есть фрагмент кода, который можно сгруппировать
```typescript
printOwing(): void {
printBanner();
// Print details.
console.log("name: " + name);
console.log("amount: " + getOutstanding());
}
```
### **Решение**
Выделите участок кода в новый метод (или функцию) и вызовите этот метод вместо старого кода
```typescript
printOwing(): void {
printBanner();
printDetails(getOutstanding());
}
printDetails(outstanding: number): void {
console.log("name: " + name);
console.log("amount: " + outstanding);
}
```
### **Причины рефакторинга**
Чем больше строк кода в методе, тем сложнее разобраться в том, что он делает. Это основная проблема, которую решает этот рефакторинг.
Извлечение метода не только убивает множество запашков в коде, но и является одним из этапов множества других рефакторингов.
### **Достоинства**
- Улучшает читабельность кода. Постарайтесь дать новому методу название, которое бы отражало суть того, что он делает. Например, `createOrder()`, `renderCustomerInfo()` и т. д.
- Убирает дублирование кода. Иногда код, вынесенный в метод, можно найти и в других местах программы. В таком случае, имеет смысл заменить найденные участки кода вызовом вашего нового метода.
- Изолирует независимые части кода, уменьшая вероятность ошибок (например, по вине переопределения не той переменной).
### **Порядок рефакторинга**
1. Создайте новую функцию и дайте ей имя, соответствующее ее предназначе­ нию (тому, что она делает, а не как).
2. Скопируйте беспокоящий вас фрагмент кода в новый метод. Удалите этот фрагмент из старого места и замените вызовом вашего нового метода. Найдите все переменные, которые использовались в этом фрагменте кода. Если они были объявлены внутри этого фрагмента и не используются вне его, просто оставьте их без изменений — они станут локальными переменными нового метода.
3. Если переменные объявлены перед интересующим вас участком кода, значит, их следует передать в параметры вашего нового метода, чтобы использовать значения, которые в них находились ранее.
4. Если вы видите, что локальная переменная как-то изменяется в вашем участке кода, это может означать, что её изменённое значение понадобится дальше в основном методе. Проверьте это. Если подозрение подтвердилось, значение этой переменной следует возвратить в основной метод, чтобы ничего не сломать.
### **Борется с запахом**
- [[Дублируемый код]]
- [[Длинная функция]]
- [[Завистливые функции]]
- [[Повторяющиеся switch]]
- [[Цепочки сообщений]]
- [[Комментарии]]
- [[Классы данных]]
### **Обратный рефакторинг**
- [[Встраивание функции (Inline Function)]]
### **Ссылки**
- https://refactoring.guru/ru/extract-method
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]