#рефакторинг #методы_рефакторинга ![[Pasted image 20250212084022.png]] ### **Проблема** Метод разбит на части, каждая из которых выполняется в зависимости от значения какого-то параметра. ```typescript setValue(name: string, value: number): void { if (name.equals("height")) { height = value; return; } if (name.equals("width")) { width = value; return; } } ``` ### **Решение** Извлеките отдельные части метода в собственные методы и вызывайте их вместо оригинального метода. ```typescript setHeight(arg: number): void { height = arg; } setWidth(arg: number): number { width = arg; } ``` ### **Причины рефакторинга** Метод, содержащий варианты выполнения, разросся до грандиозных размеров. В каждой из таких цепочек выполняется нетривиальный код. При этом новые варианты добавляются очень редко. ### **Достоинства** - Улучшает читабельность кода. Куда очевидней, что делает метод `startEngine()` чем `setValue("engineEnabled", true)`. ### **Когда нельзя применить** - Не стоит применять замену параметра явными методами, если метод редко меняется, а новые вариации внутри него не добавляются. ### **Порядок рефакторинга** 1. Для каждого варианта исполнения метода создайте свой метод. Запускайте эти методы в зависимости от значения параметра в основном методе. 2. Найдите все места, где вызывается оригинальный метод. Подставьте туда вызов одного из новых методов в зависимости от передающегося параметра. 3. Когда не останется ни одного вызова оригинального метода, его можно будет удалить ### **Борется с запахом** - [[Повторяющиеся switch]] - [[Длинная функция]] ### **Обратный рефакторинг** - [[Параметризация функции (Parameterize Function)]] ### **Ссылки** - https://refactoring.guru/ru/replace-parameter-with-explicit-methods - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]