<para>See peatükk annab sulle kiire ülevaate &UML;i põhitõdedest. Ära unusta, et see pole põhjalik &UML;i õpik, vaid pigem lühike sissejuhatus &UML;i, mida on võimalik lugeda õpikuna. Kui soovid &UML;i või üldse tarkvara analüüsi ja disaini kohta rohkem teada saada, siis kasuta mõnda paljudest samal teemal saadaolevatest raamatutest. Lisaks on paljud alustuseks sobivad õpikud saadaval Internetis. </para>
<para>&UML; on skeemide loomise keel või täpsemalt öeldes ülesmärkimise keel objektorienteeritud tarkvarasüsteemide kirjeldamiseks, visualiseerimiseks ja dokumenteerimiseks. &UML; ei ole arendusmeetod, mis tähendab, et see ei ütle sulle, mida teha esimesena ja mida järgmisena või kuidas süsteemi disainida, kuid aitab disaini visualiseerida ja teistega edukalt suhelda. &UML; on Object Management Group'i (<acronym>OMG</acronym>) kontrolli all olev tarkvara graafiliseks kirjeldamiseks mõeldud tööstusstandard. </para>
<para>&UML; on mõeldud objektorienteeritud tarkvara disainiks ja toetab seepärast piiratult teisi programmeerimisparadigmasid. </para>
<para>&UML; koosneb paljudest mudeli elementidest, mis esindavad tarkvarasüsteemi erinevaid osi. &UML;i elementide abil luuakse skeeme, mis esindavad kindlaid süsteemi osi või vaatepunkte. Umbrello toetab järgmisi skeemitüüpe: </para>
<listitem><para><emphasis><link linkend="use-case-diagram">kasutusklassiskeemid</link></emphasis> kujutavad tegijaid (inimesed või teised süsteemi kasutajad), kasutusklasse (süsteemi kasutamise võimalused) ja nendevahelisi relatsioone</para> </listitem>
<listitem><para><emphasis><link linkend="class-diagram">klassiskeemid</link></emphasis> kujutavad klasse ja nendevahelisi relatsioone</para> </listitem>
<listitem><para><emphasis><link linkend="sequence-diagram">järgnevusskeemid</link></emphasis> kujutavad objekte ja nende poolt sooritatavate meetodite väljakutsete järgnevusi</para> </listitem>
<listitem><para><emphasis><link linkend="collaboration-diagram">koostööskeemid</link></emphasis> kujutavad objekte ja nendevahelisi relatsioone, pannes rõhu objektidele, mis osalevad teadete vahetamises</para>
<listitem><para><emphasis><link linkend="state-diagram">olekuskeemid</link></emphasis> kujutavad olekuid, olekute muutusi ja sündmusi objektis või süsteemi osas</para> </listitem>
<listitem><para><emphasis><link linkend="activity-diagram">tegevusskeemid</link></emphasis> kujutavad tegevusi ja muutusi ühest tegevusest teise seoses mõnes süsteemi osas toimuvate sündmustega</para></listitem>
<listitem><para><emphasis><link linkend="component-diagram">komponentskeemid</link></emphasis> kujutavad kõrgetasemelisi programmeerimiskomponente (nt. KParts või JavaBeans)</para></listitem>
<listitem><para><emphasis><link linkend="deployment-diagram">Evitusskeemid</link></emphasis> kujutavad komponentide eksemplare ja nendevahelisi relatsioone</para></listitem>
<para>Kasutusklassiskeemid kirjeldavad protsessis osalevate <emphasis>kasutusklasside</emphasis> ja <emphasis>tegijate</emphasis> vahelisi relatsioone ja sõltuvusi.</para>
<para>Tähtis on tähele panna, et kasutusklassiskeemid pole mõeldud disaini kujutamiseks ja süsteemi sisestruktuuride kirjeldamiseks. Kasutusklassiskeemid on mõeldud kergendama suhtlemist kliendi ja süsteemi tulevaste kasutajate vahel ning on eriti kasulikud süsteemi funktsionaalsuse väljaselgitamisel. Kasutusklassiskeemid peaksid ütlema, <emphasis>mida</emphasis> süsteem peab tegema, mitte aga — ja ei tohigi öelda —, <emphasis>kuidas</emphasis> tehtu saavutatakse.</para>
<para>Kasutusklass kirjeldab tegijate vaatenurgast süsteemi tegevuste gruppi, mis tagastab konkreetse ja käegakatsutava tulemuse.</para>
<para>Kasutusklassid on tüüpilised süsteemi kasutajate ja süsteemi enda vaheliste interaktsioonide kirjeldused. Nad esindavad süsteemi välist liidest ja määravad nõuete kogu selle kohta, mida süsteem peab tegema (ära unusta: ainult mida, mitte kuidas). </para>
<para>Kasutusklassidega töötades on tähtis meeles pidada mõned lihtsad reeglid: <itemizedlist>
<listitem><para>iga kasutusklass on seotud vähemalt ühe tegijaga</para></listitem>
<listitem><para>igal kasutusklassil on olemas algataja (&ie; tegija)</para></listitem>
<listitem><para>Iga kasutusklass juhatab kindla tulemuseni (<quote>ärilise väärtusega</quote> tulemuseni)</para>
<para>Ka kasutusklassidel võivad teiste kasutusklassidega relatsioonid olla. Kolm tüüpilisemat kasutusklasside vaheliste relatsioonide tüüpi on:</para>
<listitem><para><emphasis><<include>></emphasis> määrab, kas kasutusklass leiab aset teise kasutusklassi <emphasis>sees</emphasis></para></listitem>
<listitem><para><emphasis><<extends>></emphasis> määrab, et kindlates situatsioonides või mingis punktis (mida kutsutakse laienduspunktiks) laiendab üks kasutusklass teist</para></listitem>
<listitem><para><emphasis>üldistus</emphasis> määrab, et kasutusklass pärib eellasest kasutusklassi omadused ja võib mõnesid omadusi üle kirjeldada või lisada uusi sarnaselt klassidevahelise pärilusega </para>
<para>Tegija on väline olem (süsteemiväline), mis suhtleb süsteemiga, võttes osa (ja sageli algatades) kasutusklassist. Tegijad võivad olla reaalsed inimesed (näiteks infosüsteemi kasutajad), teised arvutisüsteemid või välised sündmused. </para>
<para>Tegijad ei esinda mitte <emphasis>füüsilisi</emphasis> isikuid või süsteeme, vaid nende <emphasis>rolle</emphasis>. See tähendab, et kui isik suhtleb süsteemiga erinevatel viisidel (võttes endale erinevaid rolle), siis kujutatakse teda erinevate tegijatena. Näiteks isikut, kes tegeleb telefoni kaudu kasutajatoeteenuse jagamisega ja võtab klientidelt ka süsteemi kasutamiseks tellimusi, peaks kujutama tegijatena <quote>Kasutajatugi</quote> ja <quote>Müügimees</quote>. </para>
<para>Kasutusklassi kirjeldused on kasutusklassi tekstilised narratiivid. Kujutatakse tavaliselt märkustena või dokumentidena, mis on kuidagi lingitud kasutusklassi külge ja selgitavad kasutusklassis toimuvaid protsesse või tegevusi. </para>
<para>Klassiskeemid kujutavad süsteemi moodustavaid klasse ja nendevahelisi suhteid. Öeldakse, et klassiskeemid on <quote>staatilised</quote> skeemid, sest nad kujutavad klasse, nende meetodeid ja atribuute ning nendevahelisi suhteid: millised klassid <quote>teavad</quote> millistest klassidest või millised klassid <quote>on teiste klasside osadeks</quote>, kuid ei kujuta meetodite väljakutseid nende vahel. </para>
<para>Klass defineerib objektide hulga atribuudid ja meetodid. Kõik klassi objektid (klassi eksemplarid) jagavad ühist käitumist ja omavad samasugust hulka atribuute (igal objektil on isiklikud atribuudid). Vahel kasutatakse klassi asemel terminit <quote>tüüp</quote>, kuid tähtis on märkida, et need kaks ei ole samad ja tüüp on üldisem termin. </para>
<para>&UML;is kujutatakse klasse nelinurkadena, millel on klassi nimi ja mis võivad sisaldada ka klassi atribuutide ja operatsioonide nimesid nelinurga kahes eraldi osas. </para>
<para>&UML;is kuvatakse vähemalt atribuudi nimi ja võib-olla ka selle tüüp, algväärtus ja muud omadused. Lisaks on võimalik kuvada atribuudi nähtavust: </para>
<para>Operatsioonide (meetodite) puhul kuvatakse samuti vähemalt nime ja võib-olla ka parameetreid ja tagastustüüpi. Nagu atribuutide puhulgi, saab ka operatsioonide juures näidata nende nähtavust: <itemizedlist>
<listitem><para><literal>+</literal> tähistab <emphasis>public</emphasis> operatsiooni</para></listitem>
<listitem><para><literal>#</literal> tähistab <emphasis>protected</emphasis> operatsiooni</para></listitem>
<listitem><para><literal>-</literal> tähistab <emphasis>private</emphasis> operatsiooni</para></listitem>
<para>Klassid võivad omada malle, väärtusi, mida kasutatakse määramata klasside või tüüpide asemel. Malli tüüp määratakse alles siis, kui klass algväärtustatakse (&ie; luuakse objekt). Mallid on olemas kaasaegses C++'s ja need hakkavad olema ka Java 1.5's, kus neid kutsutakse geneerikuteks. </para>
<para>Pärilus on üks objektorienteeritud programmeerimise baaskontseptsioone, kus klass <quote>saab</quote> kõik atribuudid ja operatsioonid kaasa sellelt eellasklassilt, millest ta pärineb, ning tohib neid üle kirjeldada ja muuta, aga ka lisada uusi atribuute ja operatsioone.</para>
<para>&UML;is seab <emphasis>üldistuse</emphasis> tüüpi side kahe klassi vahel nad hierarhiasse, mis esindab tuletatud klassi baasklassist pärinemise kontseptsiooni. &UML;is tähistab üldistust kaht klassi ühendav sirge, millel on nool baasklassi poolses otsas. <screenshot>
<para>Side esindab klasside seoseid ning võtab endas kokku paljude objektidevahelist <quote>ühenduse</quote> tüüpide semantika ja struktuuri.</para>
<para>Side on mehhanism, mis võimaldab objektidel üksteisega suhelda. See kirjeldab ühendust erinevate klasside vahel (ühendust tegelike objektide vahel nimetatakse objektiühenduseks ehk <emphasis>lingiks</emphasis>). </para>
<para>Sidemel võib olla roll, mis määrab sideme eesmärgi ja võib olla ühe- või kahesuunaline (märgib, kas kaks seotud objekti võivad teineteisele teateid saata või teab ainult üks teise olemasolu). Sideme mõlemal otsal on ka oma mitmesusväärtus, mis sätestab, mitu objekti sideme antud otsas võib olla seotud ühe objektiga sideme teises otsas. </para>
<para>&UML;is tähistavad sidemeid sirged, mis ühendavad seotud klasse, need võivad ka näidata rolli ja mõlema osapoole mitmesusväärtust. Mitmesust esitatakse mittenegatiivsete väärtuste vahemikuna [min...maks], kusjuures tärn (<literal>*</literal>) maksimumväärtuse asemel tähendab lõpmatust. <screenshot>
<para>Agregatsioon on spetsiaalne side, milles kaks klassi pole mitte võrdväärse staatusega, vaid moodustavad <quote>tervik-osa</quote> seose. Agregatsioon kirjeldab, kuidas osa, millel on terviku roll, koosneb teistest klassidest (omab teisi klasse), millel on osade roll. Agregatsiooni korral on terviku rollis klassi mitmesus alatu üks. </para>
<para>&UML;is tähistab agregatsiooni side, millel on tervikupoolses otsas romb. <screenshot>
<para>Kompositsioonid on sidemed, mis esindavad <emphasis>väga tugevat</emphasis> sidet. See tähendab, et ka kompositsioon kujutab endast tervik-osa seost, kuid see seos on nii tugev, et osad ei saagi omaette eksisteerida. Nad eksisteerivad ainult terviku koosseisus ja kui kaob tervik, kaovad ka osad.</para>
<para>&UML;is tähistab kompositsiooni täidetud romb sideme tervikupoolses otsas. </para>
<para>Liidesed on abstraktsed klassid, mis tähendab, et neist ei saa otseselt eksemplare luua. Nad võivad sisaldada operatsioone, aga mitte atribuute. Klassid võivad olla liideste järglased (realisatsioonisideme kaudu) ning neist skeemidest saab siis luua eksemplare.</para>
<para>Andmetüübid on primitiivid, mis on tavaliselt lisatud juba programmeerimiskeelde. Tüüpnäiteks on täisarvud ja tõeväärtused. Neil ei saa olla seoseid klassidega, kuid klassidel võivad olla seosed nendega.</para>
<para>Väärtustikud on lihtsad väärtuste nimekirjad. Tüüpnäide on nädalapäevade väärtustik. Väärtustiku võtmeid nimetatakse literaalideks. Nagu andmetüüpidel, ei saa ka neil olla seoseid klassidega, küll aga klassidel nendega.</para>
<para>Paketid esindavad nimeruumi programmeerimiskeeles. Skeemidel kasutatakse neid süsteemi osade tähistamiseks, mis sisaldavad enam kui ühe klassi (mõnikord isegi sadu klasse).</para>
<para>Järgnevusskeemid näitavad teadetevahetust (&ie; meetodi väljakutset) mitme objekti vahel teatud ajaliselt piiratud situatsioonis. Objektid on klasside eksemplarid. Järgnevusskeemid rõhutavad erilist teadete objektidele saatmise järjekorda ja aega.</para>
<para>Järjestusskeemidel esindavad objekte püstised punktiirjooned, mille ülemises otsas seisab objekti nimi. Ka ajatelg on vertikaalne, suurenedes allapoole, ning ühelt objektilt teisele saadetud teateid näidatakse nooltena, millele on lisatud operatsiooni ja parameetrite nimed. </para>
<para>Teated võivad olla sünkroonsed (tavaline teatetüüp, mille korral kontroll läheb väljakutsutavale objektile, kuni meetod on töö lõpetanud) või asünkroonsed (kontroll läheb otse tagasi väljakutsuvale objektile). Sünkroonsetel teadetel on väljakutsutud otjekti poolses otsas püstkast, mis näitab programmi kontrolli kulgu.</para>
<para>Koostööskeemid näitavad teatud situatsioonis osalevate objektide interaktsiooni. See on enam-vähem sama info, mida leiab järgnevusskeemilt, kuid viimaste korral on rõhk asetatud sellele, kuidas interaktsioon toimub, koostööskeemi korral aga objektidevahelistele seostele ja nende topoloogiale.</para>
<para>Koostööskeemides esindavad ühelt objektilt teisele saadetavaid teateid nooled, mis näitavad teate nime, parameetreid ja teate järgnevust. Koostööskeemid sobivad eriti hästi esitama spetsiifilist programmikulgu või situatsiooni ning need on parim skeemitüüp konkreetse protsessi kiireks demonstreerimiseks või seletamiseks programmiloogikas. </para>
<para>Olekuskeemid näitavad objekti erinevaid olekuid selle eluea kestel ning stiimuleid, mis põhjustavad objekti oleku muutumise. </para>
<para>Olekuskeemid käsitlevad objekte <emphasis>olekumasinatena</emphasis> ehk lõplike automaatidena, mis võivad olla ühes lõplike olekute kogumis ning muuta oma olekut lõpliku stiimulikogumi vahendusel. Nii võib näiteks objekt tüübiga <emphasis>NetServer</emphasis> olla oma eluea kestel ühes järgmistest olekutest: </para>
<para>Olekud on olekuskeemide ehituskivid. Olek kuulub täpselt ühte klassi ning esindab väärtuste kokkuvõtet, mida klassi atribuudid võivad omada. &UML;i olek kirjeldab konkreetse klassi objekti seesmist olekut. </para>
<para>Pane tähele, et mitte kõiki objekti mõne atribuudi muutusi ei esinda olek, vaid ainult neid muutusi, mis mõjutavad märgatavalt objekti käitumist.</para>
<para>Kaks olekutüüpi on erilised: algus ja lõpp. Need on erilised selle poolest, et ükski sündmus ei saa põhjustada objekti tagasipöördumist algusolekusse ning mitte ükski sündmus ei saa viia objekti välja lõppolekust, kui objekt on sellesse olekusse kord juba jõudnud. </para>
<para>Tegevusskeemid kirjeldavad tegevuste järgnevust süsteemis tegevuste abil. Tegevusskeemid on olekuskeemide erivorm, mis sisaldavad ainult või peamiselt tegevusi. </para>
<para>Tegevusskeemid on sarnased protseduuride vooskeemidega, ainult et kõik tegevused on alati selgelt seotud objektidega.</para>
<para>Tegevusskeemid on alati seotud <emphasis>klassi</emphasis>, <emphasis>operatsiooni</emphasis> või <emphasis>kasutusklassiga</emphasis>.</para>
<para>Tegevusskeemid toetavad nii järgnevaid kui ka paralleelseid tegevusi. Paralleelset täitmist esindavad harunemise/ootamise ikoonid ning paralleelselt kulgevate tegevuste korral pole oluline, millises järjekorras need sooritatakse (neid võib sooritata nii ühel ja samal ajal kui ka üksteise järel).</para>
<para>Tegevus on protsessi üks konkreetne samm. Üks tegevus on üks olek seesmise tegevusega ja vähemalt ühe väljuva siirdega süsteemis. Tegevustel võib olla ka enam kui üks väljuv siire, kui neil on erinevad tingimused. </para>
<para>Tegevused võivad moodustada hierarhia, mis tähendab, et tegevus võib koosneda mitmest <quote>alamtegevusest</quote>, mille korral sisenevad ja väljuvad siirded peavad sobima kokku alamtegevuste skeemi sisenevate ja väljuvate siiretega. </para>
<para>&UML;is on mõned elemendid, millel pole mudelis reaalset semantilist väärtust, kuid mis aitavad selgitada skeemi osi. Need elemendid on järgmised: </para>
<listitem><para>Tekstimärkused ja ankrud</para></listitem>
<listitem><para>Kastid</para></listitem>
</itemizedlist>
<para>Tekstiread on abiks skeemile lühikese tekstilise info lisamisel. See on vabalt asetsev tekst, millel ei ole mingit mõju mudelile endale. </para>
<para>Märkused on abiks põhjalikuma info esitamisel objekti või konkreetse situatsiooni kohta. Nende suureks eeliseks on see, et märkusi saab ankurdada &UML;i elementide külge ning sel moel näidata, et märkus <quote>kuulub</quote> konkreetse objekti või situatsiooni juurde. </para>
<para>Kastid on vabalt asetsevad nelinurgad, millega võib elemente ühte koondada, et skeem oleks selgem ja arusaadavam. Mudelile endas pole neil mingit tähendust.</para>
<para>Komponentskeemid näitavad tarkvarakomponente (kas komponenttehnoloogiat nagu KParts, CORBA komponendid või Java Beans või siis lihtsalt süsteemi selgesti eristatavaid sektsioone) ning artefakte, mis on tekkinud näiteks lähtekoodifailidest, programmi teekidest või relatsioonilistest andmebaasidest.</para>
<para>Evitusskeemid näitavad käitusaja komponentide eksemplare ja nende sidemeid. Nende hulka kuuluvad sõlmed, mis on füüsilised ressursid (tavaliselt üksikarvutid). Nad näitavad ka liideseid ja objekte (klassi eksemplare).</para>