Communication diagram - diagram komunikací

Základy

Diagram komunikací je i není nový v UML 2.0 : totiž v UML 1.x se jmenoval collaboration diagram, což bylo matoucí (collaboration byly statické struktury, kdežto diagram zahrnoval zprávy).
Diagram komunikací spolu se sekvenčním diagramem(sequence diagram), diagramem přehledu interakcí (interaction overview diagram) a diagramem časování (timing diagram) patří do skupiny interakčních diagramů (interaction diagrams).
Přitom d. komunikací a sekvenční d. jsou téměř izomorfní - tj. dají se převádět z jednoho tvaru na druhý (často i automatizovaně) (to však platí jen pro jednoduché sekvenční diagramy, které nepoužívají struktorované mechanismy jako interaction use a combined fragment). D. komunikací i sekvenční d. ukazují interakce, ale každý svým vlastním způsobem.
Použití diagramu komunikací bývá vhodnější v těch případech, kde chceme zdůraznit strukturální aspekty spolupráce, tj. ukázat hlavně kdo s kým komunikuje - jsou méně vhodné pro zdůraznění časových souvislostí interakcí.

Objekty si mohou posílat zprávy. Diagram komunikací ukazuje objekty (přesněji : části kompozitní struktury nebo role ve spolupráci(collaboration)) a spojení a zprávy, které si objekty posílají. Čas zde nevystupuje jako zvláštní dimenze, proto musí být sekvence zpráv a spouběžnost threadů určena pomocí čísel sekvencí :

jednoduchý diagram spolupráce, 6 kB

Jedná se o diagram komunikací odvozený z našeho jednoduchého sekvenčního diagramu

  • uzly v tomto diagramu reprezentují části strukturované třídy nebo role collaborations (dále pro zjednodušení je budeme nazývat jako objekty) a korespondují s lifeline v sekvenčním diagramu.
  • komunikační cesty (paths) jsou vyjádřeny čárami (spojkami, connectors) mezi uzly. Čáry můžou být nazvány svým jménem a/nebo jménem výchozí asociace (existuje-li). Můžou být vyjádřeny multiplicity.
  • zpráva :
    • zpráva je zobrazena jako malá pojmenovaná šipka umístěná blízko spojnic; v našem příkladě máme jen jednoduché obyčejné zprávy : zde je šipka plná a v příkladu je znázorněno např. ohledně zprávy zpravaA(x) : objekt obj1 posílá (tedy je to sender) zprávu zpravaA s jedním argumentem, který je je naplněn hodnotou atributu x, objektu obj2 (to je tedy receiver), ten po svém zpracování vrací hodnotu 123, kterou si obj1 převezme do atributu y
    • sekvenční výraz (umístěný před názvem zprávy) určuje pořadí, v jakém jsou zprávy posílány : pozor, není to jen prosté pořadové číslo, ale je v něm vyjádřeno i zanoření
    • návratováHodnota není povinná
V diagramu je znázorněna tato sekvence :
  1. objekt obj1 je hned na počátku aktivován (má focus) a poslal zprávu zpravaA s parametrem x objektu obj2 : obj1 přeruší zpracování (ztratí focus a předá řízení obj2) a čeká, až obj2 odpoví na zpravaA
  2. obj2 získává focus a spustí vlastní metodu
  3. v jistém bodě zpracování posílá obj2 zprávu zpravaB do obj3 - obj2 započne čekat na odpověď od obj3
  4. obj3 získává focus (a spouští vlastní metodu)
  5. obj3 dokončí své zpracování, pak vrátí peška (předá řízení zpět) do obj2
  6. obj2 pokračuje v práci, a posílá další zrávu do obj3
  7. obj3 dokončí zpracování, tak vrátí řízení zpět do obj2
  8. obj2 pokračuje v práci a až skončí, tak vrátí řízení do obj1, přitom ale vrátí návratovou hodnotu 123
  9. obj1 si převezme návratovou hodnotu do atributu y

Další podrobnosti

D. komunikací vlastně obsahuje jen čtyři typy elementů :
základní frame, lifeline, komunikační cesty (paths) a zprávy :

  • frame (rám) : význam a jmenovka jsou stejné, jako v sekvenčním diagramu. Ovšem v refrenčním manuálu k UML se jeho autoři (trio amigos) odchylují od specifikace UML (sami to přiznávají), a používají jmenovku comm namísto sd
  • ve jmenovce také může být uveden seznam lifelines (které jsou obsaženy v diagramu, ale neobjevují se zde graficky)
  • lifeline : popsáno už v sekci základy : význam je stejný jako v sekvenčním diagramu
  • komunikační cesty (path) : popsáno už v sekci základy
  • zpráva má syntaxi :
    sekvenční-výraz : jméno-zprávy,
    kde
    • jméno-zprávy : stejné, jako v sekvenčním diagramu
    • sekvenční-výraz popisuje pořadí a podmíněnost správy ve formě
      člen-sekvence.člen-sekvence.člen-sekvence...., kde jeden člen-sekvence má syntaxi :
      label iterační výraz,
      kde
      • label : buďto celé číslo, nebo jméno;
        celé číslo určuje pořadí v sekvenci zpráv uvnitř jedné úrovně zanoření procedurálního volání. Číslování se může jevit jako poněkud nezvyklé : jde o to, že zprávy, jejichž číslo se liší na stejné úrovni zanoření, následují za sebou v sekvenci zpráv na oné úrovni zanořeného volání. Např. (pokud nejsou žádné zprávy asynchronní, tak) první zpráva má číslo 1, následující zpráva 1.1, a následující bude mít buďto číslo 1.1.1 (pokuď je poslána jako důsledek aktivity spuštěné zprávou 1.1) nebo 1.2 (pokud je poslána jako důsledek aktivity spuštěné zprávou 1 a to až po návratu ze zprávy 1.1). Tj. např. zpráva s číslem 4.2.5 je poslána po návratu ze zprávy 4.2.4 uvnitř zanoření 4.2.
        jméno je použito pro paralelní threday. Zprávy, jejichž label se liší jen na konci ve jméně na stejné úrovni zanoření, jsou paralelní na oné úrovni zanoření. Např. zprávy s labelem 4.2a a 4.2b jsou paralelní na úrovni zanoření 4.2.
      • iterační výraz
      • : určuje podmíněnost nebo provádění iterace. Možnosti jsou dvě:
        • *[iterační-klauzule] : reprezentuje sekvenci zpráv na dané úrovni zanoření. UML nepředepisuje formát pro iterační-klazuli - záměr je ten, aby tato klauzule byla zapsána v pseudokódu nebo v právě používaném programovacím jazyku; pokud klauzule chybí, jedná se o iteraci s nespecifikovaným počtem opakování. Př.: *[i:=1..n]
        • [klauzule-podmínky] : reprezentuje zprávu, jejíž provedení nastane v případě pravdivosti podmínky. UML nepředepisuje formát pro klauzuli-podmínky - záměr je ten, aby tato klauzule byla zapsána v pseudokódu nebo v právě používaném programovacím jazyku. Př.: [x>y]
    • příklady zpráv :
      • 1: spocitej() : jednoduchá zpráva
      • 1.5.2: x=spocitej(a, b):vysledek : zanořená zpráva (druhá zpráva na úrovni zanoření 1.5) s návratovou hodnotou vysledek převzatou do atributu x
      • 2b.4: namaluj() : čvrtá zpráva ve druhém paralelním threadu na úrovni zanoření 2
      • 6.2 [x>100]: redukuj()
      • : podmíněná zpráva
      • 45.2 *[i:=1..z] : iterace

Náměty na další studium