{"id":288,"date":"2020-03-04T11:46:38","date_gmt":"2020-03-04T09:46:38","guid":{"rendered":"https:\/\/coursepages.uta.fi\/tiea2-1b\/?page_id=288"},"modified":"2020-03-04T11:46:38","modified_gmt":"2020-03-04T09:46:38","slug":"uml","status":"publish","type":"page","link":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/kevat-2020\/harjoitustyo\/uml\/","title":{"rendered":"UML"},"content":{"rendered":"<h3>Yleist\u00e4<\/h3>\n<p>Alla on annettu yleisi\u00e4 ohjeita luokkakaavion piirtoon. Muista lukea my\u00f6s teht\u00e4v\u00e4nannossa sanottu, vaikka alla olevassa kattaa varsin pitk\u00e4lle aiemmin annetun ohjeistuksen.<\/p>\n<ul>\n<li>Esit\u00e4 luokkatyyppinen attribuutti assosiaatioina, kun attribuutin tyyppi on jokin itse tekem\u00e4si luokka (esimerkiksi <em>Kokoelma<\/em>).<\/li>\n<li>Esit\u00e4 attribuutti luokkasymbolin attribuuttitasolla, jos attribuutti on alkeistyyppinen tai Javan omaa luokkatyyppi\u00e4 (esimerkiksi <em>String<\/em>).<\/li>\n<li>Esit\u00e4 kaaviossa tavallisten attribuuttien lis\u00e4ksi my\u00f6s vakiomuotoiset attribuutit.<\/li>\n<li>Valmiina annettujen luokkien ja rajapintojen symboleissa riitt\u00e4\u00e4 kirjoittaa n\u00e4kyviin vain symbolin nimi. N\u00e4iden symboleiden attribuutit ja metodit saa halutessaan piirt\u00e4\u00e4. Omien luokkien sek\u00e4 valmiina annettujen luokkien ja rajapintojen suhteet on piirrett\u00e4v\u00e4.<\/li>\n<li>Piirr\u00e4 assosiaatioiden, periytymissuhteiden ja toteuttamissuhteiden lis\u00e4ksi my\u00f6s riippuvuussuhteet.<\/li>\n<li>Kokoa pakkaukseen kuuluvat symbolit pakkaussymbolin sis\u00e4\u00e4n.<\/li>\n<li>Kaavion voi jakaa kahdelle tai useammalle sivulle tilan loppuessa.<\/li>\n<li>Luokkakaavion sis\u00e4lt\u00f6 tulee selitt\u00e4\u00e4 sanallisesti dokumentissa.<\/li>\n<\/ul>\n<h3>Piirtoty\u00f6v\u00e4lineist\u00e4<\/h3>\n<p>Harjoitusty\u00f6n dokumentaatioon kuuluu UML-luokkakaavio, jonka piirt\u00e4minen on helpointa kaavioiden piirtoon tehdyll\u00e4 ohjelmalla. T\u00e4llainen on esimerkiksi ER-kaavioista tuttu <a href=\"https:\/\/wiki.gnome.org\/Apps\/Dia\">Dia<\/a>. NetBeans- ja Eclipse-ohjelmistojen kaltaisiin kehitysymp\u00e4rist\u00f6ihin on saatavilla UML-lis\u00e4osia. Wikipediassa on kattava <a href=\"https:\/\/en.wikipedia.org\/wiki\/List_of_Unified_Modeling_Language_tools\">lista<\/a> omalle koneelle saatavilla olevista UML-ty\u00f6kaluista. Selaimella k\u00e4ytett\u00e4vi\u00e4 ty\u00f6v\u00e4lineit\u00e4 on esimerkiksi ilmainen <a href=\"https:\/\/www.draw.io\/\">draw.io<\/a>-palvelu.<\/p>\n<p>Harjoitusty\u00f6n luokkakaaviossa on niin paljon piirrett\u00e4v\u00e4\u00e4, ett\u00e4 kaaviota ei kannata tehd\u00e4 t\u00e4ysin manuaalisesti, vaikka ohjelmassa olisikin k\u00e4ytett\u00e4viss\u00e4 UML-symbolit. Tavanomaisemman ohjelman sijaan kannattaa valita <strong>takaisinmallintamisen hallitseva piirto-ohjelma <\/strong>tai lis\u00e4osa. Takaisinmallintava ty\u00f6v\u00e4line muodostaa l\u00e4hdekoodista kaavion, jossa on tyypillisesti automaattisesti luodut symbolit luokille ja rajapinnoille. Vaikka kaaviota pit\u00e4\u00e4 usein t\u00e4ydent\u00e4\u00e4 manuaalisesti muun muassa lis\u00e4\u00e4m\u00e4ll\u00e4 itse luokkien v\u00e4liset assosiaatiot, on ajans\u00e4\u00e4st\u00f6 huomattava t\u00e4ysin manuaaliseen ty\u00f6h\u00f6n verrattuna. Takaisinmallinnuksen ongelmana on valitettavasti se, ett\u00e4 suuri osa ilmaisista takaisinmallintamisen hallitsevista ilmaisista ohjelmista on keskener\u00e4isi\u00e4, rikki tai ylett\u00f6m\u00e4n vaikeak\u00e4ytt\u00f6isi\u00e4.<\/p>\n<h3>UMLet<\/h3>\n<p><a href=\"http:\/\/www.umlet.com\/\">UMLet-ohjelma<\/a> vaikuttaa olevan vastuuopettajan testaamista huonoista vaihtoehdoista paras harjoitusty\u00f6koodin luokkakaavion puoliautomaattiseen muodostamiseen.UMLet on ilmainen ja siit\u00e4 on saatavilla sellaisenaan ajettava (stand-alone) itsen\u00e4inen versio, joka asennetaan purkamalla <a href=\"http:\/\/www.umlet.com\/changes.htm\">lataussivuilta<\/a> valittu zip-paketti koneelle. Ohjelman k\u00e4ynnistyy kaikissa k\u00e4ytt\u00f6j\u00e4rjestelmiss\u00e4 <em>umlet.jar<\/em>-tiedostoa kahdesti klikkaamalla. Ohjelman voi k\u00e4ynnist\u00e4\u00e4 my\u00f6s omalle k\u00e4ytt\u00f6j\u00e4rjestelm\u00e4lle ominaisella tavalla: Windows-k\u00e4ytt\u00e4jille on tarjolla <em>Umlet.exe<\/em>-tiedosto (klikkaa kahdesti) ja kovan luokan Mac- ja Linux-k\u00e4ytt\u00e4jille skripti (muokaa ja suorita komentorivilt\u00e4).<\/p>\n<p>Ohjelman itsen\u00e4isess\u00e4 versiossa on <em>File | Generate Class Elements from Files or Directory<\/em> -toiminto, jonka kautta valitaan tiedostot tai hakemistot, joiden Java-koodista halutaan muodostaa luokka- ja rajapintasymbolit. Poista tavukooditiedostot ennen takaisimallintamista, koska UMLet lukee aina molemmat.<\/p>\n<p>UMLet ei tee edes periytymissuhteita luokkien v\u00e4lille, vaan kaikki suhteet on teht\u00e4v\u00e4 manuaalisesti. Joudut siis poistamaan luokkalaatikoista attribuutteja ja piirt\u00e4m\u00e4\u00e4n niit\u00e4 vastaavat assosiaatiot luokkien v\u00e4lille. My\u00f6s pakkaussymbolit on lis\u00e4tt\u00e4v\u00e4 kaavioon manuaalisesti.<\/p>\n<p>Kaavion osien ominaisuuksien muokkaaminen tapahtuu tavallisuudesta poiketen teksti\u00e4 k\u00e4sittelem\u00e4ll\u00e4. Onneksi muokkaaminen on t\u00e4ll\u00e4 tavoin melko intuitiivista. Kaavion aktiivisen osan sis\u00e4lt\u00f6 n\u00e4kyy aina tekstin\u00e4 ohjelman p\u00e4\u00e4ikkunan oikeassa alakulmassa olevassa <em>Properties<\/em>-ikkunassa. Esimerkiksi <em>Hakemisto<\/em>-luokan symbolin (kuva 1a) m\u00e4\u00e4rittelyss\u00e4 (kuva 1b) kukin luokkasymbolin osa on esitetty tekstuaalisesti. Luokkasymbolista on poistettu k\u00e4sin <em>sisalto<\/em>&#8211; ja <em>ylihakemisto<\/em>-attribuutit, koska ne on esitett\u00e4v\u00e4 assosiaatioina.<\/p>\n<table>\n<tbody>\n<tr>\n<td><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-190 size-full\" src=\"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-content\/uploads\/sites\/105\/2019\/05\/hakemisto.png\" alt=\"\" width=\"370\" height=\"280\" srcset=\"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-content\/uploads\/sites\/105\/2019\/05\/hakemisto.png 370w, https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-content\/uploads\/sites\/105\/2019\/05\/hakemisto-300x227.png 300w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/><\/td>\n<\/tr>\n<tr>\n<td>Kuva 1a: <em>Hakemisto<\/em>-luokan symboli.<\/td>\n<\/tr>\n<tr>\n<td>\n<pre>Hakemisto\r\n--\r\n+HAKEMISTOEROTIN = \"\/\": String\r\n--\r\n+Hakemisto()\r\n+Hakemisto(StringBuilder uusiNimi)\r\n+Hakemisto(StringBuilder uusiNimi, Hakemisto ylla)\r\n+sisalto(): OmaLista&lt;Tieto&gt;\r\n+sisalto(OmaLista&lt;Tieto&gt; uusiSisalto): void\r\n+ylihakemisto(): Hakemisto\r\n+ylihakemisto(Hakemisto ylla): void\r\n+toString(): String\r\n+hae(String hakusana): LinkedList&lt;Tieto&gt;\r\n+lisaa(Tieto lisattava): boolean\r\n+poista(Tieto poistettava): boolean\r\n+iterator(): Iterator&lt;Tieto&gt;<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>Kuva 1b: <em>Hakemisto<\/em>-luokan symbolin ominaisuudet.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Elementti (symboli tai suhde) lis\u00e4t\u00e4\u00e4n kaavioon kaksoisklikkaamalla sit\u00e4 UMLetin p\u00e4\u00e4ikkunan oikean yl\u00e4kulman ikkunassa. Suhteet reititet\u00e4\u00e4n ja kiinnitet\u00e4\u00e4n symboleihin hiiren avulla. Elementti valitaan klikkaamalla sit\u00e4 kerran. Valitun elementin ominaisuudet p\u00e4ivittyv\u00e4t <em>Properties<\/em>-ikkunaan.<\/p>\n<table>\n<tbody>\n<tr>\n<td rowspan=\"3\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-382 size-full\" src=\"https:\/\/coursepages2.tuni.fi\/tiea2-1\/wp-content\/uploads\/sites\/79\/2018\/04\/LinkitettyLista-_ja_Solmu-luokat.png\" alt=\"\" width=\"344\" height=\"290\" \/><\/td>\n<td valign=\"top\">\n<pre>lt=&lt;&lt;&lt;&lt;-\r\nm2=   2\r\nr2=paa, hanta<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>Kuva 2b: <em>LinkitettyLista<\/em>&#8211; ja <em>Solmu<\/em>-luokan<br \/>\nv\u00e4lisen koostesuhteen ominaisuudet.<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\">\n<pre>lt=-\r\nm1=1\r\nm2=0..1\r\nseuraava&gt;<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td>Kuva 2a: <em>LinkitettyLista<\/em>&#8211; ja <em>Solmu<\/em>-luokkien symbolit.<\/td>\n<td>Kuva 2c: <em>Solmu<\/em>-luokan refleksiivisen<br \/>\nsuhteen ominaisuudet.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Kuvassa 2a on piirretty kaksi suhdetta, joiden ominaisuudet on annettu kuvissa 2b ja 2c. Kuvista k\u00e4y ilmi, ett\u00e4 suhteen tyyppi m\u00e4\u00e4ritell\u00e4\u00e4n <em>lt<\/em>-attribuutin avulla. Attribuuteilla <em>m1<\/em>&#8211; ja <em>m2<\/em>-m\u00e4\u00e4ritell\u00e4\u00e4n kertautumiset suhteen l\u00e4ht\u00f6- ja tuloluokissa. Attribuuteilla <em>r1<\/em>&#8211; ja <em>r2<\/em> annetaan roolit. Suhde voidaan my\u00f6s nimet\u00e4 ja sen lukusuunta m\u00e4\u00e4ritell\u00e4 (kuva 2c). Kuvan 2b kertautumisarvon ja roolinimien eteen on laitettu v\u00e4lily\u00f6ntej\u00e4, jotta tekstit olisivat paremmin luettavissa.<\/p>\n<p>Kaavion saa tallennnettua kuvaksi tai pdf-muotoon <em>File | Export as &#8211;<\/em>toiminnolla.<\/p>\n<p>UMLetia k\u00e4ytt\u00e4ess\u00e4\u00e4n saa varautua siihen, ett\u00e4 k\u00e4ytt\u00f6liittym\u00e4 ei aina piirry kunnolla. Yleens\u00e4 ikkunan koon muuttaminen tai ikkunan liikuttelu palauttaa osin kadonneet valikot n\u00e4kyviin.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yleist\u00e4 Alla on annettu yleisi\u00e4 ohjeita luokkakaavion piirtoon. Muista lukea my\u00f6s teht\u00e4v\u00e4nannossa sanottu, vaikka alla olevassa kattaa varsin pitk\u00e4lle aiemmin annetun ohjeistuksen. Esit\u00e4 luokkatyyppinen attribuutti assosiaatioina, kun attribuutin tyyppi on jokin itse tekem\u00e4si luokka (esimerkiksi Kokoelma). Esit\u00e4 attribuutti luokkasymbolin attribuuttitasolla, jos attribuutti on alkeistyyppinen tai Javan omaa luokkatyyppi\u00e4 (esimerkiksi String). Esit\u00e4 kaaviossa tavallisten attribuuttien lis\u00e4ksi &hellip; <a href=\"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/kevat-2020\/harjoitustyo\/uml\/\" class=\"more-link\">Jatka artikkeliin <span class=\"screen-reader-text\">UML<\/span><\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"parent":278,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-288","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/comments?post=288"}],"version-history":[{"count":2,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/288\/revisions"}],"predecessor-version":[{"id":290,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/288\/revisions\/290"}],"up":[{"embeddable":true,"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/pages\/278"}],"wp:attachment":[{"href":"https:\/\/coursepages2.tuni.fi\/tiea2-1b\/wp-json\/wp\/v2\/media?parent=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}