Instruction file imported from UnderUndreGH/undrestrator (
.github/instructions/legacy-code.instructions.md). Copyright stays with the author.
🧟 Legacy Code & Refactoring (Michael Feathers Standards)
Правила работы с запутанным легаси-кодом на основе Working Effectively with Legacy Code. Главный принцип: мы не переписываем код вслепую, мы берём его в программные тиски.
1. The Legacy Code Change Algorithm (Алгоритм укрощения)
- Identify: Найди точки, куда нужно внести изменения.
- Find Test Points: Найди места, где можно написать тесты для проверки этих изменений.
- Break Dependencies: Разорви зависимости, мешающие созданию объекта в тесте.
- Write Tests: Напиши Characterization Tests.
- Refactor: Только теперь вноси изменения и улучшай дизайн.
2. Seams & Breaking Dependencies (Швы и изоляция)
- Seam (Шов): Место в коде, где можно изменить поведение программы, не редактируя сам исходный код. Используй Object Seams (передача зависимостей через интерфейсы).
- Sensing & Separation: Разрывай зависимости, чтобы отвязать код от тяжелой среды (БД, сеть) и получить доступ к результатам (передав Fake-объект).
3. Safe Feature Addition
- Sprout Method/Class (Почкование): Напиши новый функционал как новый, протестированный метод. Вызови его из старого кода.
- Wrap Method/Class (Обертывание): Переименуй старый метод, создай новый с таким же именем, вызови в нем старый и добавь свою логику.
4. Characterization Tests (Характеризационные тесты)
- Пиши тесты на то, что система делает по факту прямо сейчас, а не по ТЗ. Сделай ложный
assert, посмотри реальный вывод, зафиксируй его в тесте. Это твои "тиски".
5. Mental Discipline
- Scratch Refactoring: Если код сложный, сделай отдельную ветку, порви его на куски без тестов, чтобы понять логику. Понял? Выбрасывай черновик (revert) и пиши на чистовик с тестами.
- Lean on the Compiler: Используй строгую типизацию как инструмент рефакторинга. Меняй тип у корня и двигайся по дереву ошибок компиляции.