Model-View-Controller: l'utente interagisce con la vista o con il controller? [chiuso]


14

Di recente ho imparato a conoscere il modello di progettazione MVC. Sto imparando dal libro Head First Design Pattern.

Secondo questo libro (se ho capito bene):

Il modello è la maggior parte della logica e dei dati dell'applicazione.

La vista è sostanzialmente la GUI che rappresenta visivamente il modello per l'utente.

Il Titolare ha il compito di "mediare" e di agire da "intermediario" tra la Vista e il Modello. La vista riporta al controller che l'utente ha effettuato un'azione e il controller la traduce in chiamate di metodo sul modello.

Tuttavia, molti posti sul web contraddicono ciò che ho capito da quel libro. Sostengono che generalmente l'utente interagisce con il controller, non con la vista.

Qual è vero o più comune? L'utente interagisce direttamente con il controller o direttamente con la vista? Entrambi gli approcci sono accettabili? Qual è più comune?


4
Questa domanda non ha una risposta significativa nel modo in cui l'hai scritta. Dacci un esempio di uno dei luoghi sul web che contraddice il libro e proveremo a spiegarlo. Sii specifico con il tuo esempio.
Robert Harvey,

1
2 risposte, entrambe votate, una dice "interagisci con la vista" l'altra dice "interagisci con il controller" .... mi fa pensare che MVC non sia un'architettura abbastanza buona se è così confusa a un livello così fondamentale!
gbjbaanb,


Fai clic sui controlli dell'applicazione o sulle query del database? L'interazione avviene direttamente con l'interfaccia utente, che a sua volta è una vista. La vista di solito richiama richieste al server (nel caso di app Web) o chiama gli hook registrati su di essi (nel caso di app client). Inoltre, l'intero MVC è solo una schifezza.
luke1985,

@spectre Non è utile chiudere MVC senza fornire una spiegazione e, idealmente, un'alternativa. In caso contrario, il licenziamento non contribuisce a nulla e avrebbe dovuto essere lasciato fuori dal tuo commento. Inoltre, anche con quello, sarebbe ancora fuori tema.
underscore_d

Risposte:


18

L'utente interagisce con la vista , ma la vista deve comunicare le azioni al controller . Il controller può aggiornare il modello , ma non è necessario per ogni / qualsiasi modifica.

La descrizione che sto fornendo si basa sulla mia esperienza personale con l'implementazione .NET di MVC. L'implementazione può essere diversa.

Il controller è il luogo in cui vengono elaborate le azioni, sostanzialmente un livello aziendale. Un semplice controller non farà altro che ottenere i dati dal Modello per alimentare la Vista. Un controller complicato eseguirà tutti i tipi di azioni, fino alla gestione della sicurezza, autenticazione, autorizzazione, registrazione e forse molte altre cose.

La vista dovrebbe essere responsabile solo per la visualizzazione delle informazioni in un modo che l'utente possa capire. Possono esserci degli incroci qui sia con il Controller che con il Modello poiché cose come Single Page Applications (SPA) avranno un feedback di convalida dei dati per l'utente. Qualsiasi altro incrocio è fortemente disapprovato.

Il modello tratta i dati. Ciò include la convalida dei dati (ove applicabile). Anche l'archiviazione e il recupero dei dati sono gestiti in questo livello.


AGGIORNARE

Sembra esserci un po 'di confusione intorno a chi fa cosa quando. Ho incluso due diverse panoramiche delle architetture MVC perché sono simili, ma non uguali. C'è spazio per entrambe le interpretazioni. Forse, molti altri. Le descrizioni sopra sono la mia interpretazione di MVC da più fonti, inclusa la mia esperienza nella costruzione di applicazioni usando questa metodologia. Speriamo che questo aggiornamento aiuti a chiarire un po 'di questa confusione.

MVC è un tentativo di creare un modello di progettazione di Separazione delle preoccupazioni per lo sviluppo del software. È stato principalmente implementato in applicazioni basate sul web (per quanto ne so).

La vista gestisce tutte le interazioni dell'utente. Se l'utente fa clic su un pulsante, la vista determina se il clic è un'interazione dell'interfaccia utente o qualcosa che è al di fuori della sua preoccupazione (un'interazione del controller). Se il pulsante fa qualcosa come copiare i valori da un campo all'altro, l'implementazione determinerà se si tratta di un problema di visualizzazione o di un controller. Molto probabilmente avrai questa confusione di preoccupazioni solo quando hai a che fare con un'applicazione a pagina singola (SPA).

Il controller è dove vengono elaborate le tue azioni. La vista ha comunicato all'utente che ha deciso di modificare i valori per alcuni campi. Il Titolare può eseguire la convalida su tali dati o può essere gestito dal Modello. Anche in questo caso dipende dall'implementazione. Se il controller ha funzionalità di sicurezza, è possibile che l'utente non disponga di privilegi sufficienti per eseguire l'azione. Rifiuterebbe le modifiche e aggiornerebbe la vista di conseguenza. Il controller determina inoltre quali dati recuperare dal modello, come impacchettarli e aggiornare la vista con tali dati.

Il modello determina come e dove archiviare i dati. Può anche eseguire la convalida di tali dati prima di memorizzarli (dovrebbe farlo perché le persone bypassano la vista in determinate occasioni).


Wikipedia ha un articolo su MVC .

  • Un modello notifica le viste / viste e i controller associati quando si è verificato un cambiamento nel suo stato. Questa notifica consente alle viste di aggiornare la loro presentazione e i controller di modificare il set di comandi disponibile. In alcuni casi un'implementazione MVC potrebbe invece essere "passiva", pertanto altri componenti devono eseguire il polling del modello per gli aggiornamenti piuttosto che ricevere una notifica.
  • Il controller comunica una vista a tutte le informazioni necessarie per generare all'utente una rappresentazione di output. Può anche fornire meccanismi generici per informare il controller dell'input dell'utente.
  • Un controller può inviare comandi al modello per aggiornare lo stato del modello (ad esempio, modificando un documento). Può anche inviare comandi alla vista associata per modificare la presentazione della vista del modello (ad esempio, scorrendo un documento).

Dalla panoramica di Microsoft su MVC .

  • Modelli. Gli oggetti modello sono le parti dell'applicazione che implementano la logica per il dominio dei dati dell'applicazione. Spesso, gli oggetti modello recuperano e memorizzano lo stato del modello in un database. Ad esempio, un oggetto Prodotto potrebbe recuperare informazioni da un database, operare su di esso e quindi riscrivere le informazioni aggiornate in una tabella Prodotti in un database SQL Server.

    Nelle piccole applicazioni, il modello è spesso una separazione concettuale anziché fisica. Ad esempio, se l'applicazione legge solo un set di dati e lo invia alla vista, l'applicazione non ha un livello di modello fisico e classi associate. In tal caso, il set di dati assume il ruolo di un oggetto modello.

  • Visualizzazioni. Le viste sono i componenti che visualizzano l'interfaccia utente (UI) dell'applicazione. In genere, questa interfaccia utente viene creata dai dati del modello. Un esempio potrebbe essere una vista di modifica di una tabella Prodotti che visualizza caselle di testo, elenchi a discesa e caselle di controllo basate sullo stato corrente di un oggetto Prodotto.

  • Controller. I controller sono i componenti che gestiscono l'interazione dell'utente, lavorano con il modello e alla fine selezionano una vista da visualizzare che mostra l'interfaccia utente. In un'applicazione MVC, la vista mostra solo informazioni; il controller gestisce e risponde all'input e all'interazione dell'utente. Ad esempio, il controller gestisce i valori della stringa di query e passa questi valori al modello, che a sua volta potrebbe utilizzare questi valori per interrogare il database.


Cosa succede se non hai la GUI per tutte le azioni? Cosa succede se hai implementato solo API per alcune parti specifiche? Ciò significa che l'utente a volte interagisce con la vista e talvolta direttamente con il controller?
Mahdi,

1
Dal mio punto di vista, no. L'API prende il posto della vista.
Adam Zuckerman,

ma l'API potrebbe essere un semplice url-routes, collocato in Controller. Voglio dire nessuna vista a tutti ...
Mahdi

1
@AdamZuckerman Grazie per aver risposto. Nel prossimo commento descriverò come penso che funzioni un'implementazione MVC comune, per favore conferma se è corretta o meno. Grazie
Aviv Cohn,

2
@Mahdi Un'API, per definizione, esiste come interfaccia di programmazione , non come interfaccia utente . I programmi interagiscono con l'API, gli utenti interagiscono con la vista.
Eric King,

4

L'utente interagisce con il controller . Dal punto di vista tecnico non stai interagendo con la vista , la stai semplicemente usando per interagire con il controller .

A prima vista sembra che l'utente stia interagendo con la GUI - anche per un non programmatore questo ha più senso, tuttavia facendo clic su un pulsante si sta sostanzialmente parlando con il Controller e non con la Vista .

Inoltre, non tutte le applicazioni, anche le applicazioni Web MVC, dispongono di una GUI. È possibile interagire con il controller tramite un'API, url-routesad esempio semplicemente posizionata nel controller stesso.

Il controller dovrebbe essere il luogo che riceve e gestisce le richieste dell'utente. Quindi, se in qualche modo accedi al Modello direttamente da View , non importa come, non è più MVC .


2
+1 Questo è corretto. Cose come menu e barre degli strumenti fanno parte della GUI ma non fanno parte della vista e vanno direttamente al controller. Tasti premuti allo stesso modo.
david.pfx,

1
La ragione per cui le opinioni esistono come astrazione è che possiamo sostituirle facilmente quando necessario. Un controller per un'app su varie piattaforme può essere lo stesso, ma le viste devono riconoscere i gesti degli utenti in modo diverso e tradurli in operazioni del controller. Non sono pertanto d'accordo sul fatto che gli utenti interagiscano direttamente con i controller.
Fuhrmanator,

1
@Mahdi Direi che in quel caso, non c'è alcuna interazione dell'utente, è la vista che comunica con il controller a livello di codice. Le uniche interazioni avviate dall'utente sono tramite la vista.
Eric King,

1
@ david.pfx I tasti non possono passare direttamente da una finestra del browser a un controller.
Adam Zuckerman,

1
@Izkata "La vista è la parte del codice a cui vengono inviate le richieste" - Mi dispiace ma questa è la cosa peggiore che ho sentito qui. Com'è possibile? Puoi eseguirne il backup fornendo un riferimento in un articolo o in un libro?
Mahdi,

1

Facciamo un esempio concreto del perché gli utenti interagiscono direttamente con le visualizzazioni e non con i controller.

Nell'app musicale sull'iPhone, una funzione di alto livello è quella di riprodurre una playlist. "Riproduci una playlist" è una funzione di un controller per l'app.

Esiste più di un modo per attivare quella funzione. Posso fare clic sulla playlist all'interno dell'app, oppure posso chiedere a Siri (interfaccia vocale) di svolgere la stessa funzione. Sono due diversi gesti che vengono riconosciuti dalle varie opinioni.

Anche il feedback in ciascuna vista è diverso. Siri ti dirà che sta suonando la musica che hai richiesto. L'app musicale ti mostrerà un feedback visivo che sta riproducendo la playlist.

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.