Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
co to jest "czyste OOP"?

To takie bez np. "friend class" z C++ (mechanizmów dzięki którym można emulować dziedziczenie).

języki programowanie są implementacją "czystego idealnego OOAD" a nie odwrotnie

czyli jest to tylko zabieg czysto techniczny (reużycie kody) a nie analityczno projektowy

Ciekawe pytanie.
Nie wiem jakie były motywy twórcy OOP kiedy "tworzył" dziedziczenie...
gdybym miał strzelać - na pewno chciał osiągnąć reusing, izolowanie działającego kodu... czy chciał usprawnić modelowanie, tego nie wiem :)

dziedziczenie (jak i model klas) to klasyfikacja, pierwsza (to chciał osiągnąć autor) była w biologii, wiec dziedziczenie to wyłącznie uogólnienie lub specjalizacja (kwestia kierunku), implementacja dziedziczenia w językach programowania to między innymi reużycie kodu.... jednak formalnie dziedziczenie to domena modeli pojęciowych a nie modeli struktury
BTW: drzewo, jako rodzaj grafu, jest najłatwiejsze w analizie.
żartujesz :)

to jaka klasa grafów jest prostsza w analizie ? :-)

grafów nie, tablice decyzyjne są szybsze od drzew bo wykonywane są w jednym kroku (podobnie jak transformata Fouriera) ....
mediator ma pewna odpowiedzialność, której nie maja klasy łączone mediatorem, podobni jak fasada czy adapter

Mimo to wciąż uważam, że jedynym sposobem na usunięcie zależności między klasami jest ich przeprojektowanie.

bardzo często tworzenie dodatkowych zależności (nowych klas) ma głęboki sens, bo "wyciąga" nadmiarowe odpowiedzialności z klas o "czystej funkcjonalności"...

Wprowadzenie nowej klasy niczego nie zmienia - te klasy dalej od siebie zależą, tyle że część logiki została wydzielona do osobnego komponentu (w sumie to nawet zabawny zabieg - projekt bez mediatora jest zły, więc wystarczy okroić istniejące klasy i z tych "cześci" zrobić nową).

wprowadzenie nowej klasy zmienia bardzo wiele, np. wprowadzenie dodatkowego adaptera w API oddzielającego konkretna bazę danych (jej tablice i SQLowe zapytania) od otoczenia korzystającego z tych danych, unizależnia reszte świata od zmian modelu relacyjnego tej bazy



Wrzucam, nie wiem po co ;-)
http://en.wikipedia.org/wiki/Mediator_pattern

i....?

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jarosław Ż.:
To takie bez np. "friend class" z C++ (mechanizmów dzięki którym można emulować dziedziczenie).
języki programowanie są implementacją "czystego idealnego OOAD" a nie odwrotnie

W sumie racja ...
Nie ma czystego i nieczystego OOP ;-)
czyli jest to tylko zabieg czysto techniczny (reużycie
kody) a nie analityczno projektowy
[..... ]
gdybym miał strzelać - na pewno chciał osiągnąć reusing, izolowanie działającego kodu... czy chciał usprawnić modelowanie, tego nie wiem :)
dziedziczenie (jak i model klas) to klasyfikacja, pierwsza (to chciał osiągnąć autor) była w biologii, wiec dziedziczenie to wyłącznie uogólnienie lub specjalizacja (kwestia kierunku), implementacja dziedziczenia w językach programowania to między innymi reużycie kodu.... jednak formalnie dziedziczenie to domena modeli pojęciowych a nie modeli struktury

A teraz pytanie: co było pierwsze - struktura, czy pojęcie ;-)
Wprowadzenie nowej klasy niczego nie zmienia - te klasy dalej od siebie zależą, tyle że część logiki została wydzielona do osobnego komponentu (w sumie to nawet zabawny zabieg - projekt bez mediatora jest zły, więc wystarczy okroić istniejące klasy i z tych "cześci" zrobić nową).

wprowadzenie nowej klasy zmienia bardzo wiele, np. wprowadzenie dodatkowego adaptera w API oddzielającego konkretna bazę danych (jej tablice i SQLowe zapytania) od otoczenia korzystającego z tych danych, unizależnia reszte świata od zmian modelu relacyjnego tej bazy

Zgadza się.
Poprzednie pisałem w kontekście "Mediatora", zależności i diagramu podesłanego przez Sebastiana.

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Sebastian M.:
dziedziczenie [...] nie da się emulować agregacją / kompozycją / asocjacją
Tylko, że celem nie powinna być emulacja, a zastąpienie dziedziczenia jakąś "słabszą", nie tak wiążącą relacją.

Dziedziczenia nie da się zastąpić kompozycją, ani żadną inną relacją.
Tzn. można iść na jakieś kompromisy podczas projektowania, ale to nie zastąpi "stosowania mechanizmów zgodnie z ich przeznaczeniem".
Sumując - jeśli na etapie projektowania najlepszym rozwiązaniem jest dziedziczenie to należy je zastosować bez wgłębiania się w to, jak będzie wyglądać diagram (o wyglądzie później).
Jeśli wychodzi, że dziedziczenie jest najlepszym rozwiązaniem, to zgadzam się, że należy je wykorzystać.
Po to w końcu ktoś dał nam taką możliwość. Jednak, jeżeli cały projekt jest w porządku, to nigdy nie będzie nam dane oglądać takich diagramów - one po prostu w takich przypadkach nie powstają.

Skoro nie powstają, to dlaczego w ogóle o nich pisałeś ? ;-)
I jakby wyglądał artykuł z którego wynika "stosuj kompozycję zamiast dziedziczenia, ale nie w sytuacjach w których lepiej zastosować dziedziczenie zamiast kompozycji" ;-)
Mechanizm dziedziczenia wprowadzono min. po to, żeby w pewnych sytuacjach, zamiast modyfikować klasę, można było na jej postawie stworzyć nową (dziedziczenie) i w niej coś nowego zaimplementować.
Ciężko mi jest przypomnieć sobie sytuację gdy nie było (sensownej i logicznej) możliwości zastąpienia dziedziczenia innym rodzajem relacji.

To podeślij proszę model w którym nie użyto dziedziczenia, a który dość ładnie oddaje hierarchię:
Zwierzę, insekt, ptak, kręgowiec, mrówka, bocian, chomik + funkcja double Rozmiar (int wiek)
Wprowadzenie mediatora nigdy nie jest rozwiązaniem tego problemu
Tylko, że ja nie napisałem, że jest to rozwiązanie problemu, a pierwszy krok ku temu rozwiązaniu.
Odseparowanie tych wszystkich zależności i zagregowanie ich w jednym miejscu często ułatwia podjęcie kolejnych kroków.

Do separowania należało by użyć interfejsow. Na diagramie masz zbiór konkretnych klas.
i to z bardzo prostego powodu - nie likwiduje, a jedynie ukrywa (na diagramie), powiązania między klasami (tzn. może ukrywać zależności między obiektami a nie konkretnymi klasami).
Ale nie to jest celem tego pierwszego kroku. Nie ukrycie, a zebranie ich wszystkich w jednym miejscu, przyjrzenie się powiązaniom pomiędzy nimi. To pozwala wyciągnąć wnioski, które ułatwiają dalszą refaktoryzację.

To temat na chyba inny artykuł ;)

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Dziedziczenia nie da się zastąpić kompozycją, ani żadną inną relacją.
Tzn. można iść na jakieś kompromisy podczas projektowania, ale to nie zastąpi "stosowania mechanizmów zgodnie z ich przeznaczeniem".
Nie zastąpisz w takim sensie, że nie zamienisz dziedziczenia na kompozycję, które będzie posiadała wszystkie możliwości, które daje dziedziczenie. Z tym się zgodzę, z tym, że nie zawsze tego wszystkiego potrzebujemy.
A czy da się zastąpić nie idąc na kompromis? Oczywiście, np. gdy Template Method zamieniasz na Strategy.
Skoro nie powstają, to dlaczego w ogóle o nich pisałeś ? ;-)
Napisałem, że " jeżeli cały projekt jest w porządku, to nigdy nie będzie nam dane oglądać takich diagramów" i dokładnie o to chodzi w moim wpisie. Jeżeli widzisz taki diagram tzn., że warto zastanowić się gdzie mógł wkraść się błąd. W sumie o tym jest cały artykuł.
To podeślij proszę model w którym nie użyto dziedziczenia, a który dość ładnie oddaje hierarchię:
Zwierzę, insekt, ptak, kręgowiec, mrówka, bocian, chomik + funkcja double Rozmiar (int wiek)
Jeżeli celem jest posiadanie metody double Rozmiar(int wiek) to uważasz, że rzeczywiście potrzebuję tutaj dziedziczenia? IMO interfejs jest wystarczający.
Odseparowanie tych wszystkich zależności i zagregowanie ich w jednym miejscu często ułatwia podjęcie kolejnych kroków.
Do separowania należało by użyć interfejsow. Na diagramie masz zbiór konkretnych klas.
Bo gdzieś musi zachodzić powiązywanie wyniesionych zależności? Jakby Twoim zdaniem miał to zrealizować interfejs?
Ale nie to jest celem tego pierwszego kroku. Nie ukrycie, a zebranie ich wszystkich w jednym miejscu, przyjrzenie się powiązaniom pomiędzy nimi. To pozwala wyciągnąć wnioski, które ułatwiają dalszą refaktoryzację.
To temat na chyba inny artykuł ;)
I to pewnie nie jeden :)

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Sebastian M.:
Skoro nie powstają, to dlaczego w ogóle o nich pisałeś ? ;-)
Napisałem, że " jeżeli cały projekt jest w porządku, to nigdy nie będzie nam dane oglądać takich diagramów" i dokładnie o to chodzi w moim wpisie. Jeżeli widzisz taki diagram tzn., że warto zastanowić się gdzie mógł wkraść się błąd. W sumie o tym jest cały artykuł.

Takim podejściem popełniasz IMHO duży błąd - nie możesz oceniać projektu aplikacji bez wiedzy, do czego będzie ona stosowana. Próbujesz ocenić rozwiązanie bez znajomości problemu.

"Takie dziedziczenie" nie jest dobre, z wyjątkiem sytuacji kiedy jest dobre.
To podeślij proszę model w którym nie użyto dziedziczenia, a który dość ładnie oddaje hierarchię:
Zwierzę, insekt, ptak, kręgowiec, mrówka, bocian, chomik + funkcja double Rozmiar (int wiek)
Jeżeli celem jest posiadanie metody double Rozmiar(int wiek) to uważasz, że rzeczywiście potrzebuję tutaj dziedziczenia? IMO interfejs jest wystarczający.

Pytanie było zbyt ogólne (albo "loaded" - prosiłem o oddanie hierarchii, a to niejako z automatu narzuca OOP) , wycofuję się z niego ;-)
Odseparowanie tych wszystkich zależności i zagregowanie ich w jednym miejscu często ułatwia podjęcie kolejnych kroków.
Do separowania należało by użyć interfejsow. Na diagramie masz zbiór konkretnych klas.
Bo gdzieś musi zachodzić powiązywanie wyniesionych zależności? Jakby Twoim zdaniem miał to zrealizować interfejs?

Powiązanie mogłoby zachodzić na poziomie interfejsów. Klasy, zamiast komunikować się ze sobą bezpośrednio (używając konkretnych typów) mogą, na nawet powinny, korzystać z obiektów które implementują konkretny interfejs.

Komunikacja powinna zachodzić na poziomie interfejsu, a nie obiektu konkretnej klasy.
Ale nie to jest celem tego pierwszego kroku. Nie ukrycie, a zebranie ich wszystkich w jednym miejscu, przyjrzenie się powiązaniom pomiędzy nimi. To pozwala wyciągnąć wnioski, które ułatwiają dalszą refaktoryzację.
To temat na chyba inny artykuł ;)
I to pewnie nie jeden :)

Nie mogę się doczekać ;-)

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Takim podejściem popełniasz IMHO duży błąd - nie możesz oceniać projektu aplikacji bez wiedzy, do czego będzie ona stosowana. Próbujesz ocenić rozwiązanie bez znajomości problemu.
Taki diagram jest sygnałem, że coś jest nie tak. Chodzi o to, że widząc coś takiego nie "lecisz dalej", tylko zatrzymujesz się i zadajesz pytanie "dlaczego", "jakie były motywy"? Jak to zrobić lepiej? Czy się da? Stwierdzasz, że nie tak powinien wyglądać diagram po samym rysunku, zmieniasz projekt dopiero po zrozumieniu problemu. Z resztą, inaczej byłoby ciężko :)
Powiązanie mogłoby zachodzić na poziomie interfejsów. Klasy, zamiast komunikować się ze sobą bezpośrednio (używając konkretnych typów) mogą, na nawet powinny, korzystać z obiektów które implementują konkretny interfejs.
Jasne, że powinny. Podsunąłem jednak konkretną propozycję rozwiązania, a czy tego mediatora przedstawisz jako klasę czy interfejs to już sprawa drugorzędna. Ogólnie, tak jak pisałem, powinien to być punkt wyjścia do lepszego rozwiązania, a nie cel podróży.
Pisałem o klasie, bo na poziomie implementacji zarządzanie zależnościami jest realizowane przez konkretny obiekt.
Komunikacja powinna zachodzić na poziomie interfejsu, a nie obiektu konkretnej klasy.
Tak, obiekt powinien komunikować się za pośrednictwem interfejsów, bez wiedzy na temat konkretnych klas. Co nie zmienia tego, że ta komunikacja jest widoczna i dzięki temu można zastanowić się nad dalszą refaktoryzacją.

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Sebastian M.:
Jakub W.:
Takim podejściem popełniasz IMHO duży błąd - nie możesz oceniać projektu aplikacji bez wiedzy, do czego będzie ona stosowana. Próbujesz ocenić rozwiązanie bez znajomości problemu.
Taki diagram jest sygnałem, że coś jest nie tak. Chodzi o to, że widząc coś takiego nie "lecisz dalej", tylko zatrzymujesz się i zadajesz pytanie "dlaczego", "jakie były motywy"? Jak to zrobić lepiej? Czy się da? Stwierdzasz, że nie tak powinien wyglądać diagram po samym rysunku, zmieniasz projekt dopiero po zrozumieniu problemu.

Albo nie zmieniasz (bo jest dobry w kontekście zadanej funkcjonalności) :-)
Dlaczego dziedziczenie jest złe ?
Powiązanie mogłoby zachodzić na poziomie interfejsów. Klasy, zamiast komunikować się ze sobą bezpośrednio (używając konkretnych typów) mogą, na nawet powinny, korzystać z obiektów które implementują konkretny interfejs.
Jasne, że powinny. Podsunąłem jednak konkretną propozycję rozwiązania, a czy tego mediatora przedstawisz jako klasę czy interfejs to już sprawa drugorzędna. Ogólnie, tak jak pisałem, powinien to być punkt wyjścia do lepszego rozwiązania, a nie cel podróży.

Jak oceniasz jakość diagramów (lepsze rozwiązanie) ? Czy masz jakąś konkretną metodę czy robisz to "na oko" ?

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Dzień dobry,

chciałbym prosić o podsumowanie albo krótki przegląd tego tematu.:-)
Ponieważ zaczytam tracić wątek...
Zresztą zrobiło się dużo wątków...

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Albo nie zmieniasz (bo jest dobry w kontekście zadanej funkcjonalności) :-)
Jeżeli autor przekonałby mnie, że rzeczywiście jest to najlepsze rozwiązanie danego problemu, to tak, nie zmieniałbym.
Dlaczego dziedziczenie jest złe ?
Dziedziczenie nie jest złe. Zbytnio generalizujesz. Jeżeli jednak powstaje drzewo klas związanych ze sobą poprzez dziedziczenie to IMO coś jest nie tak.
Jak oceniasz jakość diagramów (lepsze rozwiązanie) ? Czy masz jakąś konkretną metodę czy robisz to "na oko" ?
Są rzeczy (m.in. te wspomniane w artykule), które rzucają się w oczy i z dużym prawdopodobieństwem świadczą o tym, że coś w którymś momencie poszło nie tak. Jednak ostateczną decyzję rozwiązania (bo diagram jest jedynie jego wizualizacją) należy zrozumieć problem i go przeanalizować.
"Na oko" mogę wyłowić jedynie kilka (nie wszystkie) rzeczy, które moim zdaniem mogą być problematyczne.

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Przemysław W.:
Dzień dobry,
Witam :)
chciałbym prosić o podsumowanie albo krótki przegląd tego tematu.:-)
Ponieważ zaczytam tracić wątek...
Zresztą zrobiło się dużo wątków...
Wydaje mi się, że jeszcze trzymamy się głównego wątku. Krótkie podsumowanie - czy da się ocenić jakość projektu jedynie na podstawie jego wizualizacji (w tym konkretnym przypadku - na podstawie diagramów klas). I na ile ta ocena jest poprawna.Ten post został edytowany przez Autora dnia 16.12.14 o godzinie 17:06

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Sebastian M.:
Dlaczego dziedziczenie jest złe ?
Dziedziczenie nie jest złe. Zbytnio generalizujesz.
Jeżeli jednak powstaje drzewo klas związanych ze sobą poprzez dziedziczenie to IMO coś jest nie tak.

Dziedziczenie nie jest złe, o ile jego stosowanie nie doprowadzi do powstania drzewa hierarchii klas ? :-)
Jak oceniasz jakość diagramów (lepsze rozwiązanie) ? Czy masz jakąś konkretną metodę czy robisz to "na oko" ?
Są rzeczy (m.in. te wspomniane w artykule), które rzucają się w oczy i z dużym prawdopodobieństwem świadczą o tym, że coś w którymś momencie poszło nie tak.

:-) Pora na syntezę....

1. Nie wiedziałeś do czego służą diagramy

2. Nie wiesz, jak oceniać jakość diagramów
.. diagramy mogą być czytelne / nieczytelne, zgodne z resztą dokumentacji / niezgodne z resztą dokumentacji

3. Oceniasz jakość rozwiązania (a raczej jego ilustracji) abstrahując od problemu

4. Odrzucasz pewne narzędzia ponieważ są "złe" i nie potrafisz wyjaśnić na czym ta "złość" polega ew. akceptujesz "złe" narzędzia, ale tylko pod warunkiem że się ich nie używa (dziedziczenie bez hierarchii)

...przyznaję nagrodę internetów i przypominam tytuł "Diagram prawdę Ci powie".Ten post został edytowany przez Autora dnia 18.12.14 o godzinie 19:00

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Sebastian M.:
Dziedziczenie nie jest złe. Zbytnio generalizujesz.
Jeżeli jednak powstaje drzewo klas związanych ze sobą poprzez dziedziczenie to IMO coś jest nie tak.
Dziedziczenie nie jest złe, o ile jego stosowanie nie doprowadzi do powstania drzewa hierarchii klas ? :-)
Dziedziczenie nie jest złe. W ogóle. To jest jak z każdym innym narzędziem. Efekt końcowy po prostu nie musi być zadowalający/poprawny.

:-) Pora na syntezę....
[...]
Cóż, pozostaje mi zapytać - skąd takie wnioski?
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
A teraz pytanie: co było pierwsze - struktura, czy pojęcie ;-)

złe pytanie: Klient jako kupujący u nas to pojęcie, klasa Klient/DaneKlienta to struktura i oba funkcjonują w dokumentacji i projekcie na równych prawach
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Dziedziczenia nie da się zastąpić kompozycją, ani żadną inną relacją.

nie zastępujemy dziedziczenia kompozycją ale modelujemy daną złożoność jako kompozycje a nie dziedziczenie... to fundamentalna różnica...

innymi słowy: zamiast "dokumentów konkretnych" dziedziczących po "dokumencie ogólnym" (jedna z głupszych konstrukcji jakie widuję) stosujemy konkretne agregaty "dokument konkretny" będące kompozycją cech (struktura dokumentu). Zamiast struktury dziedziczenia faktura, WZ, pismo do prokuratury, dziedziczy po "dokument", tworzymy osobne osobne agregaty (czyli kompozycje) dla każdego typu dokumentu, dzięki temu to nie tworzymy fikcji jakoby WZ miało coś wspólnego z pismem do sądu, i nie tworzymy szkodliwej zależności (superklasa) pomiedzy jednak niezależnymi biznesowo obiektami jakimi są te dokumenty.

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Sebastian M.:
Dziedziczenie nie jest złe. Zbytnio generalizujesz.
Jeżeli jednak powstaje drzewo klas związanych ze sobą poprzez dziedziczenie to IMO coś jest nie tak.
Dziedziczenie nie jest złe, o ile jego stosowanie nie doprowadzi do powstania drzewa hierarchii klas ? :-)
Dziedziczenie nie jest złe. W ogóle. To jest jak z każdym innym narzędziem. Efekt końcowy po prostu nie musi być zadowalający/poprawny.

"Widząc taki diagram należy „pognębić” trochę autora diagramu i zapytać się o motywy i powody stworzenia takiej konstrukcji. Bo, cóż… to nie jest dobre rozwiązanie. I nie trzeba się wgłębiać w logikę, nawet nie trzeba wiedzieć o jaką aplikację chodzi. Takie drzewo zależności (czyli po prostu struktura dziedziczenia) może być jedynie źródłem wielu problemów w przyszłości. "

Idziesz w zaparte, a mi nie chce się powtarzać.

PS. Muszę przyznać - na diagramie jest potencjalnie jedna "ciekawostka".

Obrazek


:-) Pora na syntezę....
[...]
Cóż, pozostaje mi zapytać - skąd takie wnioski?

Nie chce mi się powtarzać :-)Ten post został edytowany przez Autora dnia 19.12.14 o godzinie 19:55

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jarosław Ż.:
Dziedziczenia nie da się zastąpić kompozycją, ani żadną inną relacją.

nie zastępujemy dziedziczenia kompozycją ale modelujemy daną złożoność jako kompozycje a nie dziedziczenie... to fundamentalna różnica...

Rozumiem.
Wciąż jednak uważam, że pewne zjawiska (byty) łatwiej / lepiej modelować poprzez dziedziczenie.
Dla przykładu strumienie danych (Streams) / elementy GUI (przyciski, ramki, etc ... ).

Oczywiście można do tego użyć kompozycji, ale gdybym miał wybrać ...
innymi słowy: zamiast "dokumentów konkretnych" dziedziczących po "dokumencie ogólnym" (jedna z głupszych konstrukcji jakie widuję) stosujemy konkretne agregaty "dokument konkretny" będące kompozycją cech (struktura dokumentu). Zamiast struktury dziedziczenia faktura, WZ, pismo do prokuratury, dziedziczy po "dokument", tworzymy osobne osobne agregaty (czyli kompozycje) dla każdego typu dokumentu, dzięki temu to nie tworzymy fikcji jakoby WZ miało coś wspólnego z pismem do sądu

oczywiście, że mają coś wspólnego - można je wydrukować (metodę "drukuj") i zapisać (metoda "zapisz") :-)

.. poprzednie to oczywiście żart :-)
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Jarosław Ż.:
Dziedziczenia nie da się zastąpić kompozycją, ani żadną inną relacją.

nie zastępujemy dziedziczenia kompozycją ale modelujemy daną złożoność jako kompozycje a nie dziedziczenie... to fundamentalna różnica...

Rozumiem.
Wciąż jednak uważam, że pewne zjawiska (byty) łatwiej / lepiej modelować poprzez dziedziczenie.
Dla przykładu strumienie danych (Streams) / elementy GUI (przyciski, ramki, etc ... ).

tu tak, ale to konstruktory takie jak Dekorator :)

Oczywiście można do tego użyć kompozycji, ale gdybym miał wybrać ...

też bym wybrał wzorzec Dekorator :), w zasadzie opiera się na dziedziczeniu, tu dziedziczenie użyto jako metode re-użycia kodu
innymi słowy: zamiast "dokumentów konkretnych" dziedziczących po "dokumencie ogólnym" (jedna z głupszych konstrukcji jakie widuję) stosujemy konkretne agregaty "dokument konkretny" będące kompozycją cech (struktura dokumentu). Zamiast struktury dziedziczenia faktura, WZ, pismo do prokuratury, dziedziczy po "dokument", tworzymy osobne osobne agregaty (czyli kompozycje) dla każdego typu dokumentu, dzięki temu to nie tworzymy fikcji jakoby WZ miało coś wspólnego z pismem do sądu

oczywiście, że mają coś wspólnego - można je wydrukować (metodę "drukuj") i zapisać (metoda "zapisz") :-)

.. poprzednie to oczywiście żart :-)

;)

konto usunięte

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jarosław Ż.:
Dziedziczenia nie da się zastąpić kompozycją, ani żadną inną relacją.
nie zastępujemy dziedziczenia kompozycją ale modelujemy daną złożoność jako kompozycje a nie dziedziczenie... to fundamentalna różnica...
Rozumiem.
Wciąż jednak uważam, że pewne zjawiska (byty) łatwiej / lepiej modelować poprzez dziedziczenie.
tu tak, ale to konstruktory takie jak Dekorator :)
też bym wybrał wzorzec Dekorator :), w zasadzie opiera się na dziedziczeniu, tu dziedziczenie użyto jako metode re-użycia kodu

Dekorator to potężne narzędzie i można robić z nim cuda, ale wciąż - nie może ono zastąpić dziedziczenia, choćby dlatego, że zawsze operuje na interfejsie (metodach publicznych) danej klasy a nie na jej "wnętrznościach". Dekoratorem nie można zmodyfikować / zaimplementować / odwołać się do metody protected.

Moim zdaniem dyskusja sprawdza się do tego, czy dziedziczenie może być użytecznym narzędziem modelowania. Moim zdaniem takim jest (przynajmniej w znanych mi dziedzinach) i są na to konkretne przykłady.
Jarosław Żeliński

Jarosław Żeliński Analityk i
Projektant Systemów

Temat: Częste błędy na diagramach UML dziedziczenie i użycie

Jakub W.:
Moim zdaniem dyskusja sprawdza się do tego, czy dziedziczenie może być użytecznym narzędziem modelowania. Moim zdaniem takim jest (przynajmniej w znanych mi dziedzinach) i są na to konkretne przykłady.

owszem, ale mamy dwa rodzaje modeli (ten sam diagram klas):
- pojęciowe
- struktury (a dyskusja toczy sie o modelu dziedziny systemu czyli logice biznesowej)

w pierwszym jak najbardziej dziedziczenie jest wykorzystywane, w drugim właśnie nie ma sensu, bo dziedziczenie - jako związek - nie modeluje żadnej rzeczywistości, rzeczywistość to albo proste obiekty albo ich agregaty (śróbka vs. samochód), dziedziczenie to wprowadzanie abstrakcji (superklasa) a rzeczywistość - jak sama nazwa wskazuje - to nie jest abstrakcja

Następna dyskusja:

Scenariusze w diagramach UML




Wyślij zaproszenie do