Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia Tehtävä 1 Tehtävässä 1 mallinnettiin Monopolipeliä. Alla olevassa esimerkissä peliin liittyy aina 2 noppaa, peliä pelataan pelilaudalla, eikä pelilautaa voi olla ilman peliä. Peliin liittyy aina 1 pelilauta. Pelilauta koostuu 40 ruudusta, joista jokainen tietää seuraavan ruutunsa. Pelinappula, joita pelissä on yhteensä pelaajien määrä, sijaitsee aina jollain ruudulla. Pelaajia monopolipelissä on 2-8. Tehtävä 2 Tehtävässä 2 tarkasteltiin yliopiston kursseihin, niiden esitietovaatimuksiin, kurssitoteutuksiin ja opettajiin liittyviä tilanteita. Kurssilla voi olla esitietovaatimuksina muita kursseja, ja siitä tehdään kurssitoteutuksia. Kurssilla on siis aina kattokäsite, joka sisältää kurssin nimen ja muita yleisiä tietoja. Kurssitoteutukset taas ovat konkreettisia kurssista pidettäviä luentosarjoja, joihin liittyy muuta tietoa kuten luento- ja laskariajat. Kurssia luennoi 1 henkilö, ja siihen liittyy 1 tai useampi laskariryhmä. Laskariryhmillä on myös aina 1 assistentti Henkilö. Kurssitoteutusta ei voi olla ilman kurssia. Ilman kurssitoteutusta ei ole siihen liittyviä laskariryhmiä eikä kokeita.
Huomio esitietovaatimuksista: Kurssien välinen yhteys esitietovaatimukset on oikeastaan kaksisuuntainen. Tietty kurssi, esim. Ohjelmoinnin jatkokurssi on esitietovaatimus esim. kurssille Tietorakenteet. Ohjelmoinnin jatkokurssilla on esitietovaatimuksena kurssi Ohjelmoinnin perusteet. Kuvassa yksi yhteysviiva siis pitää sisällään kaksi suuntaa. Oikealta vasemmalle tarkasteltaessa liitetään kurssi niihin kursseihin jotka edellytettään suoritetuksi ennen kurssia. Vasemmalta oikealle tarkasteltaessa yhteys taas liittää kurssin niihin kursseihin joihin osallistumisen edellytyksenä sen suoritus on. Tehtävä 3 Tehtävässä 3 pyydettiin oliokaaviota tehtävän 5 luokkakaavion pohjalta. Alla esitettynä syksyn 2010 tilanne ohjelmistojen mallintaminen-kurssin osalta.
Tehtävä 4: Tehtävä 5:
Tehtävä 6: Luokkien ArrayList ja HashSet paikka Javan luokkahierarkiassa. Ohjelmoijan kannalta tärkeämpään osaan nousevat kuitenkin rajapinnat, joita joukot toteuttavat. Tarkastellaan seuraavaksi niitä. ArrayList HashSet Serializable x x Cloneable x x Iterable x x Collection x x List RandomAccess Set x x Serializable tarkoittaa, että olio on lupa tallettaa levylle tai lähettää esim. verkon yli toiselle ohjelmalle. Cloneable tarkoittaa, että olioista voi ottaa pintakopion clone()-metodilla. Jos ArrayList tai HashSet kopioidaan clone():lla, eivät niiden sisältämät oliot kopioidu. Iterable tarkoittaa, että säiliöluokassa olevat oliot on mahdollista käydä läpi for-each-komennolla tai ns. Iteraattorilla. Collection tarkoittaa, että kyseessä on kokoelma alkoita. Rajapinta määrittelee esim. Metodit add ja remove. Koska sekä HashSet että ArrayList toteuttavat Collection (ja Iterable) -rajapinnan, voidaan niitä käsitellä samalla tavalla. Esim. koodi: sanat.add( eka ); sanat.add( toka ); sanat.add( otm ); for ( String sana : sanat ) { x
} System.out.println( sana ); sanat.remove( otm ); toimii kummallekin seuraavista: ArrayList<String> sanat; HashSet<String> sanat; List tarkoittaa, että alkiot on talletettu rajapinnan toteuttaviin kokoelmiin järjestyksessä, eli kokoelmilla on mm. Metodi get(int i), jolla saadaan kokoelmassa i:ntenä oleva alkio. HashSet ei toteuta rajapintaa List. RandomAccess tarkoittaa, että alkiot ovat List:in vaatimaan tapaan tietyissa paikoissa, ja, että metodin get(int I) suoritus on nopea. (Tarkemmin sanottuna operaatio vakioaikainen, List:issä se on lineaarinen. Näistä enemmän kevään kurssilla Tietorakenteet). Set tarkoittaa, että kyseessä on joukko. Kuten matematiikasta muistamme tietyn alkion voi tallettaa joukkoon vaan kertaalleen. Eli jos luku 1 on joukossa, ja se lisätään joukkoon uudelleen, tuloksena on edelleen sama joukko. HashSet toteuttaa rajapinnan Set. ArrayList taas ei toteuta, eli ArrayList:issä voi samaa alkiota olla useita. Tehtävä 7: HashMap, TreeMap ja EnumMap toteuttavat siis rajapinnan Map koska abstrakti yliluokka AbstractMap toteuttaa sen. Luokat toteuttavat myös kuvaan merkitsemättömät rajapinnat Serializable ja Cloneable. Rajapinta Map määrittelee "mappien" toiminnallisuuden, eli kaikki tallettavat avain-arvo-pareja, ja mahdollistavat mm. avainten sekä arvojen läpikäynnin.
Kaikki mapit eroavat huomattavasti sisäiseltä toteutukseltaan. Tehokkain kaikista on EnumMap, mutta se on myös rajoitetuin, avainten on oltava Enumeja. HashMap on keskimääräisissä tapauksissa hieman nopeampi kuin TreeMap. TreeMapin etuna on se, että avain-arvoparit tallentuvat treemapin sisälle avainten mukaan järjestettynä. Järjestys taas määrittyy avaimena olevan luokan luonnollisen järjestyksen, eli compareto-metodin mukaan ellei treemapin konstruktorissa anneta erilaista järjestyskriteerioa.