curve

Liskov Substitution Principle

Morten Hoffmann

Ejer og bestyrelsesmedlem 26. maj 2013 øje

Liskov Substitution Principle

Følgende artikel 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 fx 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 – selv om 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å fx 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

Kan vi hjælpe dig med noget?

Lars Høgsted

CEO

T: (+45) 2195 6400