44 lines
3.2 KiB
Markdown
44 lines
3.2 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250213083408.png]]
|
||
|
||
### **Проблема**
|
||
Просматривая тело функции, в области видимости функции встречается ссылка на нечто, что не устраивает. Это может быть ссылка на глобальную переменную или обращение к элементу в том же модуле, который собираемся удалить
|
||
```typescript
|
||
targetTemperature(aPlan)
|
||
|
||
function targetTemperature(aPlan) {
|
||
currentTemperature = thermostat.currentTemperature;
|
||
// rest of function...
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Заменить внутреннюю ссылку параметром, перекладывая ответственность за разрешение ссылки на вызывающую функцию
|
||
```typescript
|
||
targetTemperature(aPlan, thermostat.currentTemperature)
|
||
|
||
function targetTemperature(aPlan, currentTemperature) {
|
||
// rest of function...
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Проще работать с функцией, которая при вызове с одинаковыми значениями параметров всегда будет давать один и тот же результат. Такое свойство функции называется ссылочной прозрачностью. Если функция обращается к некоторому элементу в своей области видимости, который не обладает ссылочной прозрачностью, то и сама функция также не обладает ею. Но такое положение дел можно исправить, переместив непрозрачный элемент в параметр.
|
||
|
||
### **Недостатки**
|
||
- Перемещая запрос в параметр, я заставляю вызывающую функцию выводить и предоставлять указанное значение.
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Примените рефакторинг [[Извлечение переменной (Extract Variable)]] к коду запроса, чтобы отделить его от остального тела функции.
|
||
2. Примените рефакторинг [[Извлечение функции (Extract Function)]] к коду тела функции, не являющемуся вызовом запроса.
|
||
3. Используйте рефакторинг [[Встраивание переменной (Inline Variable)]], чтобы избавиться от только что созданной переменной.
|
||
4. Примените рефакторинг [[Встраивание функции (Inline Function)]] к исходной функции.
|
||
5. Переименуйте новую функцию, дав ей имя исходной функции
|
||
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Замена параметра запросом (Replace Parameter with Query)]]
|
||
|
||
### **Ссылки**
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |