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)


Komentarze

jj

26 czerwca 2011 14:38

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

LaM

26 czerwca 2011 15:05

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)

26 czerwca 2011 23:16

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

27 czerwca 2011 07:22

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

procent

27 czerwca 2011 07:23

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

procent

27 czerwca 2011 07:24

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

29 czerwca 2011 10:03

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

29 czerwca 2011 10:15

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

29 czerwca 2011 10:16

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

30 czerwca 2011 11:09

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

1 lipca 2011 13:17

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

Antek

7 lipca 2011 12:37

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

7 lipca 2011 12:53

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

Komentarze zamknięte