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

3.2 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20250213083408.png

Проблема

Просматривая тело функции, в области видимости функции встречается ссылка на нечто, что не устраивает. Это может быть ссылка на глобальную переменную или обращение к элементу в том же модуле, который собираемся удалить

targetTemperature(aPlan)

function targetTemperature(aPlan) {
  currentTemperature = thermostat.currentTemperature;
  // rest of function...
}

Решение

Заменить внутреннюю ссылку параметром, перекладывая ответственность за разрешение ссылки на вызывающую функцию

targetTemperature(aPlan, thermostat.currentTemperature)

function targetTemperature(aPlan, currentTemperature) {
  // rest of function...
}

Причины рефакторинга

Проще работать с функцией, которая при вызове с одинаковыми значениями параметров всегда будет давать один и тот же результат. Такое свойство функции называется ссылочной прозрачностью. Если функция обращается к некоторому элементу в своей области видимости, который не обладает ссылочной прозрачностью, то и сама функция также не обладает ею. Но такое положение дел можно исправить, переместив непрозрачный элемент в параметр.

Недостатки

  • Перемещая запрос в параметр, я заставляю вызывающую функцию выводить и предоставлять указанное значение.

Порядок рефакторинга

  1. Примените рефакторинг Извлечение переменной (Extract Variable) к коду запроса, чтобы отделить его от остального тела функции.
  2. Примените рефакторинг Извлечение функции (Extract Function) к коду тела функции, не являющемуся вызовом запроса.
  3. Используйте рефакторинг Встраивание переменной (Inline Variable), чтобы избавиться от только что созданной переменной.
  4. Примените рефакторинг Встраивание функции (Inline Function) к исходной функции.
  5. Переименуйте новую функцию, дав ей имя исходной функции

Обратный рефакторинг

Ссылки