3.2 KiB
#рефакторинг #методы_рефакторинга
Проблема
Просматривая тело функции, в области видимости функции встречается ссылка на нечто, что не устраивает. Это может быть ссылка на глобальную переменную или обращение к элементу в том же модуле, который собираемся удалить
targetTemperature(aPlan)
function targetTemperature(aPlan) {
currentTemperature = thermostat.currentTemperature;
// rest of function...
}
Решение
Заменить внутреннюю ссылку параметром, перекладывая ответственность за разрешение ссылки на вызывающую функцию
targetTemperature(aPlan, thermostat.currentTemperature)
function targetTemperature(aPlan, currentTemperature) {
// rest of function...
}
Причины рефакторинга
Проще работать с функцией, которая при вызове с одинаковыми значениями параметров всегда будет давать один и тот же результат. Такое свойство функции называется ссылочной прозрачностью. Если функция обращается к некоторому элементу в своей области видимости, который не обладает ссылочной прозрачностью, то и сама функция также не обладает ею. Но такое положение дел можно исправить, переместив непрозрачный элемент в параметр.
Недостатки
- Перемещая запрос в параметр, я заставляю вызывающую функцию выводить и предоставлять указанное значение.
Порядок рефакторинга
- Примените рефакторинг Извлечение переменной (Extract Variable) к коду запроса, чтобы отделить его от остального тела функции.
- Примените рефакторинг Извлечение функции (Extract Function) к коду тела функции, не являющемуся вызовом запроса.
- Используйте рефакторинг Встраивание переменной (Inline Variable), чтобы избавиться от только что созданной переменной.
- Примените рефакторинг Встраивание функции (Inline Function) к исходной функции.
- Переименуйте новую функцию, дав ей имя исходной функции
