Perché dovrei usare un modello MVC?


74

Oggi sembra che tutti quelli che fanno applicazioni web vogliano usare MVC per tutto. Trovo difficile convincermi a usare questo schema, comunque. Capisco l'idea generale è quella di separare la logica del backend dal frontend che rappresenta il programma. In generale, le viste dipendono sempre dal controller in una certa misura, il che finisce a seconda del modello. Non vedo quale vantaggio mi dia l'aggiunta del controller. Ho letto molto clamore su "questo è il modo in cui le applicazioni dovrebbero essere progettate", ma forse non capisco ancora cosa dovrebbe andare dove. Ogni volta che parlo con altri di MVC sembra che ognuno abbia un'idea diversa di ciò che appartiene a quale categoria.

Quindi, perché dovrei usare MVC? Cosa ottengo utilizzando MVC semplicemente separando il frontend dalla logica del backend? (La maggior parte dei "vantaggi" che vedo di questo modello si ottengono solo separando l'interfaccia dall'implementazione e non riescono a spiegare lo scopo di avere un "controller" separato)


9
MVC è semplicemente un'implementazione di Seperation of Concerns . Qualsiasi implementazione lo farà. Non usare Seperations of Concerns tende a condurre verso una grande palla di fango
Raynos

1
@Raynos: Forse. Ma non è qui che sta andando "hype".
Billy ONeal

3
hype obbedisce alla curva hype . Non lasciarti influenzare troppo. Dal mio punto di vista, MVC è un'architettura solida per SoC e facile da implementare. Non riesco a pensare a una solida alternativa.
Raynos,

maggior parte dei quadri di interfaccia utente esistenti strettamente collegamento V e C e quando si passa ad un altro avrete bisogno di riscrivere sia la vista e il controller (l'interfaccia dalla M alla ciò che l'utente vede)
cricchetto maniaco del

Ma Separation of Concerns è una proprietà dello sviluppo di OO. Non è necessario utilizzare un modello MVW per implementare un codice di separazione delle preoccupazioni corretto?
Bastien Vandamme,

Risposte:


50

Eh. Martin Fowler è d'accordo con la tua confusione su MVC:

Non trovo terribilmente utile pensare a MVC come a uno schema perché contiene alcune idee diverse. Diverse persone che leggono MVC in luoghi diversi ne prendono idee diverse e le descrivono come "MVC". Se ciò non crea abbastanza confusione, si ottiene l'effetto di incomprensioni di MVC che si sviluppano attraverso un sistema di sussurri cinesi.

Tuttavia, continua fornendo una delle spiegazioni più convincenti di ciò che motiva MVC:

Il cuore di MVC è quello che chiamo presentazione separata. L'idea alla base della Presentazione separata è quella di fare una chiara divisione tra oggetti di dominio che modellano la nostra percezione del mondo reale e oggetti di presentazione che sono gli elementi della GUI che vediamo sullo schermo. Gli oggetti di dominio dovrebbero essere completamente autonomi e funzionare senza riferimento alla presentazione, inoltre dovrebbero essere in grado di supportare più presentazioni, possibilmente contemporaneamente.

Puoi leggere l'intero articolo di Fowler qui .


19

Penso che questo dipenda molto dal problema che stai affrontando. Vedo la separazione come segue:

Modello : come rappresentiamo i dati? Ad esempio, come posso passare dai miei oggetti a una memoria permanente come un DB -> come posso salvare il mio oggetto "Utente" nel database?

Controller : cosa sto facendo? Questa è l'azione che sta avvenendo e che cosa, a livello concettuale, deve essere eseguita. Ad esempio, quali fasi sono necessarie per fatturare un utente? NB, ciò può influire su qualsiasi quantità di oggetti, ma non è a conoscenza di come vengono mantenuti nel DB.

Visualizza : come si esegue il rendering del risultato?

Il problema che sento che stai vedendo è che molte applicazioni web sono un'interfaccia CRUD (Create-Retrieve-Update-Delete) glorificata su un DB. vale a dire che al controller viene detto di "aggiungere un utente", e quindi semplicemente dice al modello di "aggiungere un utente". Non si ottiene nulla.

Tuttavia, nei progetti in cui le azioni svolte non si applicano direttamente alle modifiche del modello, un controller rende la vita molto più semplice e il sistema più gestibile .


1
"nei progetti in cui le azioni svolte non si applicano direttamente alle modifiche del modello" Cosa intendi per "modello" qui? Il database? Perché tutti quelli con cui ho parlato affermano che tali azioni appartengono ancora a un modello, non ai controller. (ad esempio, i controller dovrebbero occuparsi solo di cose HTTP ...)
Billy ONeal,

Cosa conta come roba HTTP? Vorrei includere quanto segue in un controller: Smascherare i parametri della richiesta HTTP, controllare i parametri per la sanità mentale di base, determinare cosa deve essere fatto, visitare gli oggetti del modello appropriati (leggere, scrivere o entrambi), producendo un risultato finale basato sulle risposte del modello , passando alla vista. Un esempio sciocco di qualcosa a cui verrebbe utilizzato solo un controller potrebbe essere un servizio web che genera un numero casuale - in questo caso non esiste un "modello" da guardare (almeno nella mia mente ...)
Unk

Questi sono tutti problemi del modello. Anche "decidere cosa deve essere fatto" (il "front controller") è un modello.
Billy ONeal,

2
Per non parlare dei controller sono utili per non accoppiare i tuoi modelli alle tue opinioni. Oltre a consentire di connettere molte visualizzazioni a molti modelli tramite un controller.
Raynos,

1
@Billy: se si consente a una vista di "pasticciare" con il modello - oltre a richiederlo per i suoi valori - si finisce con viste che sono più simili ai controller. Penso di più in termini dell'incarnazione del modello-GUI-Mediatore di MVC. Il controller media tra il modello (comportamento e dati del dominio) e la GUI (rappresentazione sullo schermo del modello). La vista passa solo le interazioni al controller (l'utente ha fatto clic ...). Il controller decide quale (se presente) deve essere chiamato sul modello. Vantaggi: ...
Marjan Venema

8

Non dovresti.

Vorrei riformularlo. È necessario utilizzare un'architettura che separa la logica dalle viste. Se necessario, è necessario utilizzare un'architettura che utilizza un controller (come MVC) se è richiesta una logica che non si adatta necessariamente a un modello (come, diciamo, un attraversamento di alberi che analizza blocchi di URL).

Venendo da CI e Yii, ho pensato che avere un controller dedicato fosse un'idea davvero interessante. Tuttavia, quando si sviluppano applicazioni con interfacce RESTful appropriate, la necessità di un controller di gestire la logica non specifica del modello sembra diminuire. Quindi, quando mi sono trasferito a Django e poi a Pyramid (nessuno dei quali segue completamente l'architettura MVC), ho scoperto che il controller non era in realtà un componente richiesto per le applicazioni che stavo costruendo. Si noti che entrambi i framework dispongono di funzionalità "controllerish", come URL Dispatching in Pyramid, ma è una cosa di configurazione, non una cosa di runtime (come CController in Yii).

Alla fine della giornata, ciò che è veramente importante è la separazione della vista dalla logica. Questo non solo risolve le cose in termini di implementazione, ma consente anche agli ingegneri FE / BE di lavorare in parallelo (quando lavorano in un ambiente di squadra).

(Nota a margine: non sviluppo applicazioni Web in modo professionale, quindi potrebbe esserci qualcosa che mi manca)


Sono totalmente d'accordo, buona risposta. Il controller non è sempre necessario, è solo inteso come una strategia per la vista per comunicare con il modello.
Falcon,

@Falcon: Vedi, questa è la mia confusione. Ho visto più di una persona dire che la vista non dovrebbe assolutamente parlare con il controller; che dovrebbe parlare solo con la modella ...
Billy ONeal,

1
Se stai utilizzando un'implementazione MVC effettiva, la vista non parla al controller (o al modello in questione). Il controller imposta lo stato del modello, prepara i dati per la vista e li invia alla vista.
Demian Brecht,

@Demian: ho sentito il contrario (che i controller non dovrebbero effettivamente fare nulla). Spesso. Questo è il mio più grande problema con questo modello; nessuno sembra essere d'accordo su cosa sia.
Billy ONeal,

3
Sì, ho sentito spesso che se ottieni 10 programmatori in una stanza, otterrai 9 diverse definizioni di ciò che è MVC. In realtà, il punto principale è la separazione delle preoccupazioni. Ciò che succede sembra essere un dibattito religioso.
Demian Brecht,

1

Sì, la terminologia su questo è un casino. È difficile parlarne perché non hai mai capito cosa significhi qualcuno con i termini.

Per quanto riguarda il motivo per cui un controller separato, il motivo potrebbe dipendere dalla versione del controller di cui stai parlando.

Potresti desiderare un controller perché quando esegui i test la vista ha un sacco di widget che non hai scritto e che probabilmente non vuoi testare. Sì, hai separato l'implementazione dall'ereditarietà, quindi puoi usare uno stub o un finto per testare altre cose, ma quando testi la tua visione concreta in sé è più difficile. Se avessi un controller che non aveva widget con lo stesso codice, potresti provarlo direttamente e forse non è necessario testare i widget tramite script.

Le altre versioni di IMHO sono più difficili da mostrare per un vantaggio concreto. Penso che sia principalmente un problema di separazione delle preoccupazioni: separa le preoccupazioni della GUI visiva pura dalla logica che si applica alla GUI ma non fa parte del modello di business (cose come, tradurre gli aggiornamenti dal modello in cui i widget dovrebbero essere visibili). Ma in pratica è probabile che le due classi siano così strettamente accoppiate (anche se comunicano attraverso le interfacce) che è difficile essere troppo sconvolti nel fonderle in una sola vista e tenere d'occhio i modi in cui la funzionalità potrebbe essere più riutilizzabile se fossero divisi.


0

In poche parole: separazione delle preoccupazioni. A parte tutto il discorso sul modo "corretto" di fare le cose, avere un codice più pulito, ecc. Puoi solo dire che MVC ti consente di riutilizzare più facilmente il tuo codice. Fondamentalmente programmi i tuoi modelli e i tuoi controller e puoi usarli indistintamente in un'app web, un'app desk, un servizio, ovunque senza troppi sforzi.


2
Non è diverso dalla semplice definizione di un livello UI e un livello funzionale. Non hai spiegato perché il bit del controller è necessario.
Billy ONeal,

-3

Bene, il motivo di base per l'utilizzo di una struttura MVC si presenta in una configurazione industriale, in cui un singolo processo di lavoro, un singolo modello è seguito per lo sviluppo di qualsiasi applicazione. Pertanto, nel caso in cui il progetto passi da un modulo di un'organizzazione a un altro, è molto più semplice fornire una migliore comprensione dello scenario di lavoro. Incorpora la chiarezza del lavoro.
Mentre tu, come individuo, avresti un approccio diverso per la tua applicazione, tu quando lavori in modo combinato con un associato, prima discuteresti e atterri su un modello comunemente concordato dai due (tu e il tuo associato). E in tal caso, separa le responsabilità assegnate a te e al tuo associato rispettivamente con un margine distintivo.


-3

Penso che MVC sia usato solo una parola d'ordine dai teorici che sono manager. Tuttavia, detto ciò, l'attuale iterazione del web con HTML5 prevalente, design reattivo e cercando di creare una singola linea di programmazione di database che funzionerà sul web e su un iPhone si presta alle idee generali di MVC. La tecnologia Web front-end si sta letteralmente muovendo alla velocità della luce in questo momento con Jquery, nuove iterazioni del controllo CSS, mentre il lato server delle cose si sta muovendo al ritmo di una lumaca.

Alla fine, tutto sul server sarà davvero solo servizi o "applet" che invieranno i dati al front-end e, a seconda del tipo di client che possiedi, tali dati verranno consumati e visualizzati in modo diverso. In tal senso, MVC ha un senso.

A questo proposito, credo nell'attuale mondo reale, l'MVVM è davvero un "modello" migliore o qualunque cosa tu voglia chiamarlo rispetto a un controller perché un controller deve sempre tornare al modello per cambiare la vista e questo è lento . Nel modello MVVM ViewModel può fornire aggiornamenti immediati alla vista. Inoltre, il modello MVVM promuove i principi di progettazione RESTful IMHO.


è solo una tua opinione o puoi sostenerla in qualche modo?
moscerino

3
(non ha votato in basso) Beh, è ​​stata una parola d'ordine che va avanti oltre 40 anni se lo è.
Billy ONeal,

2
Vorrei incoraggiarvi a fare qualche ricerca aggiuntiva sulle origini del modello MVC e sui modelli aggiuntivi che ha generato come MVP e MVVM. C'è molta più storia nello schema di quanto l'attuale spavalderia possa farti credere.

1
Dalla storia del controller Model View : "MVC è stato inventato a Xerox Parc negli anni '70, apparentemente da Trygve Reenskaug. Credo che la sua prima apparizione pubblica sia stata in Smalltalk-80. Per molto tempo non ci sono state praticamente informazioni pubbliche su MVC, nemmeno in Smalltalk -80 documentazione. Il primo documento significativo pubblicato su MVC fu "Un ricettario per l'uso del paradigma dell'interfaccia utente Model-View-Controller in Smalltalk -80", di Glenn Krasner e Stephen Pope, pubblicato nel numero di agosto / settembre 1988 del JournalOfObjectOrientedProgramming (JOOP)."

Ci sono molte parole chiave molto più importanti come KISS che sono in circolazione da più tempo e ricevono molta MENO attenzione.
Michael Barber,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.