Una vista e un modello dovrebbero comunicare o meno?

31

Secondo la pagina di Wikipedia per l'architettura MVC , la la vista è libera di essere notificata dal modello ed è anche libera di interrogare il modello sul suo stato attuale. Tuttavia, secondo corso di Paul Hegarty su iOS 5 a Stanford , lezione 1, pagina 18 tutte le interazioni devono passare attraverso il controller, con Model e View che non dovrebbero mai conoscersi. Non mi è chiaro se la dichiarazione di Hegarty debba essere intesa come una semplificazione del corso, ma sono tentato di dire che intende il progetto in quanto tale.

Come spieghi questi due punti di vista opposti?

    
posta Stefano Borini 16.02.2012 - 17:27
fonte

10 risposte

25

Questo è un argomento controverso in MVC / MVVM. Alcuni dicono che è OK per la Vista accedere direttamente ai Modelli, altri dicono che dovresti avvolgere i Modelli in ViewModels per astrarli dalla Vista. Personalmente non sono un fan di nessuno dei due approcci.

Uno degli obiettivi principali di MVC / MVVM è quello di disaccoppiare l'interfaccia utente, la logica aziendale e i dati. Quindi, tenendo presente questo concetto, consentire alla Vista di accedere direttamente ai Modelli crea una dipendenza che potresti non voler avere. D'altra parte, il wrapping dei Models in ViewModels è spesso noioso e non molto utile in quanto i ViewModels tendono ad agire semplicemente come un pass-through ai Models.

Mi piace l'approccio con cui i tuoi modelli implementano un'interfaccia particolare, chiamiamolo IModel. La classe ViewModel può quindi offrire istanze di oggetti che implementano IModel per l'utilizzo di Visualizzazione. The View semplicemente sa che funziona con oggetti IModel che ottiene dal ViewModel. Rimuove il codice wrapper ViewModel estraneo e nasconde l'implementazione concreta di IModel dalla vista. In seguito è possibile scambiare un'implementazione di IModel con un'altra senza influire sulla vista di un bit.

    
risposta data 16.02.2012 - 17:57
fonte
12

Sul Web, tutti chiamano il loro MVC di disaccoppiamento.

Alcune tecnologie, come C #, usano MVVM perché non c'è alcun collegamento tra la vista e nessun altro, tutto passa attraverso il localizzatore di servizi, vincola le variabili.

Sul puro MVC, la vista parla direttamente con il modello e viceversa. Il Controller è presente solo quando si verifica un cambiamento.

E poi, c'è quello chiamato PAC (Presentation Abstraction Control). In questa architettura, la vista e il modello non parlano tra loro. Il Controller è l'unico autorizzato a fare qualsiasi cosa con la Vista o il Modello. Le persone spesso confondono questo con MVC.

Vedrai una spiegazione migliore qui: link

    
risposta data 22.02.2012 - 14:48
fonte
7

Per me, l'obiettivo principale di un'architettura è di non impedire futuri tentativi di refactoring. In genere, le viste interagiscono direttamente con i modelli jives con questo requisito ed è relativamente chiaro quando non lo fa.

Quando una vista diventa troppo intima con un modello, un ViewModel può essere una cosa bellissima, ma di solito è il mio caso che le istanze in cui è richiesto siano in minoranza.

    
risposta data 22.02.2012 - 14:00
fonte
6

In MVC , Paul Hegarty ha torto. Il controller riguarda gli eventi utente, non le comunicazioni modello-vista. Nella classica MVC , la vista osserva (s) il modello (modello Observer).

Con l'intermediario che sta facendo la mediazione, lo schema dovrebbe essere chiamato MVP , e in effetti, la maggior parte di ciò che è presentato oggi come MVC, è in effetti più vicino a MVP.

Poi c'è MVVM che è qualcosa di simile ad entrambi, eppure un po 'diverso, ed esisteva molto tempo fa ... è meglio vederlo come due MVC / MVP legati insieme tramite viewmodel oggetto - il MVC "client" ha viewmodel come modello e MVC "server" ha come view view view view.

    
risposta data 27.10.2012 - 15:48
fonte
4

Dato che stai chiedendo del materiale in quelle conferenze di Stanford in particolare, vale la pena considerare due cose sulla posizione di Hegarty:

  1. Come hai detto, sta insegnando un corso di Computer Sci di livello L00. Ci sono molti posti nelle sue lezioni in cui lui semplifica, glissa sui dettagli, o dice "fallo in questo modo", come probabilmente si deve quando si insegnano le basi, cioè devi padroneggiare le regole prima di poterle infrangere. / li>
  2. La mia esperienza con l'SDK di iOS è che, dove non impone una rigorosa separazione tra View e Model, è strongmente orientata verso quel modello. Quando scrivi app iOS in particolare, aderire alla separazione della vista modello ti aiuta a scrivere codice in linea con le aspettative del framework. Esiterei a generalizzare le dichiarazioni di Hegarty sullo sviluppo su altre piattaforme o in generale.
risposta data 22.02.2012 - 18:52
fonte
1

Sono d'accordo con Paul Hegarty e credo che la Visione non debba conoscere il Modello. Non è così difficile da ottenere, ma apporta ulteriori vantaggi al design e alla flessibilità futura.

Nelle piccole applicazioni (di solito desktop) dove vorrei evitare classi "fittizie" di ViewModel e mantenere le cose semplici, uso anche l'interfaccia di IModel (vedi la risposta sopra) e fare attenzione che Model non abbia idea della View (usa gli abbonati come nel classico MVC).

Anche in questo caso il Controller è stato girato per essere abbastanza abbinato alla Vista e per semplicità non sempre li separo in modo chiaro.

Il secondo approccio "semplificato" è OK quando potresti avere diverse viste per lo stesso modello, ma non lo consiglierei se desideri utilizzare la stessa vista per modelli diversi. Sotto diverso intendo davvero diversi per natura e non solo classi di test JUnit che "seguono" il modello principale.

    
risposta data 22.02.2012 - 08:05
fonte
1

Credo che non ci sia una regola dura e veloce per questo, dipende totalmente dalle tue esigenze.

Troverai persone con credenze diverse. Le architetture sono concetti per aiutare a progettare soluzioni migliori.

Oltre alla comunicazione vista modello, c'è una contraddizione in più sulla logica di business in MVC. Molte persone credono che tutta la logica aziendale dovrebbe essere un modello (si veda questa domanda SO ), d'altra parte il link condiviso da Florian (nella sua risposta) dice che la logica di business dovrebbe essere sul controller.

Oltre a questo c'è la possibilità di dividere la logica di business in logica di applicazione (metterlo sul controller) e login di dominio (metterlo sul modello).

Quindi, la morale della storia è MVC significa che modello, vista e controllore dovrebbero essere separati. Oltre a questo, qualunque cosa ti si addice meglio.

    
risposta data 27.10.2012 - 12:30
fonte
0

Uso DTO per la comunicazione vista modello.

Ad esempio:

  • L'utente riempie il modulo di aggiornamento (vista)
  • L'utente invia il modulo
  • Il controllore associa i dati del modulo a UserUpdateDTO
    • DTO e UserModel sono POJO ma DTO non ha ID e nome utente perché non possiamo aggiornare il nome utente.
    • Un'altra differenza è La classe del modello ha relazioni e associazioni ma negozi DTO solo dati e potremmo aggiungere i validatori JSR 303 ad esso
  • I controllori lo dicono sul livello di servizio per salvare
  • Il livello di servizio dice al livello DAO di conservare i dati
risposta data 27.10.2012 - 18:28
fonte
-1

Sono con il campo che dice che la vista non dovrebbe mai comunicare con il modello. Il controllore deve essere sempre il tipo più adatto a tutto, quindi decide cosa fare (convalidare, richiedere dati dal modello, ecc.)

Tendo a vederlo più come un problema organizzativo che altro.

    
risposta data 27.10.2012 - 15:37
fonte
-1

Come molti sono suggeriti su perché e come view & il modello dovrebbe interagire liberamente in contesti diversi, ma il motivo principale in iOS per fare Controller è il mediatore tra di loro è quello di evitare Model & Visualizza le dipendenze nel tuo codice base e permettendoci di riutilizzare il modello o la visualizzazione in base alle esigenze con l'evoluzione di iOS.

Poiché potrebbe essere necessario mantenere gli aggiornamenti delle nostre app in UI / UX o Model o alcune volte entrambe, non dovrebbe produrre codice di dipendenza dalla modalità tra il modello e l'amp; view.Se vuoi cambiare il livello di presentazione della tua app, devi solo modificarlo, quindi puoi ancora riutilizzare lo stesso modello e viceversa.

Anche se sono d'accordo che MVC in iOS produce ViewControllers giganti con un sacco di varie logiche e gestisce ogni tipo di materiale diverso da quello a cui è destinato. Quindi è meglio andare con MVVM o Presentation Control per rendere il codice più flessibile, facile da leggere e manutenibile con ViewController più piccoli.

Questo potrebbe aiutare chi è alla ricerca di ViewController più piccoli in iOS:

link

    
risposta data 13.04.2016 - 08:56
fonte

Leggi altre domande sui tag