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