Определение узкое, и в этом его смысл. Рефакторинг не добавляет возможностей и не чинит ошибки. Если во время уборки поменялось поведение, это уже другая работа, и путать их дорого: при разборе сломанного релиза непонятно, что искать.
Как это делают
- Убедиться, что участок закрыт тестами.
- Делать маленькие шаги, запуская тесты после каждого.
- Держать код рабочим после каждого шага, включая промежуточные.
Запахи кода
Фаулер собрал каталог признаков, по которым узнают проблемные места. Длинный метод, длинный список параметров, дублирование, «завистливая» функция, которая лезет в данные соседнего класса. Запах не означает ошибку. Он означает повод посмотреть внимательнее.
Когда за него берутся
Работающая практика — уборка по дороге: правишь модуль ради задачи и заодно приводишь в порядок то, что мешает. Отдельный «спринт рефакторинга» почти всегда заканчивается спором с заказчиком о том, зачем квартал ушёл на работу без видимого результата.
- Правка простой задачи каждый раз занимает дни
- Перед добавлением возможности в запутанный участок
- После прохождения теста в цикле TDD
- Код разбирают на обзоре, и никто не может объяснить, как он работает
- Нет тестов и нет возможности написать их до начала
- Код уйдёт из системы в ближайшие месяцы
- Идёт горящий инцидент: сначала чинят, уборка потом
Функция расчёта доставки разрослась до трёхсот строк с семью вложенными условиями. Разработчик обкладывает её тестами на текущее поведение, потом по одному выносит правила в отдельные функции: зона, вес, тип отправления. Поведение не меняется ни на шаг, тесты зелёные весь путь. Через месяц добавление новой зоны занимает час вместо дня.
Крупную уборку стоит заводить обычной задачей с описанием того, что станет дешевле после неё. Формулировка «привести код в порядок» не проходит приоритизацию ни у одного заказчика; «добавление новой зоны доставки перестанет занимать день» проходит. В Shtab такие задачи удобно связывать с теми, ради которых уборка затевалась: тогда видно, что она окупилась.