8.9 KiB
#рефакторинг #запахи_кода #методы_рефакторинга
Запахи кода
— Что? Как может пахнуть код? — Да, пахнуть определенно не может... а вот пованивать — запросто.
Раздувальщики
Раздувальщики представляют код, методы и классы, которые раздулись до таких больших размеров, что с ними стало невозможно эффективно работать. Все эти запахи зачастую не появляются сразу, а нарастают в процессе эволюции программы (особенно когда никто не пытается бороться с ними).
Нарушители объектного дизайна
Все эти запахи являют собой неполное или неправильное использование возможностей объектно-ориентированного программирования.
- Альтернативные классы с разными интерфейсами
- Отказ от наследственности
- Временное поле
- Повторяющиеся switch
Утяжелители изменений
Эти запахи приводят к тому, что при необходимости что-то поменять в одном месте программы, вам приходится вносить множество изменений в других местах. Это серьезно осложняет и удорожает развитие программы
Замусориватели
Замусориватели являют собой что-то бесполезное и лишнее, от чего можно было бы избавиться, сделав код чище, эффективней и проще для понимания.
Опутыватели связями
Все запахи из этой группы приводят к избыточной связанности между классами, либо показывают, что бывает, если тесная связанность заменяется постоянным делегированием.
Остальные запахи
Методы рефакторинга
Низкоуровневые рефакторинги
- Извлечение функции (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 — Мартин Фаулер




