Інкрементальний рефакторинг — це серія контрольованих slices

Legacy-модуль стає безпечнішим не від одного великого rewrite, а від послідовності малих змін із чіткою метою. Кожен slice має обмежений scope, non-goals, safety net, focused check і зрозумілий rollback.

Якщо під час structural refactoring виявлено bugfix, зміну бізнес-правила або новий public contract, роботу потрібно зупинити й винести це в окрему задачу.

Один slice — одна structural hypothesis

ЕлементПриклад питання
GoalЯку одну structural проблему усуваємо?
Allowed scopeЯкі файли, символи або boundary можна торкнутися?
Non-goalsЯкі API, залежності та business rules не змінюємо?
Safety netЯкий observable behavior порівнюємо до і після?
Stop conditionКоли треба повернутися до baseline або попросити рішення?

Цикл малого кроку

  1. Сформулюйте structural goal і перелік заборонених змін.
  2. Перевірте usages, tests, current baseline та dependency direction.
  3. Виконайте найменшу зміну, яка перевіряє гіпотезу.
  4. Запустіть focused check і порівняйте observable output.
  5. Прочитайте повний diff та перевірте список touched files.
  6. Створіть логічний checkpoint або commit лише після review.
  7. Оновіть modernization record фактичним результатом і відкритими ризиками.

Що не є інкрементальним refactoring

  • масове перейменування разом зі зміною поведінки;
  • оновлення framework або dependencies без окремого compatibility plan;
  • переміщення коду через десятки модулів без safety net;
  • додавання feature під час очищення legacy-класу;
  • послаблення тесту, щоб приховати regression.

Prompt для контрольованого кроку

Bounded refactoring request
Goal: extract one internal responsibility
Allowed: <one module> and focused tests
Preserve: public API, outputs, errors, side effects
Forbidden: dependency updates, feature work, broad formatting
Check: <focused command>
Stop if: behavior or scope is unclear

Канонічне джерело уроку · JavaRush

Відкрити матеріал JavaRush