SOLID – Zasada podstawienia Liskov

Posted on by 0 comment

Zasada podstawienia Liskov jest jedną z zasad tworzenia efektywnego oprogramowania SOLID. Jeśli nie wiesz co to jest SOLID, tutaj znajdziesz artykuł, który wypełni tę lukę SOLID’nym materiałem.

SOLID - Zasada otwarte-zamknięte

SOLID – Zasada podstawienia Liskov

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”.

Taka jest definicja, niestety definicję mają to do siebie, że są trudnym materiałem do zrozumiałego przyswajania wiedzy. Dlatego spróbuję ją rozebrać na czynniki pierwsze, a do pełnego zrozumienia stworzę klarowny przykład zastosowania zasady podstawienia Liskov.

Śledząc uważniej powyższą definicję, możemy niewątpliwie wyszczególnić dwie struktury: klasa bazowa oraz dziedzicząca po niej klasa dziedzicząca. Pomijając zachodzące dziedziczenie, kolejnym ważnym elementem jest charakterystyka tej relacji: bez dokładnej znajomości. Znaczy ona tyle, że implementując w poprawny sposób zasadę podstawienia Liskov, nie powinniśmy się posługiwać żadnym konstrukcjami warunkowymi, aby wymusić poprawne działanie, np.:

Dostarczono nam kolejną propozycję, która ułatwia naszą pracę, ale w jakim celu? No właśnie. Celem zasady podstawienia Liskov jest uniknięcie sytuacji niezamierzonego/nieprawidłowego działania stworzonego oprogramowania. Funkcje obiektów, które zostały przypisane do referencji klas bazowych (rzutowania w górę), powinny zachowywać się w taki sam sposób zarówno w przypadku rzutowania, jak i bez. Co to znaczy?

Jeżeli nie zastosujemy zasady podstawienia Liskov sposób działania funkcji JakasFunkcja() w zależności czy jest wywoływany z obiektu ob1, czy obiektu ob2 będzie różny. Takie działanie może być zaskakujące i tworzy potencjalne źródło problemów.

Przykład

Zbuduję najpierw przykład, który nie będzie wyposażony w oręże zasady podstawienia Liskov.

Załóżmy, że piszemy oprogramowanie dla dwóch urządzeń, frezarki oraz obrabiarki. Obie maszyny mają podobną specyfikę pracy, dlatego stworzymy dwie klasy Obrabiarka oraz Frezarka. Obrabiarka będzie dziedziczyć po klasie Frezarka.

Zajmijmy się teraz uruchomieniem stworzonych maszyn.

Jak widzimy, w obu przypadkach wywołania funkcji wykorzystujemy ten sam obiekt. Mimo to uzyskujemy różne rezultaty, jest to działanie wbrew zasady podstawienia Liskov, ponieważ zmiana referencji do obiektu nie powinna wpływać na rezultat funkcji.

Jak to naprawić? Oczywiście wykorzystując polimorfizm.

Dzięki takiej implementacji, wywołanie funkcji nie zależy już od typu referencji, ale od typu obiektu. Dzięki temu uruchamiając powyższy kod, uzyskamy rezultat zgodny z omawianą zasadą SOLID.

Będąc solidnymi programistami, pokusimy się o refactoring. Nieodłącznym elementem polimorfizmu są struktury abstrakcyjne interfejsklasa abstrakcyjna. Tym razem wykorzystajmy interfejs i usprawnijmy kod w ten sposób.

Podsumowanie

Kolejna zasada SOLID za nami. Zasada podstawienia Liskov pomaga uniknąć rozczarowań wynikających z odmiennego niż zamierzone działania programu. Jest nierozerwalnym elementem, gdy programujemy z użyciem interfejsów. Zapraszam do innych artykułów, w których pisze o innych składnikach składających się na SOLID.

Dodaj komentarz