logi sisse meist KKK

Kuigi Java põhitõdesid ja mitmeid OO patterned olen õppinud, jääb siiani alati "müstikaks", kuidas Swing kasutades võimalikult hästi eraldada GUI pool ja äriloogika - iga kord kui seda teen, on tunne et olen järjekordse paraja häkiga hakkama saanud.

Kõige lihtsam on ilmselt GUId luues anda talle minig Model kaasa ja iga nupu kliki korral teeb GUI vastavalt model.buttonClicked(). Mis aga siis teha, kui Model tahab GUId muuta - annan modelit luues talle GUI viite kaasa ja lisan GUI klassi vastavad meetodid?

Asjaga on ilmselt mingil määral seotud Observer või Command pattern? Kuskilt ei ole ka leidnud asjalikku seletust, kuna enamik tutoriale seletab et Swing ei ole MVC ja et on ka, kuid head ja ühest näidet on raske leida.

Ilmselt lihtne koodinäide seletaks asja kõige paremini...?

küsitud Mar 04 '10 at 10:30

Indrek%201's gravatar image

Indrek 1
95338

edited Mar 04 '10 at 12:15

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121


Kahjuks, ei saa teps mitte nõustuda Egoni definitsiooniga.

MVC on muidugi üks segane värk ja veebist võib leida palju erinevaid definitsioone, aga minu meelest on kõige selle juures peamine vastutuse eraldamise printsiip, mis taandub sellele, et programmi sisemine loogika ning esitlusloogika peaksid olema üksteisest eraldatud.

MVC antinäide oleks klassikaline PHP segapudru, kus läbisegi andmebaasipäringutega pritsitakse välja HTML-i ja töödeldakse sisendparameetreid.

Heaks stiiliks oleks aga kõik need kolm loogikat lahus hoida. Just nimelt loogikad:

  • Mudel kannab endas rakenduse põhiloogikat (öeldakse ka "äriloogikat", aga see on eksitav termin, sest see ei pea olema sugugi seotud mingigi äriga). Näiteks kalkulaatori puhul on just Mudel see kes teab kuidas arvutusi teha. Ehk nagu nimigi ütleb - ta modelleerib selle domeeni loogikat, milles rakendus tegutseb (olgu selleks domeeniks siis matemaatikatehted või kasside kasvatamine).

  • Vaade kannab endas esitlusloogikat, ehk kuidas rakendus ekraanil välja näeb. Vaade võib olla lihtne HTML template, kus lihtsalt muutujad ära asendakse. Aga see võib sisaldada ka keerukaid algoritme joonistamaks ekraanile animeeritud 3D objekte.

  • Kontroller tegeleb aga kasutajalt saadud sisenditega: teksti sisestamine, hiire liikumine, serverisse saadetavad HTTP päringud. Kontroller interpreteerib saadud sisendeid ning käsutab nende põhjal mudelit. Näiteks kui kasutaja vajutab kalkulaatori "+" nuppu kutsub kontroller välja mudeli liitmise meetodi, mis teostab liitmise ja teavitab omakorda vaadet, et see näiteks saadud tulemust.

MVC ei pea aga olema midagi hiiglaslikku, mis hõlmab enda all kogu rakendust, nagu ehk ülalkirjeldatust võib välja lugeda. Ka rakenduse pisikised komponendid võivad endas sisaldada pisikesi MVC-sid. Näiteks see Egoni poolt välja toodud JTable.

Samuti ei tasu arvata, et MVC põhimõtete järgimiseks on oluline kõigi kolme osa range eraldamine. Näiteks mingi lihtsa käsurea programmi puhul võib kogu vaate moodustada paar printf-i - oleks tobe neid kuidagi ära abstraheerida. Samas kui programmi sisendparameetrite töötlus oleks hea eraldada muust loogikast. Lihtsate GUI-de puhul võib jällegi ära kaduda kontroller - lihtsam on siduda vaade otse mudeliga, näiteks sidudes vormi nupu mudeli mingi meetodiga.

Nagu ikka, peamine on mõtelda mida antud kontekstis kõige targem teha oleks.

link

vastatud Mar 04 '10 at 18:21

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

Leidsin MVC kalkulaatori http://leepoint.net/notes-java/GUI/structure/40mvc.html näiteks juurde...

(Mar 05 '10 at 09:01) egon ♦♦

See MVC kalkulaatori näide on suurepärane! Täpselt mida taga ajanud, JTable'i näide on ka hea aga võtab veidi kauem aega, et läbi närida. Tänud.

(Mar 05 '10 at 13:13) Indrek 1

Kui jutt käib desktop rakendustest siis olenevalt olukorrast ma olen eelistanud Model-View-Presenter mustrit..Lihtsalt kogemusest et kui tuleb palju kasutajaliidese komponente versioniseerida, siis MVP päästab rohkem dubleerimisest kui MVC. Aga asi võib olla ka minus.

link

vastatud Mar 24 '10 at 22:17

Andres%20R.'s gravatar image

Andres R.
81114

edited Mar 28 '10 at 20:11

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

Akadeemiliselt korrektne mudel on iseseisev tarkvara, mille kogu suhtlus on defineeritud läbi tema api ja liideste. Seega pole vahet, kas liidestad mudeli käsureaprogrammi, graafilise kasutajaliidese või mõne veebiteenusega. Lisaks võib api olla ka tööriistaks teistele arendajatele. Praktikas pole küll sellist tõupuhtust enamasti vaja. Kui mudel tahab omaalgatuslikult välismaailmale (nt. Swing GUI) sõnumeid saata, siis selleks võiks olle mudeli poolt defineeritud liides, millega kaudu mudel suhelda saab. Näiteks saab Swingi rakenduses luua klassi, mis antud liidest realiseerib ja siis selle klassi objekti mudelile saata. A'la "model.addListener(MyListener ls)", kus "MyListener" realiseerib mudelis defineeritud "ModelListener" liidest. Sellesse objekti on siis kirjutatud juba antud kasutajaliidese jaoks vajalik loogika, mida mudel teadma ei pea.

link

vastatud Mar 30 '10 at 19:26

Samuel%20Paal's gravatar image

Samuel Paal
862

edited Apr 01 '10 at 14:06

Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×16
×5
×3
×1

küsitud: Mar 04 '10 at 10:30

nähtud: 3,051 korda

viimati uuendatud: Apr 18 '10 at 12:02

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee