|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
[MVC] Interdipendenze tra Model View e Controller
In un paradigma MVC come è meglio istanziare i singoli componenti?
Questo pattern ha senso anche per programmi che hanno una semplice interfaccia o rappresenta solo una complicazione eccessiva? Il seguente pseudo codice può essere considerato una implementazione valida del pattern? Altre possibilità? Il più delle volte mi pare una complicazione inutile che non porta a grossi benefici. Codice:
Main() {MainController c = new MainController (); c.RenderView();} class MainController { //Così facendo però la testabilità non è il massimo, o dovrei complicare ulteriormente //affidandomi a ViewFactory e ModelFactory solo per motivi di testabilità del controller? private View view; private Model model;public MainController() {}view = new View();//o ViewFactory.Create("MainView"); //oppure è il caso che la view abbia un riferimento all'interfaccia del controller //e la comunicazione avvenga per eventi? //view = new View(this); //Magari in un metodo InitView... view.OnClickSave += this.OnClickSave; view.OnClickNewDialog += this.OnClickNewDialog; //evento necessario per la validazione dei dati inseriti view.OnText1ChangeToValidate += this.OnText1ChangeToValidate; //modifica immediata del model o altro tipo mostra messagebox view.OnCheckbox1Checked += this.OnCheckbox1Checked; ... model = new Model();//o ModelFactory.Create("MainModel"); model.OnChange += this.OnModelChange;} public void RenderView() {view.Show();} private void OnModelChange(ModelData modelData) {//Aggiorno i dati visualizzati prendendoli dal model //ModelData potrebbe essere un contenitore per la valorizzazione di 5 checkbox e 10 texbox view.OnUpdate(modelData);} private void OnClickSave() {//Salvo i dati modificati dalla view model.Save(view.ModelData);} private void OnClickNewDialog() {//Se devo mostrare un altro dialog o form la cui finestra padre è view Controller2 c2 = new Controller2(view);//o ControllerFactory.Create("Controller2"); c2.RenderView();} |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2008
Messaggi: 411
|
Bah dipende, il pattern MVC ha diversi chiari vantaggi di cui puoi beneficiarne anche per progetti piccoli.
Diciamo che se non ti appoggi ad un framework già esistente ma fai una tua "libera interpretazione" del suddetto pattern forse è il caso di evitarlo per progetti piuttosto semplici dove avresti solamente un allungamento dei tempi di sviluppo. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
il MVC è una specializzazione del 3-tier, quindi sarebbe utili per qualsiasi tipo di progetto.
Utilizzando Java, ad esempio viene offerto aggratis dalla metodologia di sviluppo e listening dei componenti grafici. |
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Alla fine il controller è solo un elemento in più che riceve comandi già gestiti dalla GUI/View e che non deve fare altro che reinoltrare al Business/Model. E gestire il controller diventa noioso spesso nel caso in cui a seguito di una azione debbano essere disabilitati dei controlli, ovvero per la gestione dello stato della View. Lo svantaggio è che dato un codice già scritto dover far comunicare tra di loro diversi MVC comincia ad essere impegnativo e spesso porta a refactoring di un certo rilievo, per cui spesso si parte già ad usare il cannone (penso a Front Controller) solo per l'eventualità di doverlo usare in futuro. Quote:
Ma ha senso l'utilizzo dell'MVC con questi toolkit? Vedo framework per l'MVC praticamente solo in ambito web (dove effettivamente ha un suo perchè). |
||
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2008
Messaggi: 411
|
Quote:
Parlo ad esempio di Framework MVC come: Symfony, Zend, Ruby on Rails ecc. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
In ambiente Desktop il MVC è spesso realizzato mediante l' utilizzo di Observer.
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Come dicevo qualche post fa è una estensione del modello n-tier (solitamente 3-tier) per mezzo del controller.
In linea generale la view è l' observer mentre il modello rappresenta il subject, e grazie al disaccoppiamento possono stare in rapporto di 1 a molti (quindi avere più viste di uno stesso modello, classico l' esempio di un file di log e una GUI). Sebbene in linea teorica le 2 entità dovrebbero dialogare esclusivamente per mezzo del controller, nella pratica, come si può evincere da quanto accennato circa l' observer, la view viene informata (o eventualmente può fare polling) attraverso il push dei dati, trasmessi dall' observable al momento di un cambio di stato ovvero la chiamata di un metodo update. Cosa se ne debba fare di questi dati ricevuto, è compito del controller stabilirlo, che inoltre lato view si occupa della gestione degli eventi, mentre lato model deve essere in grado di interagire (spesso viene usato il termine stimolare) con le funzionalità della logia dell' applicazione (in pratica deve conoscere l' interfaccia esposta dal model). |
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Dec 2001
Messaggi: 701
|
penso dipenda dal framework cui ti appoggi. a titolo di esempio cocoa su os x è 100% mvc (e sei di fatto obbligato ad utilizzare questo paradigma)
__________________
Le mie app per iphone: Wow Minis Match Tracker ||| Wow Minis Hit Calculator (in review ![]() Frieza#916 @ SC2 ||| Giullo @ Steam |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Nov 2008
Messaggi: 411
|
Quote:
Tuttavia non sarei così categorico perchè, se non ricordo male, il pattern MVC nasce in ambiente desktop e si riadatta poi anche per il web quindi ... l'MVC comunque è uno strumento, nulla più, è sbagliato dire a priori che sia utile o inutile, dipende da mille fattori. Se ritieni che nel tuo caso non serva non usarlo. Poi magari fra qualche tempo acquisici esperienza in merito e ti rendi conto che forse era meglio seguire l'MVC. Mai confondere il mezzo col fine.
__________________
![]() |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Uno dei vantaggi nell' utilizzo di un mediatore come il controller è la riusabilità massima del codice, dovendo di fatto modificare o adattatore solo il controllore, mentre in una struttura a livelli classica la view deve al minimo conoscere e poter invocare l' interfaccia dello strato applicazione. |
|
![]() |
![]() |
![]() |
#14 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Ma nell'MVC se le modifiche a basso livello comportano (come quasi sempre quando avvengono modifiche al biz) modifiche visuali (cambio di un controllo, di una validazione, di uno stato della vista) ecco che con l'MVC devi modificare 2 elementi controller e view invece di 1, e lo stesso doppio lavoro lo dovrai fare su tutti i controller e tutte le view che insistono su quello stesso model modificato. Quote:
Non riesco a vedere la differenza rispetto ad un tradizionale sviluppo a n-livelli, se non la complicazione di un elemento in più che deve essere strettamente legato alla vista per gestirne lo stato. Solo che nei framework grafici lo stato della vista si gestisce bene dall'interno della vista stessa, senza necessitare di un elemento in più che deve intercettarne ogni singolo evento possibile. E ogni controllo grafico ha molti possibili eventi. |
||
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Premetto che non sono un amante del MVC, ma alcune cosiderazioni vanno fatte.
Sempre restando nell' ambito della riutilizzabilità del codice e considerando il principio di open/closed è sempre meso dispendioso e anche più corretto andare a modificare un elemento bridge (come può essere il controller) rispetto ad operare sugli strati veri e propri. Riprendendo un esempio di prima, potrei usare un sistema di logging quasi standard, andando a modificare solo il controller (lato model) e sfruttando observer sull' asse view-model(anche se non dovrebbe starci). La stessa cosa la potresti ottenere con una architettura a livelli standard, ma al minimo dovresti utilizzare un wrapper per il nuovo livello applicazione. Quindi MVC, costituisce una possibile soluzione ma ve ne sono tante altre che garantisco lo stesso risultato, in maniera complementare o supplementare, a partire dal 3-tier, utilizzando un factory piuttosto che un proxy(magari dynamic) o ancora la reflection. |
![]() |
![]() |
![]() |
#17 | ||||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se modifichi solo il controller significa che hai delle modifiche nel model che non si ripercuotono sulla view, altrimenti avresti dovuto modificare anche la view e l'interazione view/controller oltre a quella controller/model. Quote:
Visualizzazione di log che vengono aggiornati durante l'esecuzione del programma? Personalmente preferisco che view e model non interagiscano per niente, e che la view dialoghi solo con il controller. Anche perchè se la view si collega in qualche modo con il model tanto vale non fare la fatica di usare il controller e sviluppare un semplice n-tier. Ma forse sono io che non ho afferrato bene quali sono i compiti del controller, se deve essere solo un passa carte da e verso il model, oppure come l'ho inteso io, debba gestire lo stato della view. Ma lo stato della view è composto da una infinità di fattori, più o meno pari al prodotto cartesiano di tutte le combinazioni delle proprietà di tutti i controlli presenti. Se ognuno di questi deve essere gestito dal controller dovremmo gestire decine di eventi per le interfacce più semplici fino a qualche centinaio se non di più per quelle un pò più complesse. Oppure lo stato della View è gestito dalla View stessa e quindi non capisco nuovamente il ruolo del controller. Quote:
Se ho aggiunto la possibilità di visualizzare i log nel momento in cui vengono generati, devo per forza modificare la view, in un caso mi basta aggiungere una interfaccia ILogEventSource e legare la view agli eventi sollevati da questa (+ sincronizzazione), nell'altro caso è il controller a doversi interfacciare con questa per poi rimandare alla view i dati ricavati dall'evento, con in più il fatto di dover gestire magari anche lo stato del visualizzatore se ad esempio volessi mostrare solo gli ultimi 5 log. Quote:
![]() |
||||
![]() |
![]() |
![]() |
#18 | ||||
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Quote:
Quote:
Quote:
Quello che il controller non fa è comunicare alla view cambiamenti di stato nel livello applicazioni, in quanto gli stessi (spesso sotto forma di dati da spare in output)vengono pushati dalla layer business alla Gui, il come questi debbano essere gestiti è lavoro peculiare del controller. In molti framework (swing in primis), la distinzione tra view e controller non è cosi netta ma le 2 entità finisco per collassare quasi in un tutt' uno, nel caso specifico per il sistema di gestione degli eventi. Quote:
|
||||
![]() |
![]() |
![]() |
#19 | |||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
E il problema si complica se vogliamo mostrare un altro dialog che comporta l'ingresso di un altra tripletta MVC, quindi il controller deve avviare un altro controller e passargli le informazioni per avvisarlo di mostrare una view modale o magari no, in primo piano o magari no, che magari deve riportare delle modifiche grafiche sulla prima view (penso alle classiche barre degli strumenti di tutti gli editor di immagini, dove un click su un dialog comporta cambiamenti nello stato della finestra principale) piuttosto che no, poi chissà magari il model è lo stesso perchè i dati sono correlati a quelli mostrati precedentemente ovvero sono legati allo stato del primo model, quindi bisogna fare in modo che il nuovo controller gestisca lo stesso model del precedente, perchè può essere che dipenda dal contesto e in certi casi necessiti di un nuovo model e in altri no... Quote:
Il controller è tenuto a sapere che un messaggio verrà mostrato su un MessageBox piuttosto che su una label di errore? In tal caso deve sapere che il MessageBox ha un testo, un titolo, una immagine e tanti pulsanti possibili da visualizzare, nell'altro caso deve sapere che una label ha il testo, il colore, il font e ovviamente li deve comunicare alla finestra. Si limita a mandare alla view un evento di "Mostra messaggio" che poi la view mostrerà come meglio crede? Ma in questo caso il controller non mantiene lo stato della view. E che si intende esattamente per stato della view? La conoscenza dello stato di ogni controllo in essa contenuto? Lo stato dei dati da mostrare? Altro? Quote:
|
|||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:13.