Ohjelmistojen mallintaminen, kesä 2012, laskuharjoitus 1

Ensimmäisissä laskuharjoituksissa kerrataan jo aiemmin opittua ja lämmitellään kurssia varten.  Kaikissa tehtävissä ei ole yhtä oikeaa vastausta -- tärkeää on pohdinta ja yrittäminen.

Tehtävä 1 käydään läpi laskuharjoitustilaisuudessa keskustellen. Tehtävät 2-4 valmistellaan ryhmätöinä laskuharjoitustilaisuudessa. Ryhmät esittävät vastauksensa muille osallistujille, jonka aikana / jälkeen käydään keskustelua ratkaisun ominaisuuksista ja muista mahdollisista ratkaisutavoista.

  1. (Keskustelutehtävä) Mikä on olio? Mikä on luokka? Mikä on attribuutti (toiselta nimeltään oliomuuttuja) ja mikä on metodi? Mikä on olion ja luokan keskinäinen suhde? Bonus: Mitä tarkoittaa Javassa static?

  2. (Ryhmätehtävä) Toteuta yksinkertainen Java-ohjelma, jossa on ainakin 2 eri luokkaa. Yksi luokista on sellainen, että sen oliot sisältävät jonkin muun luokan olioita (esim. kello-olio sisältää viisari-olioita, talo koostuu huoneista, auto koostuu moottorista ja renkaista, ...). Tee luokille joitain metodeita. Hahmottele pieni pääohjelma joka demonstroi luokan käyttöä.

  3. Piirrä kuva tai joukko kuvia jotka havainnollistavat mitä edellisessä tehtävässä toteutetussa ohjelmassa tapahtuu.
    Huom! Kuva saa olla ihan minkälainen tahansa, tässä vaiheessa ei oleteta virallisia esitietoja. Oikeastaan tarkoitus on saada opiskelijat piirtämään omanlaisiaan kuvia. Tutustumme kurssilla myöhemmin UML:ään, nyt siitä ei tarvitse tietää mitään.
    Kuvaile miten testaisit että luomasi ohjelma toimii. Onko ohjelmalla mahdollisia poikkeustoimintoja, mitkä täytyy ottaa huomioon? (esimerkiksi kellon tuntiviisari siirtyy yhdellä eteenpäin kun minuuttiviisari pääsee kuuteenkymmeneen) Jos et keksi mitään testattavaa ohjelmassa, kerro miksi. Tässä tehtävässä on tarkoitus pohtia ohjelman testattavuutta, eli esimerkiksi yksikkötestauksesta ei tarvitse vielä tietää mitään.

  4. (Ryhmätehtävä) Mitä seuraavaksi esiteltävässä ohjelmassa tapahtuu? Piirrä kuva tai joukko kuvia jotka havainnollistavat ohjelman toimintaa.
    public class Kioski {
      public Matkakortti ostaMatkakortti(String nimi) {
        Matkakortti uusiKortti = new Matkakortti(nimi);
        return uusiKortti;
      }
    
      public Matkakortti ostaMatkakortti(String nimi, int arvo) {
        Matkakortti uusiKortti = new Matkakortti(nimi);
        uusiKortti.kasvataArvoa(arvo);
        return uusiKortti;
      }
    }
    
    public class Matkakortti {
      private String omistaja;
      private double arvo;
      private int pvm;
      private int kk;
      
      public Matkakortti(String n) {
        omistaja = n; 
        pvm = 0; 
        kk = 0; 
        arvo = 0;
      }
    
      public void kasvataArvoa(double a) { 
        arvo += a; 
      }
    
      public void vahennaArvoa(double a) { 
        arvo -= a; 
      }
    
      public double getArvo(){ 
        return arvo; 
      }
      
      public void uusiAika(int p, int k) {
        kk = k;
        pvm = p;
      }
    }
    
    public class Lataajalaite {
      public void lataaArvoa(Matkakortti k, double a) {
        k.kasvataArvoa(a);
      }
    
      public void lataaAikaa(Matkakortti k, int pvm, int kk) {
        k.uusiAika(pvm, kk);
      }
    }
    
    public class Lukijalaite {
      private double RATIKKA = 1.5;
      private double HKL = 2.1;
      private double SEUTU = 3.5;
    
      public boolean ostaLippu(Matkakortti k, int tyyppi){
        double hinta = 0;
        
        if ( tyyppi == 0 ) hinta = RATIKKA;
        else if ( tyyppi ==1 ) hinta = HKL;
        else hinta = SEUTU;
       
        if ( k.getArvo() < hinta ) return false;
        
        k.vahennaArvoa(hinta);
        return true;
      }
    }
    
    public class Main {
    
      public static void main(String[] args) {
        Lataajalaite rautatietori = new Lataajalaite();
        Lukijalaite ratikka6 = new Lukijalaite();
        Lukijalaite bussi244 = new Lukijalaite();
    
        Kioski lippuLuukku = new Kioski();
        Matkakortti artonKortti = lippuLuukku.ostaMatkakortti("Arto");
        rautatietori.lataaArvoa(artonKortti, 3);
        ratikka6.ostaLippu(artonKortti, 0);
        bussi244.ostaLippu(artonKortti, 2);
      }
    }
    

    Minkälaisilla syötteillä (parametreilla) voit testata edellisessä tehtävässä esitellyn Lukijalaite-luokan ostaLippu-metodia? Minkälaisia virhetilanteita löydät?

  5. (Ryhmätehtävä) Jos joutuisit toteuttamaan Tietojenkäsittelytieteen laitoksen kurssi-ilmoittautumisjärjestelmän, mitä luokkia ohjelmassasi olisi? Tee alustava lista mahdollisista luokista.
    Kirjaa ylös kaikki mieleen tulevat luokkaehdokkaat. Älä ole huolissasi ylimääräisistä tai "tyhmistä" luokkaehdokkaista, ne voidaan tarpeen vaatiessa karsia pois. Tähänkään harjoitukseen ei ole olemassa oikeaa vastausta. Nyt ainoastaan kartoitetaan mitä opiskelijoille tulee mieleen, ennen kuin asiaa on oikeastaan edes opetettu yhtään.

  6. (Ryhmätehtävä) Ohjelmoinnin harjoitustyössä opiskelijan on pidettävä kirjaa käyttämistään työtunneista. Aina kun opiskelija tekee tehtäviä harjoitustyöhön liittyen, on hänen kirjatattava ylös käyttämänsä työaika ja tieto millaiseen tehtävään aika käytettiin. Oletetaan että työtehtävät jakautuvat seuraaviin kuuteen luokkaan:


    Tehtävänä on suunnitella ohjelmoinnin harjoitustyön tuntikirjanpitoa tukeva tietojärjestelmä.


    Ohjelmoinnin harjoitustyö tehdään ryhmässä, johon kuuluu useita opiskelijoita ja yksi ohjaaja. Kukin opiskelija tekee työnsä itsenäisesti. Ryhmän ohjaaja luo jokaiselle ryhmäläiselle käyttäjätunnuksen järjestelmään. Käyttäjätunnuksen luonnin yhteydessä opiskelijan tiedot (mm. osoite, aloitusvuosi, pääaine) kopioidaan OODI-järjestelmästä. Harjoitustyön aikana ohjaaja seuraa ryhmäläisten etenemistä järjestelmän avulla. Ohjelmoinnin harjoitustyön vastuuhenkilön vastuulla on luoda kaikille ohjaajille sopivat käyttäjätunnukset järjestelmään sekä listätä järjestelmään tiedot jokaisesta ryhmästä. Ryhmän tiedot (ohjaaja, tapaamisajat, alku- ja loppupäivämäärä) kopioidaan laitoksen kurssikirjanpitojärjestelmästä.


    Tunnista tietojärjestelmän käyttäjät ja mieti minkälaisia käyttötapauksia järjestelmällä tulisi olla. Käyttötapauksesta riittää mainita nimi ja käyttötapauksen tavoite lyhyesti.