Base/Knowledges/IT/Рефакторинг/Рефакторинг.md
2026-02-23 19:52:05 +03:00

136 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #запахи_кодаетоды_рефакторинга
# **Запахи кода**
> — Что? Как может пахнуть код?
— Да, пахнуть определенно не может... а вот пованивать — запросто.
### **Раздувальщики**
![[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)]]