Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена запроса параметром (Replace Query with Parameter).md
2026-02-23 19:52:05 +03:00

44 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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 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]]