#рефакторинг #методы_рефакторинга ![[Pasted image 20250127093832.png]] ### **Проблема** Вы помещаете результат какого-то выражения в локальную переменную, чтобы использовать её далее в коде. ```typescript calculateTotal(): number { let basePrice = quantity * itemPrice; if (basePrice > 1000) { return basePrice * 0.95; } else { return basePrice * 0.98; } } ``` ### **Решение** Выделите все выражение в отдельный метод и возвращайте результат из него. Замените использование вашей переменной вызовом метода. Новый метод может быть использован и в других методах. ```typescript calculateTotal(): number { if (basePrice() > 1000) { return basePrice() * 0.95; } else { return basePrice() * 0.98; } } basePrice(): number { return quantity * itemPrice; } ``` ### **Причины рефакторинга** Применение данного рефакторинга может быть подготовительным этапом для применения [[Извлечение функции (Extract Function)]] для какой-то части очень длинного метода. Кроме того, иногда можно найти это же выражение и в других методах, что заставляет задуматься о создании общего метода для его получения. ### **Достоинства** - Улучшает читабельность кода. Намного проще понять, что делает метод `getTax()` чем строка `orderPrice() * -2`. - Помогает убрать дублирование кода, если заменяемая строка используется более чем в одном методе. ### **Порядок рефакторинга** 1. Убедитесь, что переменной в пределах метода присваивается значение только один раз. Если это не так, используйте расщепление переменной для того, чтобы гарантировать, что переменная будет использована только для хранения результата вашего выражения. 2. Используйте [[Извлечение функции (Extract Function)]] для того, чтобы переместить интересующее вас выражение в новый метод. Убедитесь, что этот метод только возвращает значение и не меняет состояние объекта. Если он как-то влияет на видимое состояние объекта, используйте разделение запроса и модификатора. 3. Замените использование переменной вызовом вашего нового метода ### **Борется с запахом** - [[Длинная функция]] - [[Дублируемый код]] ### **Ссылки** - https://refactoring.guru/ru/replace-temp-with-query - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]