#рефакторинг #методы_рефакторинга ![[Pasted image 20250213090245.png]] ### **Проблема** Цена командного объекта оказывается слишком велика ```typescript class ChargeCalculator { constructor (customer, usage){ this._customer = customer; this._usage = usage; } execute() { return this._customer.rate * this._usage; } } ``` ### **Решение** Его следует превратить в обычную функцию ```typescript function charge(customer, usage) { return customer.rate * usage; } ``` ### **Причины рефакторинга** Командные объекты предоставляют мощный механизм обработки сложных вычислений. Их можно легко разбить на отдельные методы, совместно использующие общее состояние через поля; для разных действий они могут быть вызваны разными способами; они могут поэтапно создавать свои данные. Но эта мощь имеет свою стоимость. А в большинстве случаев мне достаточно просто вызвать функцию и заставить ее делать свое дело. ### **Порядок рефакторинга** 1. Примените рефакторинг [[Извлечение функции (Extract Function)]] к созданию команды и вызова метода выполнения команды. 2. Примените рефакторинг [[Встраивание функции (Inline Function)]] к каждому методу, вызываемому методом выполнения команды. 3. Воспользуйтесь рефакторингом [[Изменение объявления функции (Change Function Declaration)]] для того, чтобы поместить все параметры конструктора в метод выполнения команды. 4. Для каждого поля измените обращение к нему в методе выполнения команды на использование параметра. Проведите тестирование после внесения каждого изменения. 5. Встройте вызовы конструктора и метода выполнения команды в вызывающую функцию. 6. Примените рефакторинг [[Удаление неработающего кода (Remove Dead Code)]] к классу команды. ### **Обратный рефакторинг** - [[Замена функции командой (Replace Function with Command)]] ### **Ссылки** - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]