# &UML;i põhitõed

## &UML;ist

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.

&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 (OMG) kontrolli all olev tarkvara graafiliseks kirjeldamiseks mõeldud tööstusstandard.

&UML; on mõeldud objektorienteeritud tarkvara disainiks ja toetab seepärast piiratult teisi programmeerimisparadigmasid.

&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:

- kasutusklassiskeemid kujutavad tegijaid (inimesed või teised süsteemi kasutajad), kasutusklasse (süsteemi kasutamise võimalused) ja nendevahelisi relatsioone

- klassiskeemid kujutavad klasse ja nendevahelisi relatsioone

- järgnevusskeemid kujutavad objekte ja nende poolt sooritatavate meetodite väljakutsete järgnevusi

- koostööskeemid kujutavad objekte ja nendevahelisi relatsioone, pannes rõhu objektidele, mis osalevad teadete vahetamises

- olekuskeemid kujutavad olekuid, olekute muutusi ja sündmusi objektis või süsteemi osas

- tegevusskeemid kujutavad tegevusi ja muutusi ühest tegevusest teise seoses mõnes süsteemi osas toimuvate sündmustega

- komponentskeemid kujutavad kõrgetasemelisi programmeerimiskomponente (nt. KParts või JavaBeans)

- Evitusskeemid kujutavad komponentide eksemplare ja nendevahelisi relatsioone

- Olem-seos skeemid kujutavad andmeid ning andmete vahelisi seoseid ja kitsendusi

## &UML;i elemendid

### Kasutusklassiskeem

Kasutusklassiskeemid kirjeldavad protsessis osalevate kasutusklasside ja tegijate vahelisi relatsioone ja sõltuvusi.

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, mida süsteem peab tegema, mitte aga — ja ei tohigi öelda —, kuidas tehtu saavutatakse.

Kasutusklassiskeemi näidis Kasutusklassiskeem Umbrellos

Kasutusklassiskeem Umbrellos

#### Kasutusklass

Kasutusklass kirjeldab tegijate vaatenurgast süsteemi tegevuste gruppi, mis tagastab konkreetse ja käegakatsutava tulemuse.

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).

Kasutusklassidega töötades on tähtis meeles pidada mõned lihtsad reeglid:

- iga kasutusklass on seotud vähemalt ühe tegijaga

- igal kasutusklassil on olemas algataja (&ie; tegija)

- Iga kasutusklass juhatab kindla tulemuseni (ärilise väärtusega tulemuseni)

Ka kasutusklassidel võivad teiste kasutusklassidega relatsioonid olla. Kolm tüüpilisemat kasutusklasside vaheliste relatsioonide tüüpi on:

- <<include>> määrab, kas kasutusklass leiab aset teise kasutusklassi sees

- <<extends>> määrab, et kindlates situatsioonides või mingis punktis (mida kutsutakse laienduspunktiks) laiendab üks kasutusklass teist

- üldistus 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

#### Tegija

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.

Tegijad ei esinda mitte füüsilisi isikuid või süsteeme, vaid nende rolle. 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 Kasutajatugi ja Müügimees.

#### Kasutusklassi kirjeldus

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.

### Klassiskeem

Klassiskeemid kujutavad süsteemi moodustavaid klasse ja nendevahelisi suhteid. Öeldakse, et klassiskeemid on staatilised skeemid, sest nad kujutavad klasse, nende meetodeid ja atribuute ning nendevahelisi suhteid: millised klassid teavad millistest klassidest või millised klassid on teiste klasside osadeks, kuid ei kujuta meetodite väljakutseid nende vahel.

Klassiskeemi näidis Klassiskeemi kuvamine Umbrellos

Klassiskeemi kuvamine Umbrellos

#### Klass

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 tüüp, kuid tähtis on märkida, et need kaks ei ole samad ja tüüp on üldisem termin.

&UML;is kujutatakse klasse nelinurkadena, millel on klassi nimi ja mis võivad sisaldada ka klassi atribuutide ja operatsioonide nimesid nelinurga kahes eraldi osas.

Klass &UML;is Klassi visuaalne esitus &UML;is

Klassi visuaalne esitus &UML;is

##### Atribuudid

&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:

- `+` tähistab public atribuuti

- `#` tähistab protected atribuuti

- `-` tähistab private atribuuti

##### Operatsioonid

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:

- `+` tähistab public operatsiooni

- `#` tähistab protected operatsiooni

- `-` tähistab private operatsiooni

##### Mallid

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.

#### Klassi sidemed

Klassid võivad olla omavahel seotud mitmel moel:

##### Üldistus

Pärilus on üks objektorienteeritud programmeerimise baaskontseptsioone, kus klass omandab 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.

&UML;is seab üldistuse 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. Üldistus Üldistuse visuaalne esitus &UML;is

Üldistuse visuaalne esitus &UML;is

##### Sidemed

Side esindab klasside seoseid ning võtab endas kokku paljude objektidevahelist ühenduse tüüpide semantika ja struktuuri.

Side on mehhanism, mis võimaldab objektidel üksteisega suhelda. See kirjeldab ühendust erinevate klasside vahel (ühendust tegelike objektide vahel nimetatakse objektiühenduseks ehk lingiks).

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.

&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 (`*`) maksimumväärtuse asemel tähendab lõpmatust. &UML; side Sideme visuaalne esitus &UML;is

Sideme visuaalne esitus &UML;is

##### Agregatsioon

Agregatsioon on spetsiaalne side, milles kaks klassi pole mitte võrdväärse staatusega, vaid moodustavad tervik-osa 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.

&UML;is tähistab agregatsiooni side, millel on tervikupoolses otsas romb. Agregatsioon Agregatsiooniseose visuaalne esitus &UML;is

Agregatsiooniseose visuaalne esitus &UML;is

##### Kompositsioon

Kompositsioonid on sidemed, mis esindavad väga tugevat 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.

&UML;is tähistab kompositsiooni täidetud romb sideme tervikupoolses otsas.

Kompositsioon Kompositsiooni visuaalne esitus &UML;is

#### Teised klassiskeemi elemendid

Klassiskeemid võivad lisaks klassidele sisaldada veel mitmeid elemente.

##### Liidesed (interfaces)

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.

##### Andmetüübid

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.

##### Väärtustikud (enums)

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.

##### Paketid (packages)

Paketid esindavad nimeruumi programmeerimiskeeles. Skeemidel kasutatakse neid süsteemi osade tähistamiseks, mis sisaldavad enam kui ühe klassi (mõnikord isegi sadu klasse).

### Järgnevusskeemid

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.

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.

Järgnevusskeem
&umbrello; järgnevusskeemiga

&umbrello; järgnevusskeemiga

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.

### Koostööskeemid

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.

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.

Koostöö
&umbrello; koostööskeemiga

&umbrello; koostööskeemiga

### Olekuskeem

Olekuskeemid näitavad objekti erinevaid olekuid selle eluea kestel ning stiimuleid, mis põhjustavad objekti oleku muutumise.

Olekuskeemid käsitlevad objekte olekumasinatena 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 NetServer olla oma eluea kestel ühes järgmistest olekutest:

- valmis

- jälgimine

- töötamine

- peatatud

ning sündmused, mis põhjustavad objekti oleku muutuse, on järgmised:

- objekt luuakse

- objekt saab teate jälgida

- klient soovib võrguühendust

- klient katkestab soovi

- soov täidetakse ja lõpetatakse

- objekt saab teate peatuda

- jne

Olekuskeem &umbrello; olekuskeemiga

&umbrello; olekuskeemiga

#### Olek

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.

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.

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.

### Tegevusskeem

Tegevusskeemid kirjeldavad tegevuste järgnevust süsteemis tegevuste abil. Tegevusskeemid on olekuskeemide erivorm, mis sisaldavad ainult või peamiselt tegevusi.

Tegevusskeemi näidis. &umbrello; tegevusskeemiga

&umbrello; tegevusskeemiga

Tegevusskeemid on sarnased protseduuride vooskeemidega, ainult et kõik tegevused on alati selgelt seotud objektidega.

Tegevusskeemid on alati seotud klassi, operatsiooni või kasutusklassiga.

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).

#### Tegevus

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.

Tegevused võivad moodustada hierarhia, mis tähendab, et tegevus võib koosneda mitmest alamtegevusest, mille korral sisenevad ja väljuvad siirded peavad sobima kokku alamtegevuste skeemi sisenevate ja väljuvate siiretega.

### Abielemendid

&UML;is on mõned elemendid, millel pole mudelis reaalset semantilist väärtust, kuid mis aitavad selgitada skeemi osi. Need elemendid on järgmised:

- Tekstiread

- Tekstimärkused ja ankrud

- Kastid

Tekstiread on abiks skeemile lühikese tekstilise info lisamisel. See on vabalt asetsev tekst, millel ei ole mingit mõju mudelile endale.

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 kuulub konkreetse objekti või situatsiooni juurde.

Kastid on vabalt asetsevad nelinurgad, millega võib elemente ühte koondada, et skeem oleks selgem ja arusaadavam. Mudelile endas pole neil mingit tähendust.

### Komponentskeemid

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.

Komponentidel võivad olla liidesed (&ie; abstraktsed klassid operatsioonidega), mis võimaldavad komponentidevahelisi sidemeid.

### Evitusskeemid

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).

### Olem-seos skeemid

Olem-seos skeemid näitavad andmebaasirakenduste kontseptuaalset ülesehitust. Nad kujutavad erinevaid olemeid (kontsepte) infosüsteemis ning nendevahelisi seoseid ja kitsendusi. Olem-seos skeemide laiendusi, mida nimentatakse laiendatud olem-seos skeemideks või täiustatud olem-seos skeemideks, kasutatakse objektorienteeritud ülesehituse põimimsieks olem-seos skeemidesse.

Olem-seos skeemi näidis. Umbrello olem-seos skeemiga

Umbrello olem-seos skeemiga

#### Olem

Olem on mis tahes iseseisvalt eksisteeriv reaalse maailma kontsept. See võib olla füüsiline objekt (näiteks arvuti või robot) või kontseptuaalne objekt (näiteks ülikoolikursus). Igal olemil on oma atribuudid, mis kirjeldavad olemi omadusi.

Märkus: olem-seos skeemide kujutamiseks puudub standardne tähistamisviis. Erinevates tekstides tähistatakse neid erinevalt. Umbrellos kasutatud laiendatud olem-seos skeemide kontseptid ja tähistamisviis on võetud järgmisest raamatust: Elmasri R., Navathe S. Fundamentals of Database Systems. 4. tr. Addison Wesley, 2004.

Olem-seos skeemis kujutatakse olemeid ristkülikutena, mille kohal on olemi nimi ja mis võivad sisaldada ka olemi atribuute ja ristküliku eraldi osas.

Olem olem-seos skeemis Olemi visuaalne esitus olem-seos skeemis

Olemi visuaalne esitus olem-seos skeemis

##### Olemi atribuudid

Olem-seos skeemides näidatakse olemi atribuute koos nende nimega selle olemi omaette osas, mille juurde nad kuuluvad.

##### Kitsendused

Kitsendused määravad olem-seos skeemidest kindlaks andmete piirangud infoskeemis.

Umbrello toetab nelja tüüpi kitsendusi:

- Primaarvõti: atribuudid, mis on deklareeritud primaarvõtmena, on olemile unikaalsed. Olemil saab olla ainult üks primaarvõti ja ükski selle atribuutidest ei saa olla NULL.

- Unikaalne võti: atribuudid, mis on deklareeritud unikaalse võtmena, on olemile unikaalsed. Olemil võib olla mitmeid unikaalseid kitsendusi. Nende atribuudid võivad olla NULL. Unikaalsed võtmed ja primaarvõtmed kirjeldavad unikaalselt tabeli rida (olemit).

- Võõrvõti: võõrvõti on kahe tabeli viitekitsendus. Võõrvõti kirjeldab ühe (viitava) tabeli veergu või veerge, mis vastavad veerule või veergudele teises (viidatavas) tabelis. Viidatava tabeli veerud peavad moodustama primaar- või unikaalse võtme.

- Kontrollkitsendus: kontrollkitsendus (ka tabeli kontrollkitsendus) on tingimus, mis defineerib korrektsed andmed kirje lisamisel või selle uuendamisel relatsioonilise andmebaasi tabelis. Kontrollkitsendust rakendatakse tabeli kõigile ridadele. Kitsendus peab olema predikaat. See võib viidata tabeli ühele või mitmele veerule.

  Näide: hind >= 0

#### Laiendatud olem-skeemi skeemi kontseptid

##### Spetsialiseerimine

Spetsialiseerimine on uute olemite loomise viis juba kirjeldatud olemeid kasutades. Uued ehk tuletatud olemid võtavad üle ehk pärivad olemasolevate olemite ehk baasolemite atribuudid. See on mõeldud olemasolevate andmete korduvkasutamiseks kas üldse ilma muutusteta või väheste muutustega.

Umbrellos saab valida mittepuutuva ja osaliselt kattuva spetsialiseerimise vahel

###### Mittepuutuv spetsialiseerimine

Mittepuutuv spetsialiseerimine näeb ette, et spetsialiseerimise alamklassid peavad olema mittepuutuvad. See tähendab, et olem võib olla maksimaalselt ühe spetsialiseerimise tuletatud olemi liige

Olemid mittepuutuva spetsialiseerimise korral Mittepuutuva spetsialiseerimise visuaalne esitus laiendatud olem-seos skeemis

Mittepuutuva spetsialiseerimise visuaalne esitus laiendatud olem-seos skeemis

###### Osaliselt kattuv spetsialiseerimine

Kui tuletatud olemeid ei kitsendata mittepuutumisega, öeldakse olemite kohta, et nad on osaliselt kattuvalt spetsialiseeritud. See tähendab, et üks reaalse maailma olem võib olla enam kui ühe spetsialiseerimise tuletatud olemi liige

Olemid osaliselt kattuva spetsialiseerimise korral Osaliselt kattuva spetsialiseerimise visuaalne esitus laiendatud olem-seos skeemis

Osaliselt kattuva spetsialiseerimise visuaalne esitus laiendatud olem-seos skeemis

###### Kategooria

Tuletatud olem on kategooria, kui ta esindab objektide kogu, mis on erinevate olemitüüpide ühenduse alamhulk. Kategooria luuakse siis, kui tekib vajadus ühe ülemklassi/alamklassi seose järele enam kui ühe ülemklassiga, milles ülemklassid esindavad erinevaid olemitüüpe. (See sarnaneb objektorienteeritud programmeerimisest tuttava mitmese pärilusega ).

Olemid kategooriaseoses Kategooria visuaalne esitus laiendatud olem-seos skeemis

Kategooria visuaalne esitus laiendatud olem-seos skeemis