fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Słowo na niedzielę, o (nie)dziedziczeniu


26.06.2011

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)

0 0 votes
Article Rating
13 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
jj
jj
12 years ago

mam nadzieję, że się nie ośmieszę (nie pierwszy i nie ostatni raz), ale czy tam nie powinno być "… who your parents…" :)

LaM
LaM
12 years ago

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.

wojtek(szogun1987)
12 years ago

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

procent
12 years ago

jj,
Ja tu tylko kopiuję i wklejam:) ale faktycznie, jak spostrzegawczo spostrzegłeś, hoho!

procent
12 years ago

LaM,
Nie ma to jak praktyka… zawsze polecam szukanie praktyk programistycznych jak najszybciej, jeszcze zanim uczelnia tego *wymaga*

procent
12 years ago

wojtek,
Dzięki za sugestię, słyszałem o tej prezentacji choć jej nie oglądałem, zapiszę sobie gdzieś "na przyszłość"

Makaryczny_Boo
Makaryczny_Boo
12 years ago

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?

procent
12 years ago

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"?:)

(Wojtek)szogun1987
12 years ago

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

Patryk yarpo Jar
12 years ago

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 :)

Makaryczny_Boo
Makaryczny_Boo
12 years ago

@(Wojtek)szogun1987, bardzo fajny przykład. Dzięki.

Antek
Antek
12 years ago

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?

procent
12 years ago

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ł:)

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również