Some of posts from this blog has been moved to dywicki.pl. You will be automatically redirected to new blog if you would submit comment.
New posts are published on dywicki.pl, this blog contains old content and it is not continued.

Niektóre posty z tego bloga zostały przeniesione do dywicki.pl. Zostaniesz automatycznie przekierowany jeśli bedzięsz chciał dodać komentarz.
Nowe posty sa publikowane na dywicki.pl, ten blog zawiera stare treści i nie jest kontynuowany.

Jak widzę kod?

Filed under Java,PHP,UML by

Tak pod wpływem natchnienia publikuję przykład diagramu klas reprezentujący kompozycje (zawieranie).
Diagram wykonany w programie Visual Paradigm. Komentarz usunięty ponieważ zachodził na klasy. :) diagram klas
Kod (PHP):

<php class Jablon {     /**      *@var Jablko owoce znajdujace sie na drzewie      **/     protected $owoce = array(); } class Jablko {     /**      *@var mixed smak owocu      **/     protected $smak; } >

Związek jest określony – jedna instancja klasy Jablon może zawierać wiele owowców, ale może tych owoców nie być wcale. Zapis można sprecyzować: Jablon: 1..n, Jablko 1 oznacza, że jedna instancja klasy Jablko moze znajdowac się tylko w jednym obiekcie Jablon.
Jeśli się mylę, proszę o sprostowanie. Za jakiś czas kod w wersji dla Javy. ;)

19 responses so far

19 Responses to “Jak widzę kod?”

  1. theoden says:

    Lepszy przykład byłby z sadem. W sadzie powiedzmy sa jablonie, grusze itd lub po prostu owoce, które zleciały na ziemię :)

  2. seaquest says:

    Czemu nie opublikujesz tego np. w PHPedia.pl ?

  3. splatch says:

    seaquest: ponieważ wpis jest skromny, a phpedia jest martwa.

  4. NuLL says:

    Jak dla mnie brakuje klasy galezi oraz kisci ktory powinna byc czyms w rodzaju kolekcji podobnie jak i wszystkie inne obiekty poza pojedynczym jakblkiem ;)

  5. seaquest says:

    phppl.ezpublish.no/wortal…
    Jest martwa? A poza tym będzie martwa jeżeli nikt nie będzie publikował, a artykuł zawsze można rozbudować prawda? Początki zawsze są trudne.

  6. Sędziwój says:

    Tylko czy to na pewno kompozycja…
    Co prawda jabłko nie może powstać bez jabłoni, ale może bez niej istnieć.

  7. pakalk says:

    Jak na moj gust to agregacja, a nie kompozycja, poniewaz cykl zycia Jablka nie jest powiazany z Jablonia (nie jest tworzony w jednym czasie, nie niszczeje w jednym czasie, moze istniec poza nia).

    Co do krotnosci “Jablon: 1..n, Jablko 1” – z tego co ja rozumiem, to jeden egzemplarz jablka powiazany by byl z jedna, badz wiecej Jablonia. De facto: to samo jablko rosloby na kilku drzewach – co przeczy kompozycji.

    Przy #owoce mozna by dac krotnosc, choc to intuicyjnie wyczuwa sie przy agregacji (mnie jakos nigdy sie ona nie kojarzy z jednym egzemplarzem). Wiem, ze tutaj jest ona oznaczona przy powiazaniu, ale jakby miec np. drugi atrybut: #zgnile_owoce, to nie wiadomo, do ktorego by sie to odnosilo.. no i pewnie nalezaloby wprowadzic role danych powiazan.

    Nawigacja tez nie jest okreslona (tzn. jest domyslnie dwukierunkowa), wiec mozliwa jest implementacja z przechodzeniem z Jablka na Jablon, ale to jest jasne ;)

    OK, nie jestem specem od UML, wiec mnie poprawcie, jesli cos zle rozumuje – napisalem tylko to, co mnie przychodzi do glowy ;)

  8. nandrew says:

    Hej
    Przypadkiem wpadłem na twojego bloga i przykuł moją uwagę tag “uml” ;)
    Mały komentarz do diagramu:
    – brakuje kierunku (ale to nie jest duży błąd, zazwyczaj czytelnik domyśli o co chodzi przy kompozycji);
    – relacja powinna mieć nazwaną rolę (obok ‘*’ napisane “#owoce”);
    – jeżeli zaznaczasz zależność klasy poprzez rysowanie relacji, to nie dodawaj tego w klasie jako pole (albo jedno albo drugie, unikaj redundancji);
    – jeżeli zaznaczasz listy czy inne kolekcje to pisz liczebność np: “Owoce: Jabłko[*]” (gdy nie zaznaczasz relacji na diagramie);
    – po co oznaczyłeś pola klasy jako chronione? nie widzę dziedziczenia więc powinny być po prostu prywatne;

    Uwagi do komentarzy:
    – czy to jest kompozycja czy agregacja zależy od systemu, a nie od tego czy w rzeczywistości “jabłko może istnieć bez drzewa”. Generalnie to “Jabłoń” zarządza jabłkami, więc kompozycja jest ok. Nie ma innych klas, więc Jabłko nie miało by nawet gdzie istnieć bez Jabłoni;
    – BTW: agregacji powinno się unikać, ponieważ jest bez sensu i ma zniknąć z UML’a (już w wersji 2.0 miało jej nie być). Generalnie znaczy to samo co asocjacja;
    – liczebności są ok (teraz jest: “Jedna jabłoń ma wiele jabłek, jedno jabłko należy do jednej jabłoni”);

  9. pakalk says:

    @nandrew

    Troche masz inne podejscie do UML-a niz np. dr Daniluk. Duzo siedzisz w UML-u?

  10. nandrew says:

    @pakalk:
    Primo, nie wiem kto to dr Daniluk i możliwe że odnosisz złe wrażenie. Co masz na myśli? Jak przeczytałem twojego post’a (reply) to już pomyślałem, że użyłem jakiejś techniki z Agile Modeling, ale specjalnie sprawdziłem i tak nie jest :) Komentarz, który umieściłem, jest zgodny ze specyfikacją UML’a.

    Ogólnie ludzie często mają złe pojęcie o UML’u. Polecam książki “Applying UML and Patterns”.
    UML służy do _zrozumienia_ problemu, a nie dokumentacji kodu. Zresztą dopiero co pisałem o tym na moim blogu ;) (nandrew.blogspot.com).

    Jednym z głównym powodów, dla którego ludzie mają problemy z UML’em, jest fakt, że próbują stworzyć w nim kompletny model kodu, czego się nie da zrobić.

    Tak na prawdę w UMLu pracuje od ponad roku, początkowo jako programista wykonywałem w nim dokumentację, następnie “zakładałem czapkę projektanta” i projektowałem nowy system. Długa historia, ale UML był w tej firmie nadużywany, przez co sporo czasu się marnowało.
    Teraz używam UML’a gdy mam jakiś skomplikowany problem lub chcę “zobaczyć” kod lub udokumentować architekturę.

    Co do UML’a to jednym z przykładów nadużywania go albo zbyt dosłownego czytania specyfikacji jest używanie:
    – generalizacji przypadków użycia;
    – używanie na przypadkach użycia. Aczkolwiek ja też go używam, bo wszyscy myślą, że to znaczy “opcjonalność” i to jest wygodne. Ale naprawę też może być opcjonalny, zależy to od tekstu przypadku użycia;

  11. nandrew says:

    Poprawka do mojego ostatniego komentarza! Widać system tego bloga nie pozwala na pisanie nawiasów ostrych ;) W ostatnim podpunkcie pisałem o stereotypie “extend”.
    Miało być “używanie ‘extend’ na przypadkach użycia” oraz “Ale naprawę ‘include’ też może być opcjonalny…”

  12. pakalk says:

    @nandrew – z ciekawosci zapytalem – troszke ta Twoja wczesniejsza wypowiedz zabrzmiala jakby sytuacja

    A — B

    nie mogla miec miejsca na diagramach, a przeciez ma (Dwie klasy bez atrybutow, asocjacja bez rol).

    Ja sie ucze UML-a, wiec z checia bym poznal praktyczne przyklady jego zastosowania.

  13. pakalk says:

    To nie mialo byc zlosliwe, choc Twoj komentarz wydal mi sie restrykcyjnym podejsciem do tematu (i mi sie przypomnialy zajecia, na ktorych musialem rozrysowac wszystkie mozliwe diagramy sekwencji (oczywiscie bez mozliwosci umieszczenia alternatywy na diagramie :P) – a przeciez nie o to chodzi [wystarczy sobie wyobrazic bardziej zawily system… drzewo decyzyjne – 8 poziomow – 1024 diagramy :| chore :P ]

    Mnie sie zdaje (zdawalo), ze mozna umiescic atrybut klasy Jablko i powiazac klasy na diagramie bez podawania roli, by zilustrowac zaleznosci miedzy klasami. Nie mam jednak doswiadczenia praktycznego, wiec nie wiem :P

    Natomiast Andrzej Daniluk, to taki doktor z UMCS, ktory mnie uczyl UML (nie pierwszy, ale jego podejscie rozumialem) – podchodzil do tego po ludzku ;) znaczy: diagram jest dla programisty, nie programista dla diagramu ;) Przynajmniej tak mi sie zdawalo. Fakt, ze krotko z nim mialem zajecia, wiec moze zle sie nauczylem :P Wspomnialem o nim, bo napisal kilka ksiazek – nie mam pojecia czy dobrych – myslalem wiec, ze moze slyszales.

  14. nandrew says:

    Hmm, widać nie wyjaśniłem się jasno, dlatego przygotowałem przykład:

    http://img171.imageshack.us/img171/8425/uml1za1.jpg

    Mamy dwie alternatywy. Albo zaznaczamy relację, albo pole (i tak jest ze wszystkimi asocjacjami/agregacjami/itp). Inaczej POWTARZA SIĘ informacje na diagramie. Oba powyższe diagramy po generacji kodu będą identyczne (tz. oprócz samych nazw ;) Wybór między tymi dwoma możliwościami zależy od tego, co chcesz przedstawić. Np nie ma sensu robić
    relacji do klas framework’a (np String ;) Albo jak opisujesz domenę to nie dajesz na diagram wszystkich klas, żeby relację zaznaczyć, tylko niższe klasy zaznaczasz jako pole.

    Po drugie, relacja ZAWSZE ma dwie role, najwyżej mogą być nienazwane. U mnie relacja ma rolę B nazwaną
    “listClassesOne” i jest prywatna. Po wygenerowaniu kodu nazwa klasy będzie nazwą zmiennej(pola). Ty chyba miał na myśli chyba nazwę relacji (nie roli).

    Dobra polska książka do notacji UML to “Język UML 2.0” S. Wrycza. Ale ona nie nauczy ciebie projektowania (OOD), a samej notacji.

    Co do produkcji tylu diagramów sekwencji, zakładam że wykładowca chciał po prostu, abyście sobie poćwiczyli ;) Diagramów powinno być jak najmniej, tylko tyle aby zrozumieć problem/udokumentować rozwiązanie/przekazać ideę do programisty.

    Pozdrawiam

  15. pakalk says:

    1. Zrozumialem o co Ci chodzilo

    2. Oczywiscie, kazda relacja ma role, chocby nienazwane – brak roli to skrot myslowy.

    3. A cos takiego..

    http://img341.imageshack.us/img341/197/20070907084328sd8.jpg

    ..nie jest poprawne? Mnie się zdaje, że jest. Pokazuje zaleznosci miedzy klasami, bez szczegolow (operacje, atrybuty). Nawigacja natomiast jest niezdefiniowana, wiec teoretycznie do dowolnej implementacji, ale logicznym raczej jest, ze powinna pozwalac na dostep do klasy Class1 z Class0 – choc pewnie nie jest to scisle oznaczenie.

    4. Jasne, ze na kazdym diagramie nie ma sensu zaznaczac wszystkich powiazan :P

    5. Wyzej pisalem, ze bylem do czegos podobnego zmuszany, nie ze sam to praktykuje ;)

    6. Z Twoich postow wynika, jakby moja wizja UML-a byla bardzo inna od Twojej – co raczej nie jest prawda ;)

  16. nandrew says:

    * No na szczęście mamy dużo wspólnych “poglądów” na UML, chociaż to są tak na prawdę “poglądy” bardzo wielu osób. Aczkolwiek zdarzają się jednostki, która chcę zrobić te 10 diagramów do prostego problemu, żeby “pokryć” wszystko.

    * Co do 3:
    – ten diagram jest poprawny, ponieważ ja WIEM co chciałeś pokazać, a właśnie o to chodzi (w sumie każdy na pierwszy rzut oka by wiedział);
    – ale generator kodu nie wygeneruje ci tego, co byś chciał (albo każdy wygeneruje inne). No ale nie każdy diagram służy do generowania kodu. Ja nawet dość rzadko z inżynierii w przód korzystam, bo nie stać mnie na narzędzia do C#, a darmowe tego nie mają;
    – rzeczywiście, atrybutów/operacji czasem się nie pokazuje, gdy chodzi o same relacje (taki widok ogólny, często stosowany). Dobre narzędzie do UML’a pozwoli ci pokazać wszystkie att/op na jednym diagramie, a na innym diagramie schować wszystkie dla tej samej klasy.

    * Co do 5:
    – tak też to zrozumiałem wtedy :P

    * Pozdrawiam

  17. pakalk says:

    No jasne – nie wygeneruje, ale tu nie chodzilo przeciez o generowanie ;)

    StarUML posiada generator do C#, ale mniemam, ze niezbyt fajny, bo pewnie bys uzywal. (BTW. Nie bawilem sie StarUML-em duzo, ale uparcie mi nie chce generowac kompozycji jako kolekcji/tablicy/wskaznika, tylko jako atrybut o krotnosci 1 :| Z agregacja nie ma takiego czegos – nie wiem o co chodzi.)

    Poczytam sobie Twojego bloga i podpatrze te ksiazki, ktore wskazales – mam nadzieje, ze mi sie przydadza (no bo musze jakos opisac to co robie, a nie bede wlasnych diagramow wymyslal ;)). Dzieki za podpowiedzi.

  18. pakalk says:

    Pisalem o kompozycji 0..* of kors.

  19. Witam serdecznie. Pozwoliłem sobie zmoderować ostatnie komentarze. Cieszę się, że dyskusja tak bardzo się rozwinęła. Niewykluczone, że dzięki opiniom, które padły z Waszych ust wiele osób zmieni swoje spojrzenie na UML, w tym i ja. :)

    @nandew – poprawiłem wszystkie linki zawierające blogspot.pl

    Pozdrawiam,
    Łukasz Dywicki

Leave a Reply