Hold koden enkel – undgå unødigt komplekse klassehierarkier

Hold koden enkel – undgå unødigt komplekse klassehierarkier

Når man arbejder med objektorienteret programmering, kan det være fristende at bygge store og avancerede klassehierarkier. Det føles ofte som en elegant løsning: alt er organiseret, og arven binder systemet sammen. Men i praksis bliver sådanne strukturer hurtigt svære at overskue, vedligeholde og udvide. Den gode kode er sjældent den mest komplekse – den er den mest forståelige.
Denne artikel handler om, hvorfor du bør holde dine klassehierarkier enkle, og hvordan du kan gøre det i praksis.
Kompleksitet sniger sig ind – ofte med de bedste intentioner
Mange udviklere starter med en simpel idé: “Jeg laver en baseklasse, så jeg kan genbruge koden.” Det giver mening – genbrug er jo en af de store fordele ved objektorienteret design. Men efterhånden som projektet vokser, bliver basisklassen fyldt med undtagelser, specialtilfælde og abstrakte metoder, som kun nogle af underklasserne bruger.
Resultatet er et system, hvor ændringer ét sted får uforudsete konsekvenser andre steder. Nye udviklere skal bruge timer på at forstå, hvordan alt hænger sammen, og fejl kan være svære at spore.
Kort sagt: det, der skulle gøre koden mere fleksibel, ender med at gøre den skrøbelig.
Arv er et værktøj – ikke en regel
Arv er et kraftfuldt redskab, men det bør bruges med omtanke. Mange problemer, der umiddelbart ser ud til at kræve arv, kan løses enklere med komposition – altså ved at kombinere objekter i stedet for at nedarve fra hinanden.
Et klassisk eksempel er, når man laver en “Bil”-klasse, der arver fra “Køretøj”. Det giver mening. Men hvis man begynder at lave “Elbil”, “Hybridbil”, “Sportsvogn” og “Familiebil” som underklasser, bliver hierarkiet hurtigt tungt. I stedet kan man lade “Bil” have en motor-komponent, som kan udskiftes – så kan man variere adfærden uden at ændre arvestrukturen.
Komposition gør koden mere fleksibel og lettere at teste, fordi du kan udskifte dele uden at ændre hele systemet.
Tænk i ansvar – ikke i hierarkier
Et godt princip er at lade hver klasse have ét klart ansvar. Hvis du opdager, at en klasse begynder at “vide for meget” eller “gøre for meget”, er det et tegn på, at du bør dele den op.
Når du designer et system, så spørg dig selv:
- Hvad er denne klasses primære formål?
- Kan den beskrives med én sætning?
- Skal den kende til mange andre klasser for at fungere?
Hvis du ikke kan svare enkelt på de spørgsmål, er det et tegn på, at designet kan forenkles.
Brug interfaces og små moduler
I stedet for at bygge dybe hierarkier kan du bruge interfaces eller små moduler til at definere adfærd. Det gør det muligt at udskifte implementeringer uden at ændre resten af systemet.
For eksempel kan du definere et interface for “Betalingsmetode” og derefter have forskellige klasser for kortbetaling, MobilePay og faktura. De deler ikke kode gennem arv, men gennem en fælles kontrakt. Det gør systemet mere robust og lettere at udvide.
Refaktorer, når du kan – ikke kun når du skal
Kompleksitet opstår gradvist. Derfor er det vigtigt at refaktorere løbende. Fjern unødvendige lag, saml duplikeret logik, og vær ikke bange for at slette kode, der ikke længere tjener et klart formål.
En god tommelfingerregel er: hvis du skal forklare for meget for at beskrive, hvordan noget virker, er det sandsynligvis for komplekst.
Enkelhed er ikke det samme som naivitet
At skrive enkel kode betyder ikke, at man skal undgå abstraktioner eller designmønstre. Det handler om at bruge dem bevidst – kun når de løser et reelt problem. Den bedste kode er den, der kan læses og forstås af en kollega uden lange forklaringer.
Som udvikler bør du altid spørge dig selv: “Gør denne struktur koden lettere at forstå – eller bare mere imponerende at se på?”
Konklusion: Byg til mennesker, ikke maskiner
Maskinerne forstår al kode, uanset hvor kompleks den er. Det er menneskerne, der skal kunne læse, ændre og udvide den. Derfor er enkelhed ikke et kompromis – det er en investering i kvalitet.
Ved at undgå unødigt komplekse klassehierarkier skaber du software, der er mere robust, lettere at teste og nemmere at vedligeholde. Og i sidste ende er det netop dét, der adskiller god kode fra dårlig.











