Il controller dovrebbe conoscere View & Model? o vice versa?


13

Sto concettualmente cercando di capire se dovrei farlo:

item = Model()
screen = View()
brain = Controller(item, screen)

o questo..

brain = Controller()
item = Model(brain)
screen = View(brain)

o questo..

class Controller():
    def __init__(self):
        item = Model(self)
        screen = View(self)

o qualcos'altro interamente?

Risposte:


18

Per me, la prima opzione ha senso. Il compito del controller è di coordinare tra la vista e il modello. Da quel punto di vista, ha senso che il controller sia quello che controlla i riferimenti alla vista e al modello.

Non puoi davvero avere un controller senza un modello e una vista, tuttavia ha molto più senso avere semplicemente una vista o semplicemente un modello (ad esempio, nel test di unità). Ecco perché vuoi passare quelle dipendenze nel controller e non le altre due.


9

I Modele Viewsono indipendenti l'uno dall'altro.

Non pensare a Controllercome il cervello della struttura MVC. Pensalo come il dispatcher che gestisce le richieste dal browser e le invia al Model. Prende quindi i dati dal Modele li impacchetta in un modello amichevole, e poi li invia a View.

Il Modelè il cervello della struttura MVC, e questo è dove si dovrebbe mettere le regole aziendali. Le regole aziendali sono comuni a più controller . Pertanto, un controller di documenti e un controller di report possono entrambi utilizzare un modello utente per vedere chi ha accesso a tali elementi. Non vorrai ripetere quelle regole in entrambi i controller.

L' Viewdovrebbe utilizzare un modello HTML per presentare i dati in modo specifico non datasource. Non dovrebbe essere strettamente legato allo schema del database. Per mostrare il titolo di un documento avresti la vista in uscita il contenuto di una variabile modello chiamata document_title, e solo il Controllersa come è stata impostata quella variabile e solo il Modelperché il documento ha quel titolo.


1
Mi piace la tua risposta mentre si gelifica con la mia comprensione generale di MVC. Tuttavia, non affronta una parte importante della domanda, in particolare quali parti della Triade contengono riferimenti agli altri? La confusione che penso deriva dal fatto che ciò che descrivi, è che le viste sono "modelli stupidi con buchi" (cioè non contengono alcun riferimento al controller, ma il controller conosce le viste e inserisce i dati del modello in essi). Allo stesso tempo, un'altra cosa comune che continuo a vedere è che Views dovrebbe inviare azioni dell'utente al controller. In che modo Views poteva farlo senza avere un riferimento a C?
alnafie,

@alnafie Hai semplificato il framework MVC in sole 3 classi. Dai un'occhiata ai framework open source MVC esistenti e scoprirai che c'è molto di più necessario per farlo funzionare. Ci deve essere qualcosa di più alto che gestisce tutti i pezzi per il framework. Qualcosa che chiama i controller e qualcosa che gestisce l'instradamento verso le azioni nelle viste.
Reactgular,

3

MVC è stato originariamente definito per facilitare la programmazione delle applicazioni desktop. La vista si è iscritta agli eventi del modello, aggiornando la presentazione quando il modello è cambiato. Il controller ha semplicemente tradotto gli eventi dell'interfaccia utente (ad es. Premendo un pulsante) in chiamate al modello. Quindi il controller e la vista dipendevano dal modello, ma erano indipendenti l'uno dall'altro. Il modello era indipendente da entrambi. Ciò ha consentito a più viste e controller di funzionare sullo stesso modello.

L'architettura "MVC" utilizzata per le applicazioni web 1.0 (aggiornamento di pagina intera, no AJAX) è leggermente diversa. Una richiesta Web viene inviata a un controller. Il controller modifica in qualche modo lo stato del modello, quindi invia uno o più modelli per il rendering da una vista. Il controller e la vista dipendono entrambi dal modello, ma anche il controller dipende dalla vista.

Con le applicazioni web 2.0, stiamo tornando alla classica architettura MVC, sul lato client . Il modello, la vista e il controller risiedono tutti sul lato client come oggetti Javascript. Il controller traduce gli eventi dell'utente in azioni modello. Le azioni del modello possono o meno comportare una richiesta AJAX al server. Ancora una volta, la vista si abbona agli eventi del modello e aggiorna la presentazione di conseguenza.


+1 buona risposta. Riesco a comprendere i callback dei modelli per le applicazioni desktop nel senso classico. Mi ricorda il vecchio MFC di Microsoft.
Reactgular

2

La vista dovrebbe iscriversi alle modifiche nel modello. Vi è latitudine nella ricchezza degli abbonamenti in quanto possono essere dettagliati (mostrami le variazioni di inventario per questo particolare articolo) o generici (il modello è cambiato); la vista potrebbe interrogare il modello in risposta alla notifica di modifica. La vista presenta il set desiderato di elementi del modello sullo schermo, aggiornando lo schermo come quando si gestiscono le notifiche di modifica.

Il controller dovrebbe inviare le modifiche al modello, a seguito della direzione dell'utente (ad es. Tastiera in put, comandi mouse e menu).

Il modello mantiene il modello e un elenco di abbonamenti e deve comunicare le visualizzazioni delle modifiche applicabili tramite i loro abbonamenti.

È inoltre necessario un meccanismo per creare nuove viste e controller (poiché in MVC dovresti essere in grado di avere due o più viste dello stesso modello (potrebbero essere la stessa vista (punto) o viste diverse (punti). Logicamente, possiamo considerare che il controller deve eseguire o avere accesso a una fabbrica di view & controller (coppia), che può far parte del controller o di un altro componente.


-1 Modelsnon avvisare Views. Controllersinterrogare il Modelper modifiche e quindi rendono Viewspresentare tali modifiche.
Reactgular

4
@MathewFoscarini in MVC, il View sottoscrive le modifiche al Modello. Vedi, ad esempio, wiki.squeak.org/squeak/598 .

Penso che non stiamo parlando di differenze in un framework MVC esistente. Zend MVC, C # .NET e CakePHP non collegano un modello alla vista. Una vista in questi framework è indipendente. Non so con quale MVC hai lavorato, ma lo definirei non tradizionale.
Reactgular,

6
@MathewFoscarini: quelli sono tutti framework web e anche se si definiscono "MVC", non seguono la classica architettura MVC.
Kevin Cline,

2
Non sono sicuro che qualsiasi MVC sia più "tradizionale" di Smalltalk MVC, essendo il primo in cui è stato descritto lo schema.

1

MVC è più simile a un modello di modularità. Il suo scopo è che ogni volta che si desidera modificare il layout dell'interfaccia utente (vista), non è necessario modificare la logica dell'applicazione (controller) o l'elaborazione interna dei dati (modello).

Per raggiungere questo obiettivo, lo schema consiste nell'isolare la logica di implementazione di ciascun componente MVC. Tuttavia, è perfettamente normale che i componenti conoscano le interfacce degli altri .

Quello che ho visto spesso è che il controllore crea o chiama il modello e la vista (quindi conosce la loro interfaccia) e il modello o la vista può avvisare il controllore in cambio (più come un callback o un modello di osservatore). La parte importante è che il controllore non è a conoscenza della struttura del layout.

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.