Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: MVC-suunnittelua

Macro [03.02.2013 18:44:37]

#

Ohjelmassani on neljä luokkaa: käyttöliittymä, ohjainluokka ja kaksi malliluokkaa Bluetooth- ja tietokantayhteyksiä varten.

Käyttöliittymän puolella on nappula, joka päivittää listan yhteystietoja. Kun tätä painetaan, käyttöliittymä kutsuu ohjaimen metodia, joka puolestaan hakee Bluetooth-malliluokalta listan yhteystiedoista (tulevat puhelimesta Bluetoothin kautta). Nyt ohjainluokalla on ArrayList, joka sisältää Yhteystieto-olioita. Pitäisikö tämä lista välittää ohjaimelta sellaisenaan käyttöliittymälle, vai pitäisikö ohjainluokan päivittää itse nämä käyttöliittymään? Toisin sanoen, välitetäänkö malliluokalta tullut taulukko käyttöliittymän prosessoitavaksi?

Tällöin ohjainluokan ei tarvitsisi kuin välittää tieto ja käyttöiiittymäluokka lisää tiedot näkyviin. Jos ohjainluokka lisää tiedot käyttöliittymään näkyville käyttöliittymäluokan metodien kautta, ei käyttöliittymän puolella tarvitse olla silmukoita ja Yhteystieto-luokan käsittelyä.

Minusta jälkimmäinen kuulostaisi järkevämmältä, koska käyttöliittymä on nimensä mukaan tarkoitettu käytettäväksi eikä tiedon prosessointiin. Toisaalta taas ohjainluokankaan ei kuuluisi käsitellä tiedon näyttämiseen liittyviä asioita.

Eli lähetänkö listan Yhteystieto-luokkia ohjaimelta käyttöliittymäluokalle prosessoitavaksi, vai laitanko ohjainluokan itse päivittämään käyttöliittymää?

janijohannes [03.02.2013 20:35:49]

#

Omissa systeemeissä suosin tapaa, jossa ylempi luokka hoitaa omat asiansa, eikä alemman luokan tarvitse siihen koskea. Suosittelen siis käyttöliittymän itse käsittelevän ne.

Metabolix [03.02.2013 20:59:45]

#

Nähdäkseni yleensä ajatellaan, että ohjain vain käskee piirtää listan ja näkymä jatkaa siitä omalla tavallaan. Ohjaimen ei kuulu ottaa kantaa tiedon esitysmuotoon, vaan tieto pitää välittää näkymälle mahdollisimman raakana; toisaalta näkymälle ei kuulu välittää tarpeetonta tietoa. Jos tieto välttämättä vaatii jotain esiprosessointia, kannattanee prosessoida koko lista kerralla ja välittää näkymälle sitten prosessoitu lista. Jos prosessointi ei ole triviaalia, se usein kuuluu oikeasti mallin puolelle.

Macro [03.02.2013 21:10:41]

#

Kiitos tiedosta. Jatkan ohjelmaa tämän perusteella.

Lisäkysymys: Missä virheet kuuluu käsitellä? Jos malliluokassa tulee virhe, välitänkö sen ohjainluokalle ennen käsittelyä vai teenkö sille jotain jo malliluokassa? Käsittelyllä tarkoitan tulostamista ja ohjelman lopetusta.

Ohjelman toiminnan kannaltahan siinä ei mitään eroa ole, kuten ei alkuperäisessä kysymyksessäkään, mutta jos nyt kunnolla tehdään niin tehdään sitten kaikki.

Metabolix [03.02.2013 21:21:22]

#

Mallia käytetään ohjaimen kautta, joten virheet löytävät oikeaan paikkaan automaattisesti poikkeusten avulla. Toisin sanoen ohjaimeen tehdään tarvittaessa try-catch-rakenne, jonka sisällä mallia käytetään, ja virheilmoitus välitetään ohjaimelle mallista throw-lauseella.

Mallin ei pidä yleensä tehdä mitään käyttäjälle näkyvää, vaan eräs MVC:n idea on, että koko näkymän ja ohjaimen voi vaihtaa (esim. GUI, komentorivi, web) muuttamatta mallia ollenkaan.

Macro [03.02.2013 21:26:37]

#

Kiitos taas vastauksesta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta