“Jeg har haft søvnløse nætter i forsøget på at tilføje funktioner i den kode, vi har købt fra en anden virksomhed. Jeg har med den reneste form for Legacy Code at gøre”
“Jeg har virkelig svært ved at håndtere sammenfiltret, ustruktureret kode, som jeg skal arbejde med, men som jeg ikke forstår en døjt af. Legacy Code !”
Legacy code er et begreb, som nok har mange forskellige definitioner som -kode erhvervet fra en anden, kode skrevet af en anden, kode, der er svær at forstå eller kode skrevet i forældede teknologier. Uanset hvad definitionen er, mener de fleste af os, at legacy kode er skræmmende.
Spørgsmål> Hvordan vil du definere legacy kode?
Definition af legacy kode
Michael Feathers definerer i sin bog “Working Effectively with Legacy Code” legacy kode som, kode uden tests.
Kode uden tests er en dårlig kode. Det er ligegyldigt hvor godt skrevet det er; hvor godt struktureret det er; hvor godt indkapslet det er. uden tests er der ingen måde at fortælle, om vores kode bliver bedre eller dårligere.
En let modificeret version af denne definition er “kode uden unit tests kaldes legacy kode”. Det er altid bedre at have tests så tæt på koden som muligt (enhedstest > integrationstest > UI-test > UI-test). Så det ville ikke være uretfærdigt at kalde en kode uden enhedstests for legacy-kode.
Arbejde med legacy-kode
Spørgsmål> Hvilken fremgangsmåde vil du vælge, hvis du skal foretage en ændring i legacy-kode?
De fleste af os vil måske sige: “Jeg foretager ændringen og så er det slut, hvorfor bekymre mig om at forbedre koden”. Rationale bag denne tankegang kunne være –
Jeg har ikke tid nok til at refaktorisere koden, Jeg vil foretrække at foretage en ændring og afslutte min historie
Hvorfor risikere at ændre strukturen i den kode, der har kørt i produktion i lang tid
Hvad er den overordnede fordel ved at refaktorisere legacy-kode
Michael Feathers kalder denne stil med at foretage en ændring for Edit and Pray. Du planlægger og laver dine ændringer, og når du er færdig, beder og beder du mere for at få dine ændringer rigtigt.
Med denne stil kan man kun bidrage til at øge Legacy-kode.
Der er en anden stil at lave ændringer, som er Cover and Modify. Byg et sikkerhedsnet, lav ændringer i systemet, lad sikkerhedsnettet give feedback og arbejd på disse feedbacks.
Det kan roligt antages, at Cover and Modify er en vej at gå for at håndtere legacy-kode.
Spørgsmål> Men bør man overhovedet bruge tid på at skrive tests i legacy-kode eller overhovedet tænke på at refaktorisere en legacy-kode?