search

Interface Segregation Principle

Som et af de fem S.O.L.I.D. design-principper hjælper Interface Segregation Principle (ISP) med til at forhindre udbredelsen af spaghetti-kode som med tiden enten stivner eller rådner væk.

ISP siger:

Brugere af en klasse skal ikke tvinges til at afhænge af metoder de ikke har brug for

Problem

Antag at du har udviklet en RandomNumberGenerator klasse du er ret tilfreds med. Klassen tjener sit formål og kan gentagne gange præsentere en "tilfældig" række af de samme tal. Men, du indser at kravene til generatoren ændrer sig således at den på tværs af kald ikke længere kan nøjes med at returnere den samme række af tal (for hvor tilfældigt er det?), men fra gang til gang må præsentere en ny tal række. Undersøges litteraturen finder vi ud af at pseudo random number generators benytter sig af en "seed" værdi til at opnå de forskellige talrækker og det er derfor fristende at nedarve den eksisterende klasse og lade den implementere et nys indført ISeedable interface som netop kan stille med en seed værdi.

Overtraedelseafisp

Overtrædelse af ISP

Problemet er blot, at vi med denne løsning overtræder ISP princippet idet vores RandomNumberGenerator klasse ikke har brug for seed værdien, men bliver tvunget til at afhænge af ISeedable pga. den nedarvede SeededRandomNumberGenerator implementation.

En mulig løsning

Der er i virkeligheden flere måder hvorpå vi kan genoprette ISP overtrædelsen, men een af måderne er ved at huske på reglen:

Adskilte klienter betyder adskilte interfaces

Seeder klassen har i ovenstående eksempel brug for at videregive sine seed værdier via ISeedable interfacet. SeededRandomNumberGenerator klassen har brug for RandomNumberGenerator klassen ("interfacet") i sin implementation.

Men, de to klasser, Seeder og SeededRandomNumberGenerator, er adskilte hvorfor deres interfaces også bør være adskilte!

Fixafispovertraedelse

Fix af ISP overtrædelse

Vi bryder med den tvungne arv af ISeedable og benytter kun interfacet i SeededRandomNumberGenerator, hvor der er behov for det.

Andre løsninger kunne være brugen af Adapter design pattern'et med delegering som anført i [1].

Referencer

[1] “Agile, Principles, Patterns and Practices in C#”, Martin/Martin

STRONGMINDS 

STRONGMINDS er et software-udviklingshus i vækst. Vi har solid erfaring med cloududvikling og integration af forretningssystemer og andet udstyr. Vi laver solidt software-håndværk, der giver værdi til din forretning, og du er altid velkommen til at kontakte os, så vi kan drøfte dine muligheder. 

Kontakt Icon Kontakt

STRONGMINDS 

INCUBA - Katrinebjerg

Åbogade 15 

DK - 8200 Aarhus N

 

T: (+45) 7026 6416

E: info@strongminds.dk

ERFA-gruppe for software-udviklingschefer

STRONGMINDS After Work er en ERFA-gruppe for softwareudviklingschefer i Østjylland med en LinkedIn-gruppe og relevante gå-hjem-møder, der kan skabe samarbejde, dialog og relationer. Sammen vil vi løfte og udvikle niveauet og miljøet for softwareudvikling som profession. Er det noget for dig, så kontakt os gerne.