<chapter id="uml-basics"> <title>Základy UML</title> <sect1 id="about-uml"> <title>O UML</title> <para> Táto kapitola poskytuje krátky úvod do základov UML. Pripomíname však, že to nie je plnohodnotný úvod. Ak chcete vedieť viac o unifikovanom modelovacom jazyku alebo všeobecne o analýze a návrhu softvéru, prečítajte si jednu z mnohých kníh venovaných tejto tematike. Ako východzí bod môžeme nájsť mnohé práce o tejto téme aj na internete.</para> <para> Unifikovaný modelovací jazyk (Unified Modelling Language - UML) je notácia diagramov pre špecifikáciu, vizualizáciu a dokumentáciu modelov objektovo-orientovaných softvérových systémov. UML nie je modelom chovania, t.j. nič nehovorí o jednotlivých krokoch, ktoré sú potrebné pre vytvorenie systému. Pomáha však vizualizovať systém a komunikovať s ostatnými. O štandard UML sa stará skupina Object Management Group (OMG) a je to priemyselný štandard pre popis softvérových modelov. </para> <para> UML bol vytvorený pre objektovo-orientovaný návrh softvéru a preto je pri ostatných paradigmách programovania použiteľný len obmedzene. </para> <para> UML sa skladá z mnohých prvkov modelu, ktoré predstavujú istý aspekt softvérového systému. Tieto prvky sa kombinujú do diagramu, ktoré predstavujú istú časť alebo istý pohľad na systém. Umbrello podporuje tieto typy diagramov: </para> <!-- FIXME, is it possible to link from these to the next pages?--> <itemizedlist> <listitem> <para><emphasis> <link linkend="class-diagram">Diagram tried</link></emphasis>, reprezentuje triedy a ich vzájomné vzťahy </para> </listitem> <listitem> <para><emphasis> <link linkend="use-case-diagram">Diagram prípadov použitia</link> </emphasis>, reprezentuje aktérov (ľudí alebo iných užívateľov systému), prípady použitia (scenáre, ako využívajú aktéri systém) a ich vzájomné vzťahy. </para> </listitem> <listitem> <para><emphasis> <link linkend="sequence-diagram">Sekvenčný diagram</link></emphasis>, reprezentuje objekty a ich vzájomné vzťahy, pričom dôraz sa kladie na chronologické poradie výmeny správ medzi jednotlivými objektmi. </para> </listitem> <listitem> <para><emphasis> <link linkend="collaboration-diagram">Diagram spolupráce</link></emphasis>, reprezentuje objekty a ich vzájomné vzťahy, pričom dôraz sa kladie na jednotlivé objekty, ktoré sa zúčastňujú výmeny správ. </para> </listitem> <listitem> <para><emphasis> <link linkend="state-diagram">Stavový diagram</link></emphasis>, Reprezentuje stavy, zmeny stavov a výstupy v objekte alebo časti systému. </para> </listitem> <listitem> <para><emphasis> <link linkend="activity-diagram">Diagram aktivít</link></emphasis>, reprezentuje aktivity, stavy a zmeny stavov objektov a výstupy v častiach systému. </para> </listitem> </itemizedlist> </sect1> <!-- about-uml--> <sect1 id="uml-elements"> <!--FIXME diagram-types ???? --> <title>Prvky UML</title> <sect2 id="use-case-diagram"> <title>Diagram prípadov použitia</title> <para>Diagramy prípadov použitia popisujú vzťahy a závislosti medzi skupinou <emphasis>prípadov použitia</emphasis> a aktérov, ktorí sa zúčastňujú daného procesu</para> <para> Pripomíname, že diagram prípadov použitia sa v návrhu systému neodzrkadlí a tým nehovorí nič o interných záležitostiach systému. Diagramy prípadov použitia sa používajú len na zjednodušenie komunikácie medzi vývojármi a budúcimi užívateľmi, resp. zákazníkmi. Sú osožné hlavne pri stanovení požadovaných kritérií budúceho systému. Tým diagramy prípadov použitia určujú, <emphasis>čo</emphasis> treba urobiť, nie však <emphasis>ako</emphasis> to treba dosiahnuť. </para> <para> <screenshot> <screeninfo>Ukážkový diagram prípadov použitia.</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/use-case-diagram.png" format="PNG"/> </imageobject> <textobject> <phrase>Umbrello pri zobrazení ukážkového diagramu prípadov použitia </phrase> </textobject> <caption> <para>Umbrello pri zobrazení ukážkového diagramu prípadov použitia </para> </caption> </mediaobject> </screenshot> </para> <sect3 id="use-case"> <title>Prípad použitia</title> <para> <emphasis>Prípad použitia</emphasis> popisuje z hľadiska aktéra rad aktivít v systéme, ktoré dávajú konkrétny hmatateľný výsledok. </para> <para>Prípady použitia slúžia ako popis typickej interakcie medzi užívateľom a systémom. Reprezentujú externé rozhranie a špecifikujú tým, čo má systém robiť (iba čo, no nie ako!).</para> <para> Pri práci s prípadmi použitia sa odporúča riadiť týmito pravidlami: <itemizedlist> <listitem> <para>každý prípad použitia je spojený s aspoň jedným aktérom. </para> </listitem> <listitem> <para>každý prípad použitia je niekým vyvolaný (napr. aktérom). </para> </listitem> <listitem> <para> každý prípad použitia vedie k významnému výsledku (merateľnému a hospodársky významnému) </para> </listitem> </itemizedlist> </para> <para>Prípady použitia môžu byť navzájom spojené. Tri najviac používané vzťahy medzi prípadmi použitia sú: </para> <itemizedlist> <listitem> <para><emphasis><<include>></emphasis>, čo značí, že prípad použitia sa uskutočňuje <emphasis>v</emphasis> inom prípade použitia. </para> </listitem> <listitem> <para><emphasis><<extends>></emphasis>, čo značí, že v istej situácii (alebo v istom bode rozšírenia) sa daný prípad použitia rozšíri iným prípadom použitia. </para> </listitem> <listitem> <para><emphasis>Zovšeobecnenie</emphasis>, čo značí, že prípad použitia zdedí vlastnosti <quote>rodičovského</quote>prípadu použitia (nadriadeného) a môže tieto vlastnosti prepísať alebo rozšíriť, podobne, ako je to u dedenia v prípade tried. </para> </listitem> </itemizedlist> </sect3> <sect3 id="actor"> <title>Aktér</title> <para>Aktér je externý objekt (mimo systému), ktorý prichádza do styku so systémom prostredníctvom účasti a spustenia prípadov použitia. Aktéry môžu byť skutočné osoby (napr. užívatelia systému), počítačové systémy alebo externé impulzy. </para> <para>Aktéry tým predstavujú nie <emphasis>fyzické</emphasis> osoby alebo systémy, ale <emphasis>role</emphasis> týchto objektov. Ak je fyzická v kontakte so systémom mnohými spôsobmi, (napr. prostredníctvom rôznych Rolí) potom sa reprezentuje pomocou rôznych aktérov. Tým sa osoba, ktorá pracuje na úseku zákazníckej podpory a zúčastňuje sa aj prijímania objednávok bude raz aktérom <quote>Pracovník_zákazníckej_podpory</quote> a druhýkrát aktérom <quote>Pracovník_odbytu</quote>. </para> </sect3> <sect3 id="use-case-description"> <title>Popis prípadu použitia</title> <para> Popis prípadu použitia reprezentuje prípad použitia v textovej forme. Normálne sa pre tento účel používajú poznámky alebo dokumenty spojené s prípadom použitia a popisujú procesy alebo aktivity, ktoré v danom prípade použitia nastávajú. </para> </sect3> </sect2> <!-- use-case-diagram--> <sect2 id="class-diagram"> <title>Diagram tried</title> <para> Diagramy tried zobrazujú rôzne triedy, z ktorých pozostáva systém a ako sú tieto navzájom závislé. Diagramy tried sa označujú ako <quote>statické</quote> , keďže reprezentujú triedy s ich metódami a atribútmi, ako aj vzájomnými statickými vzťahmi. Pritom sa ukazuje, ktoré triedy <quote>vedia </quote> o iných triedach a ktoré triedy <quote>sú sčasti</quote> inými triedami. Nezobrazuje však výmenu správ (volania metód) medzi jednotlivými triedami. </para> <para> <screenshot> <screeninfo>Veľavravný diagram tried</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/class-diagram.png" format="PNG"/> </imageobject> <textobject> <phrase>Umbrello pri zobrazení veľavravného diagramu tried</phrase> </textobject> <caption> <para>Umbrello pri zobrazení veľavravného diagramu tried</para> </caption> </mediaobject> </screenshot> </para> <sect3 id="class"> <title>Trieda</title> <para>Trieda definuje atribúty a metódy množiny objektov. Všetky objekty tejto triedy (inštancie) majú rovnaké chovanie a rovnaké atribúty (avšak s odlišnými hodnotami). Pojem <quote>typ</quote> sa občas používa ako synonyma triedy, treba však dbať na to, že typ je všeobecný a tým tieto dva pojmy nemajú totožný význam. </para> <para> V UML sa triedy zobrazujú ako obdĺžniky s názvami tried. Atribúty a operácie triedy môžeme zaznamenať do dvoch ďalších <quote>oddelených oblastí</quote> v danom obdĺžniku. </para> <para> <screenshot> <screeninfo>Trieda v UML</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/class.png" format="PNG"/> </imageobject> <textobject> <phrase>Zobrazenie triedy v UML</phrase> </textobject> <caption> <para>Zobrazenie triedy v UML</para> </caption> </mediaobject> </screenshot> </para> <sect4 id="attributes"> <title>Atribút</title> <para> V UML sa atribúty zobrazujú prinajmenšom pomocou názvu, môžu však byť zobrazené aj typ, počiatočná hodnota a ostatné vlastnosti. Je tiež možné zobraziť aj viditeľnosť atribútov: </para> <itemizedlist> <listitem> <para>+ značí verejné - <emphasis>public</emphasis> atribúty</para> </listitem> <listitem> <para># značí chránené - <emphasis>protected</emphasis> atribúty</para> </listitem> <listitem> <para>- značí súkromné - <emphasis>private</emphasis> atribúty</para> </listitem> </itemizedlist> </sect4> <sect4 id="operation"> <title>Operácia</title> <para> Operácie (metódy) musia byť reprezentované aspoň názvom a návratovou hodnotou. Podobne, ako je to u atribútov, môžeme zobraziť aj viditeľnosť: <itemizedlist> <listitem> <para>+ značí verejné - <emphasis>public</emphasis> operácie</para> </listitem> <listitem> <para># značí chránené - <emphasis>protected</emphasis> operácie</para> </listitem> <listitem> <para>- značí súkromné - <emphasis>private</emphasis> operácie</para> </listitem> </itemizedlist> </para> </sect4> </sect3> <sect3 id="class-associations"> <title>Asociácie tried</title> <para>Triedy môžu byť vo vzájomných vzťahoch (asociáciách) mnohých typov. </para> <sect4 id="generalization"> <title>Zovšeobecnenie</title> <para> Dedenie je základným konceptom objektovo-orientovaného programovania. Trieda <quote>získa</quote> pritom všetky atribúty a operácie triedy, od ktorej je odvodená. Trieda môže tieto operácie/atribúty prepísať a zmeniť, ako aj pridať nové. </para> <para> V UML sa prostredníctvom asociácie <emphasis>zovšeobecnenie</emphasis> buduje hierarchia, ktorá predstavuje koncept základnej triedy a odvodenej triedy. Zovšeobecnenie medzi dvoma triedami sa v UML zobrazuje ako čiara medzi dvoma triedami, pričom na strane základnej triedy je šípka. <screenshot> <screeninfo>Zovšeobecnenie</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/generalization.png" format="PNG"/> </imageobject> <textobject> <phrase>Zobrazenie zovšeobecnenia v UML</phrase> </textobject> <caption> <para>Zobrazenie zovšeobecnenia v UML</para> </caption> </mediaobject> </screenshot> </para> </sect4> <sect4 id="uml-associations"> <title>Asociácia</title> <para> Asociácia predstavuje vzťah medzi triedami dar a tým popisuje všeobecný význam a štruktúru rôznych typov <quote>vzťahov</quote> medzi objektmi. </para> <para>Asociácie sú mechanizmom, ktorý umožňuje, aby objekty medzi sebou navzájom komunikovali. Popisujú vzťahy medzi rôznymi triedami (vzťahy medzi jednotlivými objektmi sa označujú ako vzťahy objektov alebo ako <emphasis>prepojenie</emphasis>). </para> <para> Asociácie môžu mať role, ktoré popisujú účel vzťahu a sú buď jednosmerné alebo obojsmerné (t.j. či je vzťah medzi objektmi jedno- alebo obojstranný). Oba konce asociácie majú hodnotu násobnosti, ktorá určuje, koľko objektov na jednej strane môže byť v spojení s koľkými objektmi na strane druhej. </para> <para> V UML sa asociácia zobrazuje prostredníctvom čiary medzi triedami, ktoré sa zúčastňujú asociácie. Môžeme pritom zobraziť aj rolu a násobnosť. Násobnosť je rozsah [min..max] nezáporných čísel, pričom hviezda (*) na strane maxima predstavuje nekonečno. <screenshot> <screeninfo>Asociácie UML</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/association.png" format="PNG"/> </imageobject> <textobject> <phrase>Zobrazenie asociácie v UML</phrase> </textobject> <caption> <para>Zobrazenie asociácie v UML</para> </caption> </mediaobject> </screenshot> </para> </sect4> <sect4 id="aggregation"> <title>Agregácia</title> <para>agregácie sú špeciálnym prípadom asociácií. Vo vzťahu nemajú triedy rovnaký status, táto asociácia predstavuje vzťah <quote>súčasť celku</quote>. Agregácia popisuje, ako trieda, ktorá je v úlohe celku, sa skladá z tried, ktoré majú úlohu častí. Pri agregáciách majú triedy v úlohe celku vždy násobnosť 1. </para> <para> V UML sa agregácie zobrazujú ako asociácie, pričom na strane celku je kosoštvorec. <screenshot> <screeninfo>Agregácia</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/aggregation.png" format="PNG"/> </imageobject> <textobject> <phrase>Zobrazenie vzťahu agregácie v UML</phrase> </textobject> <caption> <para>Zobrazenie vzťahu agregácie v UML</para> </caption> </mediaobject> </screenshot> </para> </sect4> <sect4 id="composition"> <title>Kompozícia</title> <para>Kompozície sú asociácie, ktoré predstavujú <emphasis>veľmi silnú</emphasis> agregáciu. To znamená, že kompozície reprezentujú vzťah súčasť celku, avšak vzťah je taký silný, že súčasti nemôžu existovať samostatne. Preto existujú iba v celku a ak celok zanikne, zaniknú aj ony. </para> <para>V UML sa kompozície zobrazujú ako vyplnený kosoštvorec na strane celku. </para> <para> <screenshot> <screeninfo>Kompozícia</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/composition.png" format="PNG"/> </imageobject> <textobject> <phrase>Zobrazenie vzťahu kompozície v UML</phrase> </textobject> </mediaobject> </screenshot> </para> </sect4> </sect3> <!--class-associations--> </sect2> <!--class diagram --> <sect2 id="activity-diagram"> <title>Diagram aktivít</title> <para>Diagramy aktivít popisujú postupnosť aktivít v systéme. Sú špeciálnou formou stavových diagramov, pričom takmer výlučne obsahujú len aktivity. </para> <para> <screenshot> <screeninfo>Názorný diagram aktivít</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/activity-diagram.png" format="PNG"/> </imageobject> <textobject> <phrase>Umbrello pri zobrazení diagramu aktivít</phrase> </textobject> <caption> <para>Umbrello pri zobrazení diagramu aktivít</para> </caption> </mediaobject> </screenshot> </para> <para>Diagramy aktivít sú veľmi podobné procedurálnym diagramom dátových tokov. Sú však odlišné tým, že aktivity sú jasne viazané na objekty.</para> <para> Diagramy aktivít patria vždy jednoznačne <emphasis>k triedam</emphasis>, <emphasis>operáciám</emphasis> alebo <emphasis>prípadom použitia</emphasis>. </para> <para>V diagrame aktivít môžeme zaznamenať aj sekvenčné či dokonca súbežné aktivity. Paralelné spracovanie sa zaznamenáva vo forme symbolov Rozdeliť/spojiť (fork/join). Pre paralelne bežiace aktivity je pritom dôležité, v akom poradí sa budú vykonávať. Môžu byť vykonávané v rovnakom časovom okamihu, ale aj za sebou. </para> <sect3 id="activity"> <title>Aktivita</title> <para>Aktivita je jediný krok v procese. Tým je aktivita stavom systému s internou aktivitou a aspoň jedným prechodom. Môžu existovať viaceré prechody, ak sa aktivita vykonáva v rôznych podmienkach. </para> <para> Aktivity môžu byť usporiadané do hierarchie, v ktorej sa jedna aktivita skladá z mnohých iných. Pritom sa musia vstupujúce a vystupujúce prechody zosúladiť s príslušnými prechodmi dekonštrukcie. </para> </sect3> </sect2> <!-- activity diagram--> <sect2 id="sequence-diagram"> <title>Sekvenčný diagram</title> <para>Sekvenčné diagramy zobrazujú výmenu správ (napr. volanie metód) medzi Objektmi v danom časovom priestore. Kladie sa pritom dôraz na poradie a čas, v ktorom sa správy posielajú objektom. </para> <para> V sekvenčnom diagrame sa objekt označuje zvislou prerušovanou čiarou. Názov objektu sa nachádza na hornom konci. Časová os je tiež zvislá, pričom hodnoty sa zväčšujú smerom nadol. Správy medzi objektmi sa označujú ako šípky s názvami operácií a ich parametrov. </para> <para> <screenshot> <screeninfo>Sekvenčný diagram</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/sequence-diagram.png" format="PNG"/> </imageobject> <textobject> <phrase>Umbrello pri zobrazení sekvenčného diagramu</phrase> </textobject> <caption> <para>Umbrello pri zobrazení sekvenčného diagramu </para> </caption> </mediaobject> </screenshot> </para> </sect2> <sect2 id="collaboration-diagram"> <title>Diagram spolupráce</title> <para>Diagram spolupráce zobrazuje interakciu medzi objektmi, ktoré sa zúčastňujú špecifickej situácie. Toto predstavuje v princípe informácie zo sekvenčného diagramu, pričom pri tomto diagrame sa kladie dôraz na časovú následnosť. V prípade diagramu spolupráce sa však do popredia dostáva vzťah medzi objektmi a jeho topológia. </para> <para>Správy medzi objektmi sa v diagrame spolupráce zobrazujú ako šípky označené názvom, parametrom a poradovým číslom správy. Diagramy spolupráce sa výborne hodia pre zobrazenie špeciálnych programových postupov alebo situácií. Môžeme nimi demonštrovať a vyjasniť časť logiky programu veľmi jednoducho a rýchlo. </para> <para> <screenshot> <screeninfo>Diagramy spolupráce</screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/collaboration-diagram.png" format="PNG"/> </imageobject> <textobject> <phrase>Umbrello pri zobrazení diagramu spolupráce</phrase> </textobject> <caption> <para>Umbrello pri zobrazení diagramu spolupráce </para> </caption> </mediaobject> </screenshot> </para> </sect2> <sect2 id="state-diagram"> <title>Stavový diagram </title> <para>Stavové diagramy zobrazujú objekty v rôznych stavoch ich života a zobrazujú vplyvy, ktorými objekty menia stav. </para> <para>Stavové diagramy zobrazujú objekty ako <emphasis>stavové stroje</emphasis> alebo konečné automaty, ktoré môžu byť v konečnom počte stavov a dokážu meniť stav prostredníctvom konečného počtu vplyvov. Takto sa môže objekt <emphasis>sieťový_server</emphasis> počas svojej existencie nachádzať v týchto stavoch: </para> <itemizedlist> <listitem> <para>pripravený</para> </listitem> <listitem> <para>čakajúci</para> </listitem> <listitem> <para>pracujúci</para> </listitem> <listitem> <para>zastavený</para> </listitem> </itemizedlist> <para> a impulzy, ktoré vyvolávajú zmenu stavu objektu môžu byť: </para> <itemizedlist> <listitem> <para>Objekt bol vytvorený</para> </listitem> <listitem> <para>Objekt dostal správu, že má počkať</para> </listitem> <listitem> <para>Klient požaduje pripojenie cez sieť</para> </listitem> <listitem> <para>Klient ukončil spojenie</para> </listitem> <listitem> <para>Požiadavka sa spracuje a ukončí</para> </listitem> <listitem> <para>Objekt zachytí správu, že má ukončiť činnosť</para> </listitem> <listitem> <para>atď.</para> </listitem> </itemizedlist> <para> <screenshot> <screeninfo>Stavový diagram </screeninfo> <mediaobject> <imageobject> <imagedata fileref="pics/state-diagram.png" format="PNG"/> </imageobject> <textobject> <phrase>Umbrello pri zobrazení stavového diagramu</phrase> </textobject> <caption> <para>Umbrello pri zobrazení stavového diagramu</para> </caption> </mediaobject> </screenshot> </para> <sect3 id="state"> <title>Stav</title> <para>Stavy sú stavebné kamene stavového diagramu. Stav patrí k práve jednej triede predstavuje istú konšteláciu hodnôt atribútov triedy. Tým popisuje stav v UML interný stav objektu istej triedy.</para> <para> Je pritom dôležité, že nie každá zmena atribútov vedie k novému stavu objektu. Ako nový stav má byť označená len zmena atribútov s citeľným vplyvom. </para> <para>Dva špeciálne stavy sú Počiatočný a Konečný stav. To znamená, že sa nemôže stať to, že sa objekt vráti do počiatočného stavu a žiaden impulz nemôže objekt preniesť do iného stavu, ak dosiahol konečný stav. </para> </sect3> </sect2> <sect2 id="helper-elements"> <title>Pomocné prvky</title> <para>V UML existujú 3 prvky, ktoré nemajú sémantický význam v modeli, zjednodušujú však pochopenie diagramov. Tieto prvky sú: </para> <itemizedlist> <listitem> <para>Riadok textu</para> </listitem> <listitem> <para>Poznámkový štítok</para> </listitem> <listitem> <para>Ukotvenie</para> </listitem> </itemizedlist> <para> Pomocou riadku textu môžeme do diagramu vložiť krátku informáciu. Text je samostatný a nemá žiaden význam z pohľadu modelu. </para> <para> Pomocou poznámkového štítku môžeme vložiť detailné informácie o objekte alebo o situácii. Veľkou prednosťou textovej poznámky je, že ju môžeme pripojiť k prvku UML a tým textová poznámka <quote>patrí</quote> k tomuto prvku alebo špeciálnej situácii. </para> <para>Ani ukotvenia nemajú žiaden obsahový význam, sú však užitočné k spojení dvoch prvkov. Takto môžeme napríklad spojiť textové poznámky a objekt diagramu. </para><!-- FIXME, screenshot --> </sect2> </sect1> <!-- uml-elements -> diagram types ??? --></chapter>