Ja he

. Het is goed om er over na te denken. En dan ben ik het liever niet met iemand eens dan wel, want dat dwingt je daar meer toe.
1) De view dient over het algemeen de grafische representatie te zijn van het model, en 2) wordt over 't algemeen via observer pattern genotified van veranderingen: de verantwoordelijkheid van de weergave wordt dan gelegd bij de observer. Let op, ik heb het hier over PRESENTATION logics, i.e. logics die verantwoordelijk zijn voor de weergave van de view elementen. De observer pattern speelt hierbij als een laag aan indirectie en houdt MVC nog steeds via deze weg in stand mbt decoupling. Uit pure nieuwschierigheid en vat het zeker niet op als aanval, maar waar heb jij MVC van geleerd? :-)
Verder, spaghetticode kan iedereen maken, zelfs binnen 1 laag, dus dat argument gaat niet op.
1) Precies. Dus die moet dan niet ook nog eens gaan beslissen wat te doen.
2) Een observer neemt geen beslissingen. Een observer doet een update naar de waarden die door de observable zijn doorgegeven.
Stel je nou eens voor: je hebt 100 Views. En die 100 Views moeten allemaal hun eigen beslissing nemen. Dan heb je dus een Cyclomatic Complexity van 100 keer zo groot dan als je die in de Controller laat nemen en de View hiervan notified. Indien een state-change het veranderen van een kleur inhoudt, dan zegt de Controller: view.setColor(). En in de setColor() wordt dan een refresh gedaan van de UI. Dat doet die view dan wel, maar die view beslist niks. Die view past alleen zijn eigenschappen toe.
1)Nope. Bij MVC dient de controller de input af te handelen van de gebruiker en eventueel operaties uit te voeren op het model. Wanneer het model als gevolg hiervan een statechange met zich meebrengt zal via observer pattern de views hiervan genotified worden en zo blijft scheiding nog steeds gewaarborgd. Dat gezegd hebbende is het bij webapplicaties net een ander verhaal door de stateless nature van HTTP requests en valt er idd wel wat voor te zeggen om in de controller variabelen vrij te geven die de view zou mogen accessen om bepaalde keuzes te kunnen maken. Rails doet dit bijvoorbeeld ook, maar let op, dit is wel degelijk iets anders dan een string replace doen op een html file oid zoals de meeste "template engines" dat doen. Vanuit dat aspect kan je eigenlijk dergelijke waarden ook zien als quasi model: ideaal is het niet, maar goed, schoner hebben we het nog niet kunnen bedenken :-)
1) Ja en dus? Wat is hierin dan de Observable? Dat is dus de Controller.
Sorry maar dit is echt klinklare onzin. Again, de controller is verantwoordelijk voor het afhandelen van user input en interactie van de modellen. De view is simpelweg verantwoordelijk voor de grafische representatie van dit geheel, en kan via observer pattern prima gescheiden gehouden worden. Sterker nog, met deze aanpak kan je gewoon meerdere views maken die net de modellen b.v. anders weergeven. Jouw suggestie zou impliceren dat we meerdere controllers zouden moeten schrijven (edit: of een draak van een controller hebben die met alle mogelijkheden rekening probeert te houden), maar dat geeft niet altijd het gewenste effect mbt de views. Juist door het argument wat je noemt dat de views dan al uit gaan van een bepaalde structuur. 2)Stel dat je zowel een HTML view als een PDF view wil hebben (ik noem maar wat). Dan kom jij er niet alleen met je controller aanpassing doordat de structuur van HTML/PDF gewoon heel anders van elkaar is. Met mijn aanpak kom je daarentegen wel door simpelweg een view te schrijven voor zowel HTML als voor PDF. De controller kan je hierbij dan zowat ongemoeid laten. ([b]edit: tenzij je uiteraard een view maakt die zo anders is dat die ook een andere controller vereist, maar again, dat kan prima met deze aanpak)
1) Dat vind ik dus klinkklare onzin, want als je goed las heet die draak van een Controller een Facotry pattern. Die is daarin gespecialiseerd. En ik snap niet waar je het in godsnaam vandaan haalt dat je met mijn systeem maar 1 type view kunt gebruiken? Dat is juist de clue: dat kan wel. Het enige wat je moet doen is de juiste data doorgeven. Die data die benodigd is blijft namelijk altijd hetzelfde. Al heb je 3 miljoen Views. De Controller zegt: ik wil die en die data doorgeven in die en die view. Die view presenteert dan die data, op zijn manier, maar wel de data die uitgekozen is door de Controller. De View verandert naar gelang de waarden van de Controller anders zijn.
En wat betreft de states:
stel je dit voor:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| //Controller:
public void createView(){
ViewFactory vf = new ViewFacotry();
View view = vf.getConcreteView("honingraten");
}
public void notify(){
if (state = "active"){
view.setActive(); //roep de 'update' aan
}
if (state = "idle"){
view.setIdle(); //roep de 'update' aan
}
}
//View (elke view die je kunt verzinnen):
ViewMetVisjesMotief{
public void setIdle(){
// in het visjesmotief is de kleur van Idle blauw
setColorVanBetreffendeElementen(COLOR.blue);
refreshView();
}
public void setActive(){
// in het visjesmotief is de kleur van Idle blauw
setColorVanBetreffendeElementen(COLOR.red);
refreshView();
}
}
ViewMetHoningRaten
public void setIdle(){
// in het visjesmotief is de kleur van Idle geel
setColorVanBetreffendeElementen(COLOR.yellow);
refreshView();
public void setActive(){
// in het visjesmotief is de kleur van Idle blauw
setColorVanBetreffendeElementen(COLOR.red);
refreshView();
}
} |
De View beslist hier he-le-maal niets. Maar hij heeft wel zijn eigen weergave, op commando van de Controller. De controller bepaalt welke view er noodzakelijk is. De controller bepaalt welke state er actief is en geeft de View de opdracht de bijbehorende kleur in zijn stijl op te halen. Die controller kan uit meerdere types views kiezen en ze dynamisch veranderen.
MOet je je nu eens voorstellen dat de if statement in de view gedaan wordt (idem dito voor de foreach):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| //Controller:
public void createView(){
ViewFactory vf = new ViewFacotry();
View view = vf.getConcreteView("honingraten");
}
public void notify{
view.update(state);
}
//View (elke view die je kunt verzinnen):
ViewMetVisjesMotief{
public void update(){
if (state = "active"){
view.setActive(); //roep de 'update' aan
}
if (state = "idle"){
view.setIdle(); //roep de 'update' aan
}
}
public void setIdle(){
// in het visjesmotief is de kleur van Idle blauw
setColorVanBetreffendeElementen(COLOR.blue);
refreshView();
}
public void setActive(){
// in het visjesmotief is de kleur van Idle blauw
setColorVanBetreffendeElementen(COLOR.red);
refreshView();
}
}
ViewMetHoningRatenMotief(){
public void update(){
if (state = "active"){
view.setActive();
}
if (state = "idle"){
view.setIdle();
}
}
public void setIdle(){
// in het visjesmotief is de kleur van Idle geel
setColorVanBetreffendeElementen(COLOR.yellow);
refreshView();
public void setActive(){
// in het visjesmotief is de kleur van Idle blauw
setColorVanBetreffendeElementen(COLOR.red);
refreshView();
}
} |
Hopla! Cyclomatic Complexity van 10000% in het geval van 100 Views. Dan neemt je CC met elke klasse die je maakt 2 toe. Dat wil je echt niet.
Het is misschien verwarrend, maar de view hoeft geen keuzes te maken wat betreft zijn weergave. De keuzes staan al vast: het is aan de controller deze keuze te activeren.
2) Nee. Je ziet het helemaal verkeerd. HEt enige wat de controller uiteindelijk doet is de juiste waarden doorgeven (de bean dus). Die waarden worden geplaatst in de view. Daar hoeft de view niks over te beslissen. De view doet alleen dom zijn kleurenpatroon, zijn plaatjes, alles wat specifiek is aan hem weergeven. Maar de beslissing welke staat hij moet weergeven is al in de Controller (Observable) gemaakt.
Ik zou jou willen uitdagen om eigenlijk een goed MVC boek erbij te pakken (MVC volgens GoF b.v. en pak dan in het bijzonder dat UML diagram dat erbij staat... wat een verassing, precies zoals ik het beschrijf

) of anders even met m'n software engineering professor te praten ;-)
Er staat ner-gens iets wat mijn kijkwijze negativeert

. Het boek maakt onderscheid tussen M, V en C. Joh, dat doe ik ook

. Wat jij hier allemaal zegt is zelfs klakkeloos overgenomen uit dat boek. Wist je al dat:
Een Design Pattern is de kern van de oplossing van een veelvuldig voorkomend programmeerprobleem
Vind je het gek dat er meningsverschillen over bestaan
Ik zou het anders zelf nog een keer lezen: wat die JSP-pagina doet is het
uitlezen van een bean binnen zijn lay-out. Als je die bean eenmaal hebt doorgegeven hoeven daar geen beslissingen meer over genomen te worden. Als je een foreach loop hebt pak je elke keer een UI element die je op elkaar bouwt a.d.h.v. bijv. een Builder-Controller.
Niet helemaal dus en daar zie ik dus ook de fout in je denken (en ja, je gaat nu vast tand en oog vechten om je gelijk te halen and well, je doet je best maar ;-)). Analogien aside, de controller is verantwoordelijk idd voor het maken van beslissingen, de model modeleert de business en de view is echter verantwoordelijk voor de grafische representatie van dit geheel. Dit kan door observer pattern te gebruiken. Als je het toch graag wil spelen op analogien dan is de view een schilder, de model... een model ( ;-) ), en de controller is de opdrachtgever c.q. artdirector. Als je als artdirector zowel een schilderij van het model in baroque style en als avant-garde wil hebben, dan schakel je daar gewoon 2 daarvoor gespecialiseerde schilders in.
Ja eh, prima, daar ben ik het ook mee eens. Maar dat zegt nog steeds dat de schilder geen beslissingsbevoegdheid heeft.
Je hebt mij niks horen zeggen over de verschillende stijlen. Dat zijn de verschillende Views en daar kun je er best meerederen van hebben?
In jouw analogie doet de controller teveel. Die vertelt nu de typiste hoe ze haar werk moet doen terwijl de typiste prima ook kan bepalen wat ze moet doen mbt de weergave van iets. Indien de manager er niet mee tevreden is dan kan die een andere typiste inschakelen in mijn voorbeeld. En als we de analogie doortrekken in de businesswereld, is jouw aanpak bureaucratisch en de mijne (en die ook van de GoF) gewoon horizontaal ;-)
De typiste heeft haar eigen stijl. Inhoudelijk heeft ze niks te zeggen.