Liskov Substitution Principle

 Følgende post omhandler Liskov Substitutions princippet fra S.O.L.I.D., som i en meget forenklet form kan udtrykkes:

Nedarvede klasser skal kunne substituteres med deres base klasser (*)

Det klassiske (og mest håndgribelige) eksempel på LSP er en overtrædelse: Såfremt du modellerer en firkant som et rektangel (med samme bredde / højde) overtræder du LSP, idet vi kan opfinde metoder = properties (egenskaber), der fungerer for et rektangel, men som ikke fungerer for en firkant.

Tænk f.eks. på en metode som følger:

int GetAreaFromSetProportions(Rectangle o, int width, int height)
{
  o.Width = width;
  o.Height = height;
  return o.Area();
}

Metoden returnerer det forventelige for et Rectangle, men såfremt o er en Square vil metoden for alle proportioner med forskellig højde og bredde returnere et forkert resultat. Overvej hvordan de to properties er implementeret for en Square - selvom vi har repareret på vores antagelse om at en Square er-et Rectangle og har husket at sætte bredden hver gang vi sætter højden (og vise versa), så vil metoden ovenfor altid returnere arealet baseret på værdien af den angivne højde.

For denne metode kan vi altså ikke substituere Squares med Rectangles.

Fodnote

(*) Egentligt formuleres princippet mere i termer af egenskaber som siges at være opfyldt for objekter af typen T. De selv samme egenskaber skal da gælde for objekter af typen S hvor S er en subtype af T. Læs mere på f.eks. http://en.wikipedia.org/wiki/Liskov_substitution_principle

Referencer

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

[2] http://www.engr.mun.ca/~theo/Courses/ssd/pub/sd-principles-3.pdf

 

Add comment

Loading