Если вы когда-нибудь открывали свой код спустя пару месяцев и не могли понять, что за херню вы там понаписали — поздравляю, вам нужен рефакторинг. Это не про ускорение, не про новую фичу и не про моду. Это про то, чтобы хоть кто-то, включая вас, мог с этим кодом потом работать без боли и матов.

Рефакторинг — это процесс изменения внутренней структуры исходного кода программы с целью облегчить её понимание для программиста, при этом не затрагивая её внешнего поведения и логики работы.

Основой рефакторинга является последовательность небольших изменений в коде. С каждым шагом код становится чище и понятнее. Это улучшает визуальное восприятие, облегчает сопровождение, снижает количество багов — хотя само по себе исправление багов не входит в официальную цель рефакторинга. Важно понимать: рефакторинг не делает программу быстрее и не добавляет новых функций. Это чисто про структуру и читаемость.

Рефакторинг следует делать поэтапно и регулярно, особенно в процессе активной разработки. Он реально спасает при командной работе, где важно, чтобы чужой код можно было читать и править без ритуалов с бубном.

Вот типичные сигналы, что пора рефакторить:

  • Дублирование кода
  • Слишком длинный метод или класс
  • Громоздкая сигнатура методов (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)