\

Školení Návrhové vzory, OOP a UML


 Sunday, February 26, 2006
Analyticko-programátorská hádanka (vztahy mezi třídami)
Hádanka

Máte následující jednoduchý diagram tříd. Je na něm něco "podivného"? Abyste to neměli tak jednoduché, tak řeknu, že diagram je součástí přednášek Ing. Kamila Svobody, který na univerzitě v Hradci Králové vyučuje objektové modelování. Takže se vás třeba jen snažím zmást a ukázat, jak diagram precizně zpracovává své téma ;-) Anebo opravdu najdete nějaké nelogičnosti, na které by měl být kolega Svoboda upozorněn? ;-)

diagram tříd

Sunday, February 26, 2006 5:21:19 PM (Central Europe Standard Time, UTC+01:00)       
Comments [38]  Programátorské hádanky


Sunday, February 26, 2006 8:47:36 PM (Central Europe Standard Time, UTC+01:00)
Ja sa teda v notáciach veľmi nevyznám, ale nemala by byť tá asociácia medzi autobusom a osobou viacnásobná? Proste mi tam chýba nejaká hviezdička. ;-)
Sunday, February 26, 2006 8:58:46 PM (Central Europe Standard Time, UTC+01:00)
To mi taky chybi - urcite je to jedna z moznych vyhrad. Mohl byste se vice rozepsat, co vam na tom vadi? :)
Sunday, February 26, 2006 9:18:30 PM (Central Europe Standard Time, UTC+01:00)
No ja som sa na to pozrel asi trochu naopak. V relačných DB je asociačná trieda prepojovacia tabuľka a tu nejako mi uniká celý jej zmysel, keď ku každému autobusu existuje vždy len jeden vodič.

Proste mi vadí to, že keby som dostal takýto diagram, tak by som to asi najskôr hodil do dvoch tabuliek prepojených cudzím kľúčom.

Priznám sa, že nejaké ďalšie veľké výhrady nemám. Jedine by som asi nazval inak tie triedy, ale asi je ten obrázok len časťou niečoho iného, lebo neviem pochopiť prečo je tam trieda Osoba namiesto Vodič. Alebo je každá osoba vodičom nejakého dopravného prostriedku? Ten názov podľa mňa nie je štastný.
Sunday, February 26, 2006 9:29:30 PM (Central Europe Standard Time, UTC+01:00)
No 2 tabulky kazdopadne nestaci, protoze je potreba svazat autobus a ridice pro kazdou jizdu kterou s tim autobusem jede, navic ta vazba ma dalsi parametry.

Moje UML trochu pokulhava, ale myslim ze takhle ten diagram znaci, ze pro kazdeho ridice a autobus existuje pouze jedna jizda (vazba). Tzn. myslim ze hvezdicky na obou stranach to vyresi. Tim se naznaci, ze ve vazebni tabulce muze byt vice radku se stejnym ridicem nebo autobusem, nebo i vice radku se stejnym ridicem i autobusem.
Sunday, February 26, 2006 9:32:04 PM (Central Europe Standard Time, UTC+01:00)
ANo, zavede-li se m:n relace, tak diagram zacne pusobit lepe, ale pak teprve zacnou ty prave problemy :) Proc?
Sunday, February 26, 2006 9:36:44 PM (Central Europe Standard Time, UTC+01:00)
Netusim sice co to presne je, ale nemela by ta carka od jizdy vest k autobusu? ;)
brm
Sunday, February 26, 2006 9:38:55 PM (Central Europe Standard Time, UTC+01:00)
BRM: Pekny komentar, ale asi to nebude hlavni problem :) I kdyz mozna treba intuitivne k necemu mirite ;)
Sunday, February 26, 2006 9:46:12 PM (Central Europe Standard Time, UTC+01:00)
Tak ma napadlo. Čo je to ten "datum" v jazde? Dátum odchodu? Prečo to potom nie je spolu v čase odchodu? Podľa sa tým myslí niečo iné, ale neviem čo.

Ak idem úplne mimo, tak ma zastavte.
Sunday, February 26, 2006 9:48:46 PM (Central Europe Standard Time, UTC+01:00)
Johno: Datum a cas je vedeny samostatne, ale zase - jako prioblem bych to nevidel - je to jen zalezitost navrhu rozhrani.
Sunday, February 26, 2006 10:13:41 PM (Central Europe Standard Time, UTC+01:00)
Zdravim,
relace m:n, ktera by asi mela byt zavedena pro dany vztah ridic - autobus, ale nemuze byt pouzita s asociacni tridou, protoze identita asociacni tridy je dana identitami jednotlivych trid v relaci a pri vztahu m:n by mohlo vzniknout nekolik objektu se stejnou identitou, coz neni zadouci.
Podle me by se diagram vylepsil pouzitim kompozice mezi tridou jizda a tridami osoba a autobus.
Sunday, February 26, 2006 10:16:55 PM (Central Europe Standard Time, UTC+01:00)
Marek Eichler: Bingo! :) Myslim, ze si asi pamatujete dost veci z meho skoleni. ;)

To reseni jeste zminim v samostatnem spotu, aby byly dobre patrne rozdily.
Sunday, February 26, 2006 10:22:17 PM (Central Europe Standard Time, UTC+01:00)
:)) jj skoleni bodlo. Aspon mate dobrou reklamu :)
Sunday, February 26, 2006 10:24:58 PM (Central Europe Standard Time, UTC+01:00)
Marek: To mam, znalostmi oplyvajici ucastnik je nejlepsi vizitka ;) Jen aby si ostatni nemysleli, ze si ty komentare pisu sam. :)
Monday, February 27, 2006 9:22:35 AM (Central Europe Standard Time, UTC+01:00)
Trochu škoda, že jste pane Stein vytrhnul tu ukázku z kontextu... Ten příklad primárně používám pro vysvětlení pojmu "spolupráce tříd". Studenti totiž často vidí třídy jako relační tabulky a tak si nedokáží představit, že mezi třídami mohou teoreticky existovat vícenásobné vztahy, každý pro jinou spolupráci. V tomto příkladě je jedna spolupráce mezi uvedenými třídami dopravniProstredek - Ridic a druhý vztah (který už ale na obrázku není vidět) dopravniProstredek - Cestujici. Přičemž ta pojmenovaní jsou role v uvedeném vztahu. Proto je tam také třida Osoba a ne rovnou Řidič. Teprve u potomků této třidy se vztahy specializují. Z popisu spolupráce a rolí pak přecházím k vysvětlení asiciačních tříd, a proto vznikl uvedený příklad - pro kontinuitu s vysvětlením spolupráce.
Ale k tomu fragmentu diagramu... Kardinalita vztahů je popisem násobnosti mezi instancemi klasifikátorů v jednom okamžiku. V tomto případě tedy říkám, že v jedné chvíli může autobus řídit jeden řidič a zároveň že řidič nemůže najednou řídit více autobusů. Proto je tam 1:1 Asociační třída je pak "datovým" rozvedením uvedeného vztahu, v jednom okamžiku.
Rozhodně se necítím jako neomylný a je možné, že v mých přednáškách najdete více chyb, ale tady bych řekl že to je správně ;) Pokud si myslíte že ne, můžeme o tom diskutovat.
Monday, February 27, 2006 9:42:34 AM (Central Europe Standard Time, UTC+01:00)
Nevim, jestli mam jeste reagovat, vypada to, ze problem je jiz vyresen, aspon dle posledni reakce ohledne pouziti kompozice. I kdyz jsem si pozorne precetl i odpovedi, nic krome zameny jednicek za hvezdicky jsem si nevsiml (pravda, stahl jsem si ale necetl zatim ty prednasky). Tak jsem si vytahl prvni knihu o UML ohledne presneho vyznamu asociacni tridy a cituji: "Kdyby nastala situace, ze dany objekt typu Osoba ma v danem objektu typu Firma vice nez jedno Zamestnani, znamena to, ze asociacni tridu pouzit nelze". Pokud zamenite tridy Firma za autobus a Zamestanani za Jizda, pak se jedna o stejny priklad. Kniha: "UML a unifikovany proces vyvoje aplikaci" panu Jim Arlow a Ila Neustandt, strana 156, cesky preklad, prvni vydani Computer Press 2003.
Pozn:Druhy pokus o odeslani komentare.
Marek2
Monday, February 27, 2006 9:44:33 AM (Central Europe Standard Time, UTC+01:00)
Ještě abych to doplnil... jedná se zamozřejmě o analytický model, který musí být následně transformován na PSM (dle MDA), kde se ona problematická asociační třída musí nějak řešit... Mnoho softwarových architektů také díky "zatížení relačními" databázemi asociační třídy nepoužívá a rovnou tento vztah "rozepisuje" do jednoduchých asociací/agregací.
Tento příklad je potřeba chápat jako akademický, který má daný problém vysvětlit tak, aby jej studenti pochopili, a není přesným řešením v cílové aplikaci.
Monday, February 27, 2006 9:50:22 AM (Central Europe Standard Time, UTC+01:00)
Mě vazba 1:1 říká, že každý Řidič má svůj Autobus, se kterým jezdí jen on a nikdo jiný (neexistuje řidič bez autobusu a autobus bez řidiče). Jistě jsou i takové dopravní firmy a možná právě takovou firmu diagram modeluje. Pak by ale bylo hednodušší Jízdu asociovat rovnou s řidičem nebo autobusem.
Martin
Monday, February 27, 2006 9:52:43 AM (Central Europe Standard Time, UTC+01:00)
Dobrý den pane Svobodo,
já jsem nechtěl tu ukázku vytrhávat z kontextu - je na slidu, kde se vysvětluje asociační třída. Pokud vám to tak připadá, omlouvám se.

K diagramu:
Řekl bych, že popisujete 2 různé věci

1) Jestliže zavedete vztah 1:1, který popisujete, tak říkáte - a) Jestliže existuje osoba, vždy má obligatorní (ne 0..1, ale 1)vazbu nna autobus ("z vašeho pohledu u jakékoli instance osoby vyžadujete, aby v každém okamžiku své existence byla řidičem")
Platí to i naopak - každý autobus má nutně v každém okamžiku přiřazeného řidiče.

To znamená, že ta vazba působí poměrně násilně.
Pokud ale vyjdeme z asociační třídy Jízda, je na diagramu znát, že jste měl spíše na mysli asociaci m:n (ale každá Jízda má pak asociaci na právě jednoho řidiče a právě jeden autobus)

To znamená, že přesně tak, jak jste nakreslil vztahy asociační třídu použít můžete, i když je podivná celá asociace, protože u osoby si vynucujete, že vždy musí být řidičem a že každý autobus v každém okamžiku má svého řidiče.

Jako příklad mi to nepřišlo vhodné - jako byste modeloval dvě různé věci najednou. Díky za reakci a diskuzi.
Monday, February 27, 2006 9:57:23 AM (Central Europe Standard Time, UTC+01:00)
TO:Marek2 O té větě ve zmíněné knize vím. Říká, že asociační třídu můžete použít pouze v případě, že konkrétní řidič nemůže být zároveň i cestujícím ve stejném autobuse. To znamená, že objekt hraje pouze jednu roli, v jedné spolupráci. Pokud budeme tedy uvedené role chápat precizně (jako že si řidič nemusí např. štipnout lístek :), je tato podmínka splněna.
IOW: jedná se o unikátnost vztahů mezi !instancemi! tříd.
IOW: atributy asociační třídy jsou specifické pro konkrétní spolupráci (vztah) tříd, a proto nemohou být obecně znovupoužity v jiné spolupráci (vztahu) mezi stejnými třídami. Uvedená asociační třída by tedy neměla být znovupoužitelná ve spolupráci dopravniProstredek - Cestujici mezi stejnými třídami.
Monday, February 27, 2006 10:04:19 AM (Central Europe Standard Time, UTC+01:00)
V té minimální kardinalitě máte pravdu. Není vhodné tam dát "natvrdo" 1, ale mělo by tam být 0..1 :) V přednáškách to opravím. Děkuji za konstruktivní připomínku!
BTW: mohu se ještě zeptat, jak jste se k mým přednáškám dostal?
Monday, February 27, 2006 10:18:33 AM (Central Europe Standard Time, UTC+01:00)
BTW: samozřejmě, že "tvrdost" oné kardinality závisí na "business logice" - tj. zda ona konkrétní firma, pro kterou by byl IS realizován, může zaměstnávat řidiče, který nemá svůj autobus (a obráceně).
Monday, February 27, 2006 10:21:44 AM (Central Europe Standard Time, UTC+01:00)
Asi bych mel prvni prispevek doplnit. Hvezdicky na konci vztahu znamenaji i variantu 0,takze problem zameny cestujiciho s ridicem bych nevidel, jelikoz se jedna o osobu, ktera muze a nemusi figurovat ve vztahu jizda.
Pouziti asiciacni tridy (cituji rovnez z uvedene knihy): "Instance asociacni tridy jsou ve skutecnosti spojenim, ktere ma vlasni atributy a operace. Jedinecna identita je urcovana VYHRADNE identitami objektu na obou koncich. Tato podminka jednoznacne omezuje semantiku asociacni tridy-muzeme ji pouzit pouze tehdy, je-li mezi obema objekty v urcitem okamziku JEDNO JEDINECNE SPOJENI. Duvodem je fakt, ze kazde spojeni, jez je instanci asociacni tridy, musi mit vlasni jedinecnou identitu." a dale "Kdyby nastala situace, ze dany objekt typu Osoba ma v danem objetu typu Firma vice nez jedno Zamestnani, znamena to, ze asociacni tridu pouzit nelze - POUZITA SEMANTIKA NEPLATI!" a dale se naznacuje reseni s pouzitim normalni tridy Zamestnani.
Marek2
Monday, February 27, 2006 10:26:03 AM (Central Europe Standard Time, UTC+01:00)
Ještě se mi nějak nezdá definice: "Kardinalita vztahů je popisem násobnosti mezi instancemi klasifikátorů v jednom okamžiku." Nemělo by tam být spíš v "kterémkoliv okamžiku"? Pak by bylo i jasnější, jestli použít 0..1 nebo 1.

Kdyby nešlo o školní příklad, řekl bych, že analytik viděl především řidiče a autobus a tu jízdu tam nějak "přilepil". Já bych ale začal třídou jízda a tu bych asocioval s řidičem a utobusem.
Martin
Monday, February 27, 2006 10:37:48 AM (Central Europe Standard Time, UTC+01:00)
TO:Martin máte pravdu, že jsem tam tu jizdu nějak "přilepil". Popisuji to v příspěvku výše. Primárně jsou ty třídy použity pro vysvětlení asociací, a aby měli studenti kontinuitu, použil jsem je i pro vysvětlení asociační třídy. Asi by se našly daleko lepší příklady...
TO:Marek2 ...jen jsem chtěl ještě k té knize. Je pravda, že to je v současnosti nejlepší česky psaná knížka na trhu, ale přesto si v ní dejte pozor na řadu chyb a špatných překladů. Všimněte si např. jak je příklad použití vztahu Extend mezi typovými úlohami na jedné straně ukázán jedním způsobem a na druhé straně přesně opačným :) Bohužel ji teď nemám při ruce, abych se podíval přesně na stránky. Dobrý je také překlep hned v úvodním poděkování (Iva"n" Jackobson, namísto Iva"r" ... LOL)
Monday, February 27, 2006 10:38:38 AM (Central Europe Standard Time, UTC+01:00)
Marek2: Ano, to je presny popis problemu.

Martin: Ano, kardinalita (multiplicita) popisuje vazby mezi objekty v kazdem okamziku (myslim, ze kolega Svoboda toto myslel)
Z urciteho uhlu pohledu lze vazby 1 povazovat za soucast nemenne tridy

Kamil Svoboda: Dostal jsem se k vam cirou nahodou pri hledani na Googlu.
Monday, February 27, 2006 10:39:51 AM (Central Europe Standard Time, UTC+01:00)
koukám že jsem sám napsal Jackobson, namísto Jacobson LOL ;)
Monday, February 27, 2006 11:01:11 AM (Central Europe Standard Time, UTC+01:00)
Kamilo Svoboda: Jeste k tem kniham - divím se, že na svých stránkách doporučujete knihu Myslíme v jazyku UML - já jí naopak považuji za odstrašující příklad odfláknuté knihy se spoustou chyb (i ve vysvetlovani asociacnich trid)
Monday, February 27, 2006 11:11:36 AM (Central Europe Standard Time, UTC+01:00)
Rene Stein: Máte pravdu že označení Velmi dobrá kniha je přehnané. Vyloženě špatná mi ale nepřijde. Chyby obsahují všechny knížky (viz. můj příspěvek výše) a studenti jsou vděčni za každé české slovo k tématu. Na ty nejhorší věci je upozorňuji. Většinou jim však doporučuji konkrétní zahraniční literaturu.
Monday, February 27, 2006 12:55:04 PM (Central Europe Standard Time, UTC+01:00)
Kamil Svoboda:
A ještě jedna věc.

Napsal jste

"O té větě ve zmíněné knize vím. Říká, že asociační třídu můžete použít pouze v případě, že konkrétní řidič nemůže být zároveň i cestujícím ve stejném autobuse. To znamená, že objekt hraje pouze jednu roli, v jedné spolupráci. Pokud budeme tedy uvedené role chápat precizně (jako že si řidič nemusí např. štipnout lístek :), je tato podmínka splněna."


Ne, ta podmínka mluví o něčem jiném - jediné co je podstatné je to, že v každém okamžiku běhu systému existuje maximálně jedna instance asociační třídy, jejíž identita je dána třídami v asociaci. Jinými slovy - třída Jízda v systému nemůže být modelována jako asociační třída, protože byste po čase měl n tříd se stejnou identitou - tuto vazbu je nutné rozpadnout na běžnou agregaci.

To, že si "řidič neštípne lístek" při konkrétní jízdě nic neznamená. "objekt hraje jednu roli v jedné spolupráci" - ano, ale v diagramu tříd o spolupráci nemluvíme - každá třída může mít n různých asociací na jinou třídu. Za běhu pak každý objekt (Id=1) může mít n linků na jiný objekt (Id=2) plynoucí z jeho asociací.
U asociační třídy je opravdu zakázáno mít instance, jejichž identita není jednoznačná.
Příklad: Když řeknu, že každý řidič je na jedno použití a uskuteční jednu jízdu - pak je asociační třída v pořádku. Za běhu aplikace, při implementaci mohu toto pravidlo zjemnit tak, že řeknu, že vždy existuje jen jedna aktivní jízda (ostatní jsou neaktivní a nejsou součástí business vrtvy). Když řeknu, že v nějakém okamžiku může jeden řidič řídit jen jeden autobus, jsem nucen:
1) Nepoužít asociační třídu, ale zavést běžnou třídu Jízda, která agreguje jednu instanci řidiče a jednu instanci
2) Zavést omezení (Constraint), že při plánování/evidenci jízd nesmí dojít k časovému překryvu uskutečněných jízd různými autobusy ve stejné době u jednoho řidiče.
Monday, February 27, 2006 1:16:03 PM (Central Europe Standard Time, UTC+01:00)
Rene Stein: Musim uznat, ze mate pravdu. Pro presne vysvetleni asociacni tridy to neni vhodny priklad. Obecny princip, k cemu je asociacni trida, se z toho da lehce vycist, ale nesplnuje vsechny jeji podminky. Budu muset vymyslet lepsi priklad :)
Jeste jednou diky za konstruktivni pripominku.
Monday, February 27, 2006 1:20:43 PM (Central Europe Standard Time, UTC+01:00)
Rene Stein: Heště doplnění: "spoluprací" v diagramu tříd se popisuje význam (sémantika) konkrétní asociace.
Monday, February 27, 2006 1:41:25 PM (Central Europe Standard Time, UTC+01:00)
Kamil Svoboda: Diky za upresneni, takto tomu rozumim, predtim to znela, jak "vypujcka" z diagramu spoluprace.

A diky za to, ze jste zareagoval - prijemne me to prekvapilo. Mate pravdu, neomylny nejsme nikdo - a snad jsem se vas prilis nedotkl tim, ze jsem zrovna za "spatny" priklad zvolil cast vasi prezentace. Kdyz jsem si ji vcera prohlizel, tak mi to opravdu nedalo ;)
Monday, February 27, 2006 3:20:12 PM (Central Europe Standard Time, UTC+01:00)
Rene Stein: Pokud je kritika postavena bez urážek, tak ji vždycky rád přijmu.
Asi se budu muset přihlásit na některý Váš kurz... abych se podobných věcí napříště vyvaroval :D
Monday, February 27, 2006 4:36:28 PM (Central Europe Standard Time, UTC+01:00)
"relace m:n, ktera by asi mela byt zavedena pro dany vztah ridic - autobus, ale nemuze byt pouzita s asociacni tridou, protoze identita asociacni tridy je dana identitami jednotlivych trid v relaci"

Môžem sa opýtať odkiaľ pochádza toto? Ešte som o tom nepočul. Úplne mi stačí nejaký odkaz alebo nakopnutie.
Monday, February 27, 2006 5:47:33 PM (Central Europe Standard Time, UTC+01:00)
Johno: Je to na ruznych mistech, ale snad postaci citace z UML reference guide

"An association class connecting classes A and B is not the same as a
class D with binary associations to A and B. Like all links, a link of
an association class such as C takes its identity from the object
references in it. The attribute values are not involved in providing
identity. Therefore, two links of C must not have the same pair (a,b)
objects, even if their attribute values differ, because they would have
the same identity. That is, given attribute E, it is not permitted that
(a,b,e1) and (a,b,e2) both be instances of C, because they share the
same identity (a,b)"


Monday, February 27, 2006 6:36:52 PM (Central Europe Standard Time, UTC+01:00)
Vďaka. Toto som netušil.
Monday, May 15, 2006 9:57:24 AM (Central Europe Standard Time, UTC+01:00)
Článek k tomuto tématu: http://www.objects.cz/clanky/clanek18/clanek18.html
Monday, May 15, 2006 11:32:47 AM (Central Europe Standard Time, UTC+01:00)
Pavel: Diky za odkaz. Vidim, ze budu muset vysvetlit, jak se lisi pojeti asociacni tridy v ruznych verzich UML, co znamena pojem "identita" pri analyze, systemovem designu a jak se identita objektu lisi d vazebnich tabulek v db atd.

Jen chvili vydrzte - mam o tom rozepsany vetsi clanek, ktery vyjde kolem 15.6.
Comments are closed.