Przykład 12.16: warcaby4
Przykład 12.17: warcaby5
Objaśnienie
Generowanie współrzędnych zadziała poprawnie niezależnie od tego, czy użyjemy obiektu klasy AbsPionek czy PionekWarabow. Dla AbsPionek wygeneruje pustą listę. Dla klasy PionekWarcabow wygeneruje ruchy pionka warcabów (drugi wiersz wyniku).
Warto zauważyć, że metoda ruch generuje w klasie abstrakcyjnej wyjątek. Nie da się jej więc użyć tak jak losowe_ruchy. Taka implementacja bez użycia (tylko generująca wyjątek) nie jest też zgodna z zasadami zen Pythona. Uzasadnieniem dla niej byłoby tylko użycie w innej metodzie (jak losowe_ruchy).
W tym miejscu dotykamy bardzo istotnej kwestii związanej z przemysłową produkcją oprogramowania. Załóżmy, że ktoś pisze funkcję drukowania faktury a w zaimportowanym obiekcie nie ma danych dla jednego z obowiązkowych pól. Co powinien zrobić? To zależy od organizacji pracy, a nie tylko ogólnych reguł takich jak SOLID.
Przykład 12.18: warcaby6
Objaśnienie
Wykorzystując możliwość dziedziczenia z kilku klas jednocześnie, stworzony została klasa (PionekWarcabow) dziedziczący z klas IPionek i AbsPionek. Pierwsza z nich nie ma żadnej implementacji, a jedynie zdefiniowaną metodę losuj (interfejs). Zastosowanie (zgodnie z DIP) interfejsu rzeczywiście upraszcza metodę losowe_ruchy, ale musimy dodatkowo zaimplementować funkcję losuj.
Jak widać daje nam to niewiele i dyskusyjną kwestią jest to, czy nasz kod jest prostszy. Inaczej wyglądałoby to, gdyby metody w interfejsach nie wymagały jakiejkolwiek implementacji (choćby wygenerowania wyjątku).
W Python 3 ta składnia: (def przesun(self,(x,y)):) została usunięta
(PEP 3113)
– krotkę trzeba rozpakować samodzielnie wewnątrz funkcji.