Instruction file imported from UnderUndre/UnderUndre (
.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: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΡΡΡΠΎΠ³ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°ΠΊ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³Π°. ΠΠ΅Π½ΡΠΉ ΡΠΈΠΏ Ρ ΠΊΠΎΡΠ½Ρ ΠΈ Π΄Π²ΠΈΠ³Π°ΠΉΡΡ ΠΏΠΎ Π΄Π΅ΡΠ΅Π²Ρ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.