Uge 43 – Separation of Concerns & SRP-, ISP- og DIP-principper (fra SOLID) i praksis

Portfolio: Marlen Halvorsen

Uge 43 – Separation of Concerns & SRP-, ISP- og DIP-principper (fra SOLID) i praksis

Dato: 22-10-2025  |  Uge: 43

Kontekst

Backend-udvikling og API-design

Mål

Forklare centrale backend-designprincipper som Separation of Concerns samt SRP-, ISP- og DIP-principper.
Demonstrere hvordan principperne anvendes i praksis gennem refaktorering af en eksisterende klasse.

Proces

Dykke ned i teori bag principperne, se tilbage på tidligere læringsobjekter.
Derefter analyserede jeg en konkret klasse fra min microservice, som oprindeligt havde for mange ansvarsområder og derfor brød flere principper.
Klassen blev refaktoreret, og jeg dokumenterede ændringerne for at vise, hvordan principperne forbedrede både struktur, testbarhed og kobling.

Resultat

Separation of Concerns (SoC) SoC handler om at opdele et system i veldefinerede dele, hvor hver del har sit eget afgrænsede ansvar.
Det gør koden lettere at forstå, vedligeholde og teste.

SRP – Single Responsibility Principle SRP siger, at en klasse kun bør have ét ansvar og kun én grund til at ændre sig.
Det reducerer kompleksitet og gør fejl mindre kritiske.

ISP – Interface Segregation Principle Dette princip handler om, at interfaces skal være små og fokuserede, så klasser kun afhænger af det, de faktisk bruger.
Det skaber løs kobling og fleksibilitet.

DIP – Dependency Inversion Principle DIP betyder, at høj-niveau logik skal afhænge af abstraktioner og ikke konkrete implementeringer.
Det gør systemet udskifteligt og mere modulært.


Færdighed: Anvendelse af principperne i praksis

I mit arbejde med refaktoreringen undersøgte jeg, hvordan principperne typisk anvendes i moderne backend-arkitektur.
I stedet for at bruge et stort interface eller komplekse klasser, fokuserede jeg på at opdele funktionalitet og flytte detaljer til mindre, dedikerede komponenter.


Kompetencer: Anvendelse i min egen applikation

Jeg arbejdede konkret med klassen GoogleResultShaper, som tidligere:

  • håndterede parsing af Google Vision-data
  • udtrak logoer, OCR, web entities og objekter
  • beregnede scoringslogik
  • afledte brand og maskintype
  • byggede hele resultatet (summary + evidence)

OldShapeMethod

Klassen havde for mange ansvarsområder og brød både Separation of Concerns, SRP og DIP. Efter refaktorering, udgående afhængigheder bliver injiceret og abstraheret (DIP):

DependencyInjection

Ansvaret blev desuden opdelt:

ShapeMethod

  • Parseren håndterer al udtrækning af værdier
  • BrandResolver håndterer logik omkring brands
  • TypeResolver håndterer maskintype-logik
  • GoogleResultShaper koordinerer kun processen, men gør ikke det tunge arbejde selv
  • IResultShaper er lille og fokuseret (ISP) med èn metode, Shape

Mine ændringer har medført:

  • lavere kobling mellem komponenter
  • markant forbedret testbarhed
  • bedre fleksibilitet for fremtidige udvidelser
  • tydeligere opdeling
  • en mere robust og vedligeholdelsesvenlig microservice

Læring / refleksion

Gennem denne refaktorering har jeg fået en dybere forståelse for, hvordan Separation of Concerns og SRP-, ISP- og DIP-principperne hænger sammen i praksis.
Jeg har især fået øjnene op for, hvor hurtigt en klasse kan få for mange ansvarsområder, og hvor meget det hjælper at bryde logik ud i mindre komponenter.
Desuden har arbejdet med Dependency Injection og abstraherede interfaces givet mig en bedre forståelse for Dependency Inversion Principle og værdien af løs kobling.
Det har også gjort det tydeligt, hvor meget mere testbar, fleksibel og vedligeholdelsesvenlig min kode bliver, når hver komponent har et klart defineret ansvar.


Videre plan

Uge 44: Implementering af Kafka

Ressourcer