wiki:harjoitustyo/malli
Last modified 22 months ago Last modified on 2016-01-08 23:36:46

HT linkit: Ohje Näyttäminen Vinkkejä Vikoja Suunnitelmat 2015 Malliharjoitustyö

Ohjelmointi 2 / malliharjoitustyö 2015

  • viimeisin tilanne (ÄLÄ KATSO TÄSTÄ MALLIA, VAAN siitä vaiheesta missä itse olet menossa)
  • jos/kun katsot mallia, niin älä KOPIOI, vaan yritä ymmärtää mitä on tehty. Pistä malli kiinni ja koita tehdä sama itsenäisesti. Ja muista lisätä vain pieni pala koodia kerrallaan!
  • työ versionhallinnassa

Malliharjoitustyön vaiheet 2015

Vaihe aihe Versionhallinta erot .jar
Vaihe 1 Esisuunnitelma versionhallinta
Vaihe 2 Tarkennettu suunnitelma versionhallinta kerho.jar
Vaihe 3 Pääohjelma ja menut. Toiminnot eivät toimi. versionhallinta 2->3 kerho.jar
Vaihe 4 Tietorakenteet ja luokat versionhallinta
Vaihe 5.1 Jasenet-tietorakenne koodattu ja testattu versionhallinta 4->5.1 kerho.jar
Vaihe 5 Tietorakenteet koodattu ja testattu versionhallinta 5.1->5 kerho.jar
Vaihe 6 Tiedoston käsittely, tietorakenteet toimivat yhteen. versionhallinta 5->6 kerho.jar
Vaihe 7.1 Jäsenen tiedon syöttö versionhallinta 6->7.1 kerho.jar
Vaihe 7.2 Harrastuksen käsittely, oikeellisuustarkistuksia lisätty versionhallinta 7.1->7.2 kerho.jar
Vaihe 7.3 Toimiva, testattu ja dokumentoitu ohjelma. Jäsen kenttätaulukolla versionhallinta 7.2->7.3 kerho.jar
Vaihe 7 Harrastukset kenttätaulukon avulla versionhallinta 7.3->7 kerho.jar
Vaihe 8.1 Tietue ja Tietueet -rajapinnat versionhallinta 7->8.1 kerho.jar
Vaihe jsp WWW-käyttöliittymä ohjelmaan.

Yksinkertaistettu malli luokan jakamisesta kahteen osaan

Yksinkertaistettu malli

  • katso myös yksinkertaiset mallivaiheet, joista kaikki "turha" on karsittu pois
    • käytetään vain Jasenet-luokkaa (ei Harrastukset-luokkaa lainkaan)
    • kaikki käyttöliittymäkoodi on yhdessä luokassa
    • jäsenen tiedoista käsitellään vain 4 ensimmäistä kenttää
    • vain postinumeron muotoa tarkistetaan

Malli jossa liitos Jasen ja Harrastus -luokkien välillä

Erikseen on myös malli jossa on harrastusten nimistä on oma luokka, joka on liitetty relaatiolla harrastuksiin. Tässä mallissa KerhoSwing tuntee tuohon liittämiseen liittyvää problematiikkaa.

Jäsenen ja harrastusten välinen yhteistyö

Jäsenen ja harrastusten välisestä yhteistyöstä on oma Wiki-sivu.

Harjoitustyön oliot

source:/moniste/kuvat/kerhoharGUIpub.png

KerhoGUI ja KerhoSwing välinen suhde (HT3 vaihe)

Malliharjoitustyössä käyttöliittymäkoodi on jaettu useampaan tiedostoon. Esimerkiksi Kerho-luokan käyttöliittymä on kahdessa tiedostossa: KerhoGUI joka on pääosin WindowBuilderillä piirretty. Toinen osa on KerhoSwing, jossa on periaatteessa kaikki itse datan käsittelyyn liittyvä koodi. Näin tuo WindowBuilderillä tehty koodi saadaan paremmin pysymään irrallaan käsin kirjoitettavasta koodista.

Täysin 100% puhtaaksi tuota rajaa on hankala saada.

KerhoGUI luo KerhoSwingin ja siinä samalla luovuttaa viitteen itseensä:

KerhoGUI.java:

63      protected final KerhoSwing kerhoswing;
...
158         kerhoswing = new KerhoSwing(this);

(tuo 158 pitää käsin lisätä muodostajan 1. lauseeksi)

KerhoSwing -luokan muodostajassa tämä viite otetaan vastaan ja talletetaan omaan attribuuttiin kerhoGUI:

050    private KerhoGUI kerhoGUI;
...
056    public KerhoSwing(KerhoGUI kerhoGUI) {
057        this.kerhoGUI = kerhoGUI;
058    }
059

Näin jatkossa voidaan KerhoSwing -luokasta tarvittaessa viitata sen luoneeseen KerhoGUI -luokan olioon.

Aluksi voisi KerhoSwing-luokan ainoa metodi olla vaikkapa:

084    /**
085     * Tekee uuden tyhjän jäsenen editointia varten
086     */
087    public void uusiJasen() {
088        JOptionPane.showMessageDialog(kerhoGUI, "Vielä ei osata lisätä jäsentä!");
089    }

ja tätä kutsutaan KerhoGUI-luokasta vaikkapa:

440             kerhoswing.uusiJasen();

Tämän jälkeen voi alkaa laajentamaan kumpaakin luokkaa pikkuhiljaa niin, että lopulta suurin osa KerhoGUI:n metodeista on siirretty KerhoSwing-luokkaan.

Jotta komponentin näkyvät KerhoSwing luokalle, KerhoGUIssa on publig final (tuo final on tärkeä!) attribuutteina sellaiset komponentit, joihin kerhoSwing-olion pitää päästä käsiksi:

64      /** Kanttä johon kirjoitetaan hakuehto */
65      public JTextField editHaku = new JTextField();
66      /** Paneli, johon jäsenen tiedot luodaan */
67      public final JPanel panelJasen = new JPanel();
68      /** Paneli, johon jäsenen kentät on tarkoitus laittaa */
69      public final Box boxJasen = Box.createVerticalBox();
71      public final JLabel labelVirhe = new JLabel(" ");
72      /** Lista jossa on jäsenten nimet */
73      public final ListChooser listJasenet = new ListChooser();
74      /** Lista josta voidaan valita etsittävä kenttä */
75      public final ComboBoxChooser cbKentat = new ComboBoxChooser();
76      /** taulukko jossa jäsenen harrastukset */
77      public final StringTable tableHarrastukset = new StringTable();
...

(tämä muokkaus siis tehdään käsin vaihtamalla noita suojausmääreitä ja lisäämällä noita final jos ne puuttuvat)

ja KerhoSwingissä (joka kirjoitetaan täysin käsipelissä) noita käytetään:

061    private JLabel getLabelVirhe() {  return kerhoGUI.labelVirhe;   }
062    private AbstractChooser<String> getCbKentat() { return kerhoGUI.cbKentat;   }
063    private JTextField getEditHaku() { return kerhoGUI.editHaku;   }
064    private AbstractChooser<String> getListJasenet() { return kerhoGUI.listJasenet;  }
065    private StringTable getTableHarrastukset() { return kerhoGUI.tableHarrastukset;  }
...
140    protected void naytaJasen() {
141        int ind = getListJasenet().getSelectedIndex();
142        if (ind < 0) return;
143        if (ind > 0)
144            setVirhe("Ei osata näyttää muuta kuin Ankka Aku");
145    }

toki tuossa rivillä 141 voisi suoraankin lukea

    int ind = kerhoGUI.listJasenet.getSelectedIndex();

mutta ehkä tuo on fiksupi kiertää tuon saantimetodin kautta, niin siinä voi tarvittaessa tehdä jotakin temppuja.