#рефакторинг #запахи_кода #методы_рефакторинга # **Запахи кода** > — Что? Как может пахнуть код? — Да, пахнуть определенно не может... а вот пованивать — запросто. ### **Раздувальщики** ![[Pasted image 20241114073900.png]] > Раздувальщики представляют код, методы и классы, которые раздулись до таких больших размеров, что с ними стало невозможно эффективно работать. Все эти запахи зачастую не появляются сразу, а нарастают в процессе эволюции программы (особенно когда никто не пытается бороться с ними). - [[Длинная функция]] - [[Большой класс]] - [[Одержимость примитивами]] - [[Длинный список параметров]] - [[Группы данных]] ### **Нарушители объектного дизайна** ![[Pasted image 20241114073951.png]] > Все эти запахи являют собой неполное или неправильное использование возможностей объектно-ориентированного программирования. - [[Альтернативные классы с разными интерфейсами]] - [[Отказ от наследственности]] - [[Временное поле]] - [[Повторяющиеся switch]] ### **Утяжелители изменений** ![[Pasted image 20241114074059.png]] > Эти запахи приводят к тому, что при необходимости что-то поменять в одном месте программы, вам приходится вносить множество изменений в других местах. Это серьезно осложняет и удорожает развитие программы - [[Параллельные иерархии наследования]] - [[Стрельба дробью]] - [[Расходящиеся изменения]] ### **Замусориватели** ![[Pasted image 20241114074400.png]] > Замусориватели являют собой что-то бесполезное и лишнее, от чего можно было бы избавиться, сделав код чище, эффективней и проще для понимания. - [[Теоретическая общность]] - [[Классы данных]] - [[Ленивый элемент]] - [[Дублируемый код]] - [[Комментарии]] - [[Мертвый код]] ### **Опутыватели связями** ![[Pasted image 20241114074423.png]] >Все запахи из этой группы приводят к избыточной связанности между классами, либо показывают, что бывает, если тесная связанность заменяется постоянным делегированием. - [[Посредник]] - [[Цепочки сообщений]] - [[Завистливые функции]] - [[Неуместная близость]] ### **Остальные запахи** - [[Таинственное имя]] - [[Глобальные данные]] - [[Изменяемые данные]] - [[Циклы]] - [[Внутренний обмен]] ---- ### Методы рефакторинга ## Низкоуровневые рефакторинги - [[Извлечение функции (Extract Function)]] - [[Встраивание функции (Inline Function)]] - [[Извлечение переменной (Extract Variable)]] - [[Встраивание переменной (Inline Variable)]] - [[Изменение объявления функции (Change Function Declaration)]] - [[Инкапсуляция переменной (Encapsulate Variable)]] - [[Переименование переменной (Rename Variable)]] - [[Введение объекта параметра (Introduce Parameter Object)]] - [[Объединение функций в класс (Combine Functions into Class)]] - [[Объединение функций в преобразование (Combine Functions into Transform)]] - [[Разделение этапа (Split Phase)]] ## Инкапсуляция - [[Инкапсуляция записи (Encapsulate Record)]] - [[Инкапсуляция коллекции (Encapsulate Collection)]] - [[Замена примитива объектом (Replace Primitive with Object)]] - [[Замена временной переменной запросом (Replace Temp with Query)]] - [[Извлечение класса (Extract Class)]] - [[Встраивание класса (Inline Class)]] - [[Сокрытие делегата (Hide Delegate)]] - [[Удаление посредника (Remove Middle Man)]] - [[Подстановка алгоритма (Substitute Algorithm)]] ## Перенос функциональности - [[Перенос функции (Move Function)]] - [[Перенос поля (Move Field)]] - [[Перенос инструкций в функцию (Move Statements into Function)]] - [[Перенос инструкций в точку вызова (Move Statements to Callers)]] - [[Замена встроенного кода вызовом функции (Replace Inline Code with Function Call)]] - [[Перемещение инструкций (Slide Statements)]] - [[Разделение цикла (Split Loop)]] - [[Замена цикла конвейером (Replace Loop with Pipeline)]] - [[Удаление неработающего кода (Remove Dead Code)]] ## Организация данных - [[Расщепление переменной (Split Variable)]] - [[Переименование поля (Rename Field)]] - [[Замена вычисленной переменной запросом (Replace Derived Variable with Query)]] - [[Замена ссылки значением (Change Reference to Value)]] - [[Замена значения ссылкой (Change Value to Reference)]] ## Упрощение условной логики - [[Декомпозиция условной инструкции (Decompose Conditional)]] - [[Объединение условного выражения (Consolidate Conditional Expression)]] - [[Замена вложенных условных конструкций граничным оператором (Replace Nested Conditional with Guard Clauses)]] - [[Замена условной инструкции полиморфизмом (Replace Conditional with Polymorphism)]] - [[Введение частного случая (Introduce Special Case)]] - [[Введение утверждения (Introduce Assertion)]] ## Рефакторинг API - [[Отделение запроса от модификатора (Separate Query from Modifier)]] - [[Параметризация функции (Parameterize Function)]] - [[Удаление аргумента-флага (Remove Flag Argument)]] - [[Сохранение всего объекта (Preserve Whole Object)]] - [[Замена параметра запросом (Replace Parameter with Query)]] - [[Замена запроса параметром (Replace Query with Parameter)]] - [[Удаление метода установки значения (Remove Setting Method)]] - [[Замена конструктора фабричной функцией (Replace Constructor with Factory Function)]] - [[Замена функции командой (Replace Function with Command)]] - [[Замена команды функцией (Replace Command with Function)]] ## Работа с наследованием - [[Подъем метода (Pull Up Method)]] - [[Подъем поля (Pull Up Field)]] - [[Подъем тела конструктора (Pull Up Constructor Body)]] - [[Опускание метода (Push Down Method)]] - [[Опускание поля (Push Down Field)]] - [[Замена кода типа подклассами (Replace Type Code with Subclasses)]] - [[Удаление подкласса (Remove Subclass)]] - [[Извлечение суперкласса (Extract Superclass)]] - [[Свертывание иерархии (Collapse Hierarchy)]] - [[Замена подкласса делегатом (Replace Subclass with Delegate)]] - [[Замена суперкласса делегатом (Replace Superclass with Delegate)]] --- ### Литература - [[Рефакторинг кода на JavaScript]] — Мартин Фаулер