Ohjelmistotekniikan menetelmät, koe 2.5.2014 Vastaa tehtävään 3 erilliselle konseptille. Tehtävät 1 ja 2 saavat olla samalla konseptilla. Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, nimi ja opiskelijanumero. 1. (5p) Vastaa lyhyesti, kattavasti ja kokonaisin lausein alla oleviin kysymyksiin. Sopiva vastauksen pituus koko tehtävään on noin 1-2 sivua. (a) Kerro mikä on vesiputousmalli. (b) Miten ketterä ohjelmistotuotanto eroaa vesiputosmallin mukaan tapahtuvasta ohjelmistotuotannosta? (c) Minkä takia ketterä malli on nykyään suositumpi? 2. (10p) Luokka- ja sekvenssikaavioita. (a) (4p) Kurssi sisältää nimen, tiedon lukukaudesta ja joukon tilaisuuksia. Tilaisuudet voivat olla joko luentoja tai seminaari-istuntoja. Molemmissa tilaisuuksissa on läsnäolioina joukko opiskelijoita. Jokaisella luennolla on luennoijana yksi tai useampi henkilökunnan jäsen. Jokaisella kurssilla on yksi henkilökunnan jäsen vastuuhenkilönä. Henkilökunnan jäsenet voivat olla luennoijana useilla luennoilla sekä toimia useiden kurssien vastuuhenkilöinä. Jokaiseen seminaari-istuntoon liittyy yksi opiskelija roolissa esitelmöijä ja yksi opiskelija roolissa opponentti. Mallinna tilanne luokkakaaviona. (b) (2+4p) Tehtäväpaperin lopusta löytyy katkelma Java-koodia. Takaisinmallinna koodi luokka- ja sekvenssikaaviona. Piirrä sekvenssikaavioon kaikki toiminta minkä Paaohjelma-luokan metodin main suorittaminen saa aikaan. Luokkakaavioon ei tarvitse merkitä metodeja eikä oliomuuttujia, muista kuitenkin merkitä yhteyksien laatu, osallistumisrajoitteet ja suunnat tarkasti. 3. (9p) Tietojenkäsittelytieteen ainejärjestö TKO-äly haluaa uudistaa tenttitärpistöään. Tenttitärpistö on web-palvelu, josta ainejärjestön jäsenet voivat katsella vanhoja tenttejä. Palvelu toimii seuraavasti: järjestelmään kirjautuneelle käyttäjälle näytetään listaus tällä hetkellä järjestettävistä kursseista (esim. "Ohjelmistotekniikan menetelmät") sekä jo arkistoiduista kursseista (esim. "Ohjelmointi (Fortran)"). Klikkaamalla kurssia, käyttäjälle näytetään listaus kaikista järjestelmän tuntemista kurssiin liittyvistä erillis- ja kurssikokeista, sekä kurssin perustiedot, jotka haetaan laitoksen Opintojaksoverkkorajapinnasta. Valitsemalla tietyn kokeen, käyttäjälle näytetään kaikki valitun kokeen tehtävät sekä tieto kokeen vastuuhenkilöstä. Vastuuhenkilön tiedot saadaan laitoksen Peoples-verkkorajapinnasta. Jokaisesta kokeen tehtävästä näytetään tehtävän 1
maksimipistemäärä ja tehtävänanto. Käyttäjä voi myös tarkastella tehtävää tarkemmin, jolloin näytetään malliratkaisu ja arvosteluperuste (mikäli ne tunnetaan) sekä listaus kaikista kokeista joiden osana kyseinen tehtävä on ollut. Järjestelmässä on tavallisten käyttäjien lisäksi ns. ylläpitäjiä, joiden tehtävä on pitää järjestelmä ajantasaisena. Aina tentin jälkeen he lisäävät järjestelmään uuden tentin sekä sen tehtävät. Mikäli tentin jokin tehtävä on jo järjestelmässä, he voivat liittää tällaisen olemassa olevan tehtävän osaksi tenttiä. Lisäksi ylläpitäjät lisäävät järjestelmään uusia kursseja ja arkistoivat vanhoja sitä mukaa kuin laitoksen kurssitarjonta muuttuu. Ylläpitäjät voivat myös muokata olemassa olevia kursseja, tenttejä sekä tehtäviä ja tarvittaessa poistaa niitä. Samoin ylläpitäjät voivat muokata muiden käyttäjien tietoja ja ylentää heitä ylläpitäjiksi. (a) (4p) Laadi kuvatusta tietojärjestelmästä karkean tason käyttötapausmalli, eli etsi käyttäjät ja käyttötapaukset. Määrittele kunkin käyttötapauksen kulku lyhyesti (maksimissaan rivi per käyttötapaus) tekstinä. Mainitse myös jokaisen käyttötapauksen yhteydessä siihen liittyvät käyttäjät sekä esiehdot. Piirrä myös käyttötapauskaavio. (b) (1p) Kuvaa yksi käyttötapauksista tarkemmalla tasolla, ns. Cockburnin käyttötapauspohjan tai luentomonisteen tekstuaalisten kuvausten tyyliin. (c) (4p) Laadi järjestelmän kuvauksen perusteella määrittelyvaiheen (eli kohdealueen) luokkakaavio. Merkitse yhteyksiin kytkentärajoitteet ja nimeä yhteydet ja yhteysroolit tarvittaessa. Ilmeisimmät attribuutit luokille kannattaa merkitä. Muista, että toiminnallisuutta ei kannata määrittelyvaiheen luokkamalliin laittaa! 2
Tehtävään 2 (b) liittyvä ohjelmakoodi: public class Paaohjelma { public static void main(string[] args) { Lentokone lentokone = new Lentokone("Boeing 777"); Pakkaaja pakkaaja = new Pakkaaja(); List<String> tavaratlaukku1 = new ArrayList<String>(); tavaratlaukku1.add("tietokone"); tavaratlaukku1.add("keilapallo"); Matkalaukku laukku1 = new Matkalaukku(1); pakkaaja.pakkaa(laukku1, tavaratlaukku1); lentokone.lisaaruumaan(laukku1); List<String> tavaratlaukku2 = new ArrayList<String>(); tavaratlaukku2.add("hiiri"); tavaratlaukku2.add("hiiri"); Matkalaukku laukku2 = new Matkalaukku(10); pakkaaja.pakkaa(laukku2, tavaratlaukku2); lentokone.lisaaruumaan(laukku2); System.out.println(lentokone); List<Matkalaukku> laukut = lentokone.puraruuma(); for (Matkalaukku matkalaukku : laukut) { System.out.println(matkalaukku); public class Pakkaaja { public void pakkaa(matkalaukku matkalaukku, List<String> tavarat) { for (String nimi : tavarat) { Tavara tavara = matkalaukku.gettavara(nimi); if (tavara!= null) { tavara.kasvatamaaraa(); else { tavara = new Tavara(nimi, 1); matkalaukku.lisaatavara(tavara); 3
public class Matkalaukku { private List<Tavara> tavarat; private int maksimitavaramaara; public Matkalaukku(int maksimitavaramaara) { this.tavarat = new ArrayList<Tavara>(); this.maksimitavaramaara = maksimitavaramaara; private int tavaramaara() { int tavaroita = 0; for (Tavara tavara : tavarat) { tavaroita += tavara.getmaara(); return tavaroita; public void lisaatavara(tavara tavara) { if (this.tavaramaara() < this.maksimitavaramaara) { this.tavarat.add(tavara); public List<Tavara> gettavarat() { return this.tavarat; public Tavara gettavara(string nimi) { for (Tavara tavara : tavarat) { if (tavara.getnimi().equals(nimi)) { return tavara; return null; return "Matkalaukku:" + "\n Maksimitavaramäärä: " + this.maksimitavaramaara + "\n Tavaroita: " + this.tavaramaara() + "\n " + this.tavarat.tostring(); 4
public class Lentokone { private String nimi; private Ruuma ruuma; public Lentokone(String nimi) { this.nimi = nimi; ruuma = new Ruuma(100); public void lisaaruumaan(matkalaukku laukku) { ruuma.lisaa(laukku); public List<Matkalaukku> puraruuma(){ return ruuma.puraruuma(); return "Lentokone " + this.nimi + ":" + "\n Ruuma: " + ruuma.tostring(); public class Ruuma { private List<Matkalaukku> matkalaukut; private int maksimimatkalaukkumaara; public Ruuma(int maksimimatkalaukkumaara) { this.matkalaukut = new ArrayList<Matkalaukku>(); this.maksimimatkalaukkumaara = maksimimatkalaukkumaara; public void lisaa(matkalaukku matkalaukku) { if (this.matkalaukut.size() < maksimimatkalaukkumaara) { this.matkalaukut.add(matkalaukku); public List<Matkalaukku> puraruuma() { List<Matkalaukku> purettavat = new ArrayList<Matkalaukku>(); purettavat.addall(this.matkalaukut); this.matkalaukut.clear(); return purettavat; 5
// public class Ruuma { return "\n Maksimi matkalaukkumaara: " + this.maksimimatkalaukkumaara + "\n Matkalaukkuja: " + matkalaukut.size() + "\n"; public class Tavara { private String nimi; private int maara; public Tavara(String nimi, int maara) { this.nimi = nimi; this.maara = maara; public int getmaara() { return this.maara; public void kasvatamaaraa() { this.maara++; public String getnimi() { return this.nimi; return nimi + " (" + maara + " kpl)"; 6