Каталог рефакторинга
Запахи кода
— Что? Как может пахнуть код?
— Да, пахнуть определенно не может... а вот пованивать — запросто.
![](/images/refactoring/content/catalog/bloaters.png?id=32a44a371122874ebd1e8a2cbb9202b9)
Раздувальщики
Раздувальщики представляют код, методы и классы, которые раздулись до таких больших размеров, что с ними стало невозможно эффективно работать. Все эти запахи зачастую не появляются сразу, а нарастают в процессе эволюции программы (особенно когда никто не пытается бороться с ними).
![](/images/refactoring/content/catalog/oo-abusers.png?id=dee31050499d8d6b5a2d5b2e84e68cc8)
Нарушители объектного дизайна
Все эти запахи являют собой неполное или неправильное использование возможностей объектно-ориентированного программирования.
![](/images/refactoring/content/catalog/change-preventers.png?id=db5f332e55fd4b993e15c419baf1db41)
Утяжелители изменений
Эти запахи приводят к тому, что при необходимости что-то поменять в одном месте программы, вам приходится вносить множество изменений в других местах. Это серьезно осложняет и удорожает развитие программы.
![](/images/refactoring/content/catalog/dispensables.png?id=b1072dc9efcf8c0374ddbd7e0b8d496f)
Замусориватели
Замусориватели являют собой что-то бесполезное и лишнее, от чего можно было бы избавиться, сделав код чище, эффективней и проще для понимания.
![](/images/refactoring/content/catalog/couplers.png?id=1a0e96c005372053d5823ccb5282ae7d)
Опутыватели связями
Все запахи из этой группы приводят к избыточной связанности между классами, либо показывают, что бывает, если тесная связанность заменяется постоянным делегированием.
Приёмы рефакторинга
![](/images/refactoring/content/catalog/composing-methods.png?id=953854e802753495812cb9b2686765f7)
Составление методов
Значительная часть рефакторинга посвящается правильному составлению методов. В большинстве случаев, корнем всех зол являются слишком длинные методы. Хитросплетения кода внутри такого метода, прячут логику выполнения и делают метод крайне сложным для понимания, а значит и изменения. Рефакторинги этой группы призваны уменьшить сложность внутри метода, убрать дублирование кода и облегчить последующую работу с ним.
![](/images/refactoring/content/catalog/moving-features-between-objects.png?id=8ba49e26381112792e32172edf220524)
Перемещение функций между объектами
Если вы разместили функциональность по классам не самым удачным образом — это еще не повод отчаиваться. Рефакторинги этой группы показывают как безопасно перемещать функциональность из одних классов в другие, создавать новые классы, а также скрывать детали реализации из публичного доступа.
![](/images/refactoring/content/catalog/organizing-data.png?id=0be19b5980545dccb976d377ec731d30)
Организация данных
Рефакторинги этой группы призваны облегчить работу с данными, заменив работу с примитивными типами богатыми функциональностью классами. Кроме того, важным моментом является уменьшение связанности между классами, что улучшает переносимость классов и шансы их повторного использования.
- Change Value to Reference
- Change Reference to Value
- Duplicate Observed Data
- Self Encapsulate Field
- Replace Data Value with Object
- Replace Array with Object
![](/images/refactoring/content/catalog/simplifying-conditional-expressions.png?id=a551572d527946cd03b647098b67776d)
Упрощение условных выражений
Логика условного выполнения имеет тенденцию становиться сложной, поэтому ряд рефакторингов направлен на то, чтобы упростить ее.
![](/images/refactoring/content/catalog/simplifying-method-calls.png?id=0af0ac74a5d0d7f8ac33a58b4a479ee6)
Упрощение вызовов методов
Эти рефакторинги делают вызовы методов проще и яснее для понимания. Это, в свою очередь, упрощает интерфейсы взаимодействия между классами.
![](/images/refactoring/content/catalog/dealing-with-generalization.png?id=56357b115153175b2eb40563d936087c)
Решение задач обобщения
Обобщение порождает собственную группу рефакторингов, в основном связанных с перемещением функциональности по иерархии наследования классов, создания новых классов и интерфейсов, а также замены наследования делегированием и наоборот.