Na studiach wpaja się nam zasady programowania obiektowego. Niestety, bardzo często osoby wpajające tą wiedzę mają zerowe doświadczenie w praktycznym jej wykorzystaniu. Mówią coś, bo to samo im kiedyś powiedziano, i tak dalej i tak dalej. Jedną z nieodłącznych cech obiektowości jest oczywiście dziedziczenie. Ileż to razy trzeba było rysować na zajęciach diagramy UML z durną przykładową hierarchią “animal -> mammal -> monkey” czy “vehicle -> engine vehicle -> car“… a nikt tak naprawdę nie wytłumaczył dokładnie “dlaczego to jest takie dobre i dlaczego jest to jedyna droga“.
Po pewnym czasie programista-praktyk dowiaduje się, że to wcale NIE JEST jedyna droga. Że przeładowanie tworzonego rozwiązania skomplikowanymi hierarchiami dziedziczenia wcale nie kończy się dobrze. Poznaje genialną zasadę (niebędącą jednak bezpośrednim bohaterem dzisiejszego odcinka): favor composition over inheritance. Dodatkowo niektórzy umieją ująć to w bardziej interesujący sposób:
In 21st century we don’t care about who you parents were so let’s apply it to classes – don’t use inheritance
Źródło: Kevlin Henney na konferencji NDC (retweeted by Szymon Pobiega)
mam nadzieję, że się nie ośmieszę (nie pierwszy i nie ostatni raz), ale czy tam nie powinno być "… who your parents…" :)
Kończę studia i jestem nadal przesiąkniety teoretycznymi teoriami , ale ponad roczny staż pracy uświadomił mi , że dziedziczenia używa się bardzo rzadko.
Wszystkim programistom swiezo po studiach proponuje poszukac prezentacji Slawka Sobotki na temat Software Craftmanship. Zostaje w pewnym momencie poruszony uczony nas na studiach model zwierzatek oraz dlaczego sposob jego rozwiazania uczony w szkole jest zly (eksplozja kombinatoryczna).
Jednak z gory uprzedzam przed zachwyceniem sie fragmentem o Bentleyu (w koncu wiekszosc ludzi jezdzi VolksWagenami).
jj,
Ja tu tylko kopiuję i wklejam:) ale faktycznie, jak spostrzegawczo spostrzegłeś, hoho!
LaM,
Nie ma to jak praktyka… zawsze polecam szukanie praktyk programistycznych jak najszybciej, jeszcze zanim uczelnia tego *wymaga*
wojtek,
Dzięki za sugestię, słyszałem o tej prezentacji choć jej nie oglądałem, zapiszę sobie gdzieś "na przyszłość"
Nie jestem tak doświadczony jak wielu praktyków i bardzo ciekawi mnie rozwinięcie tematu. Mógłbyś podać ze swojej strony jakieś proste przypadki w których stosowania dziedziczenia jest porażką? Gdy ja widzę relację klas "jest" np. jabłko jest owocem to bezmyślnie już tworzę relację bazującą na dziedziczeniu. Czego powinienem się wystrzec?
Makaryczny_Boo,
Zapisuję sobie do listy pomysłów na posty, postaram się jakiś przykład opisać w przyszłości.
W ilu systemach z życia wziętych masz relację "owoc -> jabłko" albo "zwierzę -> gronostaj"?:)
Przykład Sławka:
Mamy zwierze, które może ma 2 metody jedz i poruszaj się. Jeżeli stworzysz schemat:
abstract Zwierzę (public abstract Jedz, public abstract PoruszajSie)
abstract Mięsożerne (public abstract PoruszajSie) || abstract Roślinożerne (public abstract PoruszajSie)
Lew|Rekin|Sokół||Sarna|Wróbel|Delfin
Będziesz musiał powielać implementacje poruszania się.
Jeżeli teraz podejdziesz do tego:
Tworzysz inerfejsy IStrategiaJedzenia || IStrategiaPoruszaniaSie
Implementujesz je JedzenieRoslin | JedzenieMiesa || Chodzenie | Latanie | Plywanie
Abstract Zwierze (protected abstract StrategiaJedzenia, protected abstract StrategiaPoruszaniaSie)
Lew|Rekin|Sokół|Sarna|Wróbel|Delfin
Sądzę, że akurat _programista_ to czy po studiach czy w trakcie czy bez, to nie jest przesiąknięty tylko teorią :).
Jeśli jest, to jeszcze nie jest programistą, a co najwyżej informatykiem :)
@(Wojtek)szogun1987, bardzo fajny przykład. Dzięki.
W sumie dziedziczenie to narzędzie jak każde inne. Dobre do pewnych rzeczy do innych nie za bardzo. W sumie tak samo jak obiektowość.
Aha jeszcze jedno. Co robisz w następny weekend?
Antek,
Z dziedziczeniem jest ten problem, że w trakcie edukacji nie pokazuje się gdzie ono jest faktycznie potrzebne. A faktycznie potrzebne może być bardziej w kodzie frameworka niż w kodzie aplikacji. A kod frameworka piszę się zdecydowanie rzadziej, niż kod aplikacji.
Co do weekendu to zapodawaj na jakiś prywatny kanał:)