Dlaczego kwadrat nie jest prostokątem?

squareZ punktu widzenia matematyka tak. Z punktu widzenia programisty jednak w żadnym wypadku nie powinien.

Główne zasady programowania obiektowego zdefiniowane przez Roberta C. Martina zawierają się w słowie SOLID:

  1. SRP, The Single Responsibility Principle (zasada jednej odpowiedzialności)
    Klasa powinna mieć jeden i tylko jeden powód do zmiany
  2. OCP, The Open Closed Principle (zasada otwarty / zamknięty)
    Klasy powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje
  3. LSP, The Liskov Substitution Principle (zasada postawienia Liskov)
    Metoda przyjmująca jako parametr egzemplarz klasy A musi działać poprawnie także dla wszystkich klas, które dziedziczą po A, bez znajomości ich typów
  4. ISP, The Interface Segregation Principle (zasada separacji interfejsów)
    Tworzone interfejsy powinny być odpowiedzialne za jak najmniejszą funkcjonalność
  5. DIP, The Dependency Inversion Principle (zasada odwrócenia zależności)
    Należy uzależniać kod od abstrakcji, nie od konkretnych implementacji.

Jak to kiedyś ktoś w sieci zabawnie podsumował: zasady te każdy zna, nie każdy rozumie i nikt ich nie przestrzega.

Poniżej opiszę zasadę LSP (Liskov) która odnosi się do problemu zawartego w temacie.

W programowaniu obiektowym relacji typu IS odpowiada dziedziczenie. Mogłoby się wydawać, że kwadrat jest szczególnym przypadkiem prostokąta przez co te dwie klasy mogłyby być zdefiniowane w następujący sposób:

Wysokość i szerokość kwadratu są sobie równe, dlatego należy nadpisać metody ustawiające te wartości.

Utworzenie przykładowych obiektów prostokąta i kwadratu:

Ok. gdzie tu jest problem? Załóżmy że chcemy przygotować metodę ustawiającą parametry prostokąta i weryfikującą wyliczony obszar:

I przekażmy do niej nowe obiekty:

I tu się pojawia prawdziwy problem. W metodzie test parametrem jest obiekt klasy Rectangle. Znamy właściwości prostokąta i wiemy że pole powierzchni jest równe iloczynowi szerokości i wysokości, dlatego ustawiwszy je na wartości 2 i 5 spodziewamy się wyniku 10. Rozczarowanie następuje gdy widzimy dla przesłanego obiektu Square wynik 25.

Właśnie ten problem opisuje zasada podstawiania Liskov, która mówi że:

Musi istnieć możliwość zastępowania typów bazowych ich podtypami.

Przecież nie chcemy łamać zasady open/close stosując weryfikację typu:

W opisywanym przykładzie klasa Square nie może być podklasą Rectangle. Można zdefiniować interfejs Shape posiadający metodę zwracającą pole powierzchni. Interfejs ten implementowałyby zarówno Rectangle jak i Square. Zachowanie metod byłoby oczekiwane, bez ukrytych zależności.

lsp

To również może Cię zainteresować:

  • Blog, rozwój, zmiany, ŚwiętaBlog, rozwój, zmiany, Święta Trochę ponad miesiąc temu postanowiłem założyć bloga - swego rodzaju osobisty notatnik programisty. To była szybka piłka, od momentu powstania pomysłu, stronę udostępniłem po trzech […]
  • Koniec ery PascalaKoniec ery Pascala To się musiało kiedyś wydarzyć - Pascal odchodzi w zapomnienie. Od przyszłego roku w szkołach średnich zastąpi go... PYTHON! W komunikacie dyrektora Centralnej Komisji Egzaminacyjnej z […]
  • Rozmowy kwalifikacyjneRozmowy kwalifikacyjne W tym tygodniu byłem na rozmowie kwalifikacyjnej w JCommerce SA. Generalnie nie szukam pracy, ale jeśli firma dzwoni do mnie bezpośrednio (bez pośredniczących head hunterów), lokalizacja […]
  • Ostatni dzwonek na przygotowanie się do e-kontroliOstatni dzwonek na przygotowanie się do e-kontroli O wprowadzeniu e-kontroli podatkowej dla przedsiębiorstw oraz jednostek administracyjnych i samorządowych mówi się już od dłuższego czasu. Płynnie zostały już wprowadzone w dużych firmach, […]
  • Raspberry PI 2, nauka podstaw Pythona 3Raspberry PI 2, nauka podstaw Pythona 3 W jednym z ostatnich wpisów zebrałem sobie źródła wiedzy do nauki Pythona, a w międzyczasie kupiłem Raspberry PI 2. Jedno z drugim jest mocno powiązane, ponieważ minikomputer standardowo […]
  • Linkedin – czyli co w trawie piszczy i skąd wiatr wiejeLinkedin – czyli co w trawie piszczy i skąd wiatr wieje Linkedin, Goldenline, a w ostatnim czasie dedykowane grupy na Facebooku. To główne źródła gdzie można znaleźć najnowsze oferty pracy. Pojawia się ich mnóstwo. W dzisiejszych czasach […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *