Если вы когда-нибудь открывали свой код спустя пару месяцев и не могли понять, что за херню вы там понаписали — поздравляю, вам нужен рефакторинг. Это не про ускорение, не про новую фичу и не про моду. Это про то, чтобы хоть кто-то, включая вас, мог с этим кодом потом работать без боли и матов.
Рефакторинг — это процесс изменения внутренней структуры исходного кода программы с целью облегчить её понимание для программиста, при этом не затрагивая её внешнего поведения и логики работы.
Основой рефакторинга является последовательность небольших изменений в коде. С каждым шагом код становится чище и понятнее. Это улучшает визуальное восприятие, облегчает сопровождение, снижает количество багов — хотя само по себе исправление багов не входит в официальную цель рефакторинга. Важно понимать: рефакторинг не делает программу быстрее и не добавляет новых функций. Это чисто про структуру и читаемость.
Рефакторинг следует делать поэтапно и регулярно, особенно в процессе активной разработки. Он реально спасает при командной работе, где важно, чтобы чужой код можно было читать и править без ритуалов с бубном.
Вот типичные сигналы, что пора рефакторить:
- Дублирование кода
- Слишком длинный метод или класс
- Громоздкая сигнатура методов (10+ параметров — это уже ад)
- Временные и бесполезные переменные/комментарии
- Данные, собранные кое-как и не по смыслу
Часто используемые приёмы рефакторинга:
- Изменение сигнатуры метода (
Change Method Signature) - Инкапсуляция поля (
Encapsulate Field) - Выделение класса (
Extract Class) - Выделение интерфейса (
Extract Interface) - Выделение локальной переменной (
Extract Local Variable) - Выделение метода (
Extract Method) - Генерализация типа (
Generalize Type) - Встраивание (
Inline) - Введение фабрики (
Introduce Factory) - Введение параметра (
Introduce Parameter) - Подъём метода (
Pull Up Method) - Спуск метода (
Push Down Method) - Переименование метода (
Rename Method) - Перемещение метода (
Move Method) - Замена условного оператора полиморфизмом (
Replace Conditional with Polymorphism) - Замена наследования делегированием (
Replace Inheritance with Delegation) - Замена кода типа подклассами (
Replace Type Code with Subclasses)
Часто ненужно рефакторить код, если он не влияет не работу программы. Зачем трогать что прекрасно работает.