Daj Się Poznać Programowanie SOLID

SOLID #3 – ZASADA PODSTAWIENIA LISKOV

W poprzednim wpisie opisałem drugą zasadę w mnemoniku SOLID czyli zasadę otwarte-zamknięte. Kontynuując, dzisiaj przyszedł czas na trzecią literę tego skrótu czyli L, a wraz z nią zasadę podstawienia Liskov (ang. Liskov substitution principle).

CO TO JEST ZASADA PODSTAWIENIA LISKOV

Funkcje które używają wskaźników lub referencji do klas bazowych, muszą być w stanie używać również obiektów klas dziedziczących po klasach bazowych, bez dokładnej znajomości tych obiektów.

Początkowo za wiele ta tajemnicza definicja nie mówiła mi. Innymi słowy, klasa dziedzicząca powinna  rozszerzać możliwości klasy bazowej a nie całkowicie zmieniać jej funkcjonalność. Sposób korzystania z klasy potomnej powinien być analogiczny do wywoływania klasy bazowej. Przyjrzyjmy się klasycznemu przykładowi łamania zasady Liskov.

PRZYKŁAD

Załóżmy, że mamy klasę Rectangle,która posiada dwie właściwości –Width, oraz Height:

public class Rectangle {

private int _width;

private int _height;


public int Width
{

  get { return _width; }

  set { _width = value; }

}

public int Height
{

  get { return _height; }

  set { _height = value; }

}

public Area => _height* _width;

}

 

Implementujemy teraz klasę Square, który reprezentuje obiekt kwadratu.

public class Square : Rectangle
{
public void SetWidth(int width)
{

  Width = width;

  Height = width;

}


public void SetHeight(int height)

{

  Width = height;

  Height = height;

}

}

 

Rozpatrzmy teraz dwa przypadki użycia tych klas:

Rectangle r = new Rectangle();

r.Width = 7;

r.Heigth = 10;


Rectangle s = new Square();

s.SetWidth(7);

s.SetHeight(10);


Console.WriteLine(r.Area);

Console.WriteLine(s.Area);

W pierwszym przypadku wyświetli się 70. A w drugim? Użytkownik będzie myślał zapewne, że również 70, ale, że została złamana zasada LSP, to zostanie wyświetlone 100.

Aby prawidłowo zaimplementować obiekt przedstawiający kwadrat – programista nie może dziedziczyć po klasie Rectangle, w taki sposób jak przedstawiłem, wszak każdy kwadrat jest prostokątem, ale nie każdy prostokąt jest kwadratem 🙂

PODSUMOWANIE

Dzisiaj poznaliśmy kolejną zasadę z kręgu SOLID. Złamanie tej  powoduje, że pośród innych powodujemy sporo trudnych do znalezienia błędów. Jeżeli chcemy pracować szybko i wygodnie to niestety lepiej nie łamać tej zasady a kwadraty i prostokąty nie powinny dziedziczyć z siebie a z bardziej ogólnego typu np.: kształt.

Do następnego!

One Comment

Dodaj komentarz