#рефакторинг #методы_рефакторинга ![[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]]