MVP (Supervising Controller) La vista aggiorna il modello?

9

Ho letto su MVP, in particolare Supervision Controller. Una cosa che sto avendo difficoltà a capovolgere è come la Vista interagisce con il Modello.

Ho capito che il Presenter dovrebbe aggiornare il Modello e che la Vista si legge dal Modello. Il Presenter può anche aggiornare la vista tramite un'interfaccia. L'articolo di Martin Fowler su questo sembra mostrare proprio questo ( link ).

Tuttavia, altri articoli / blog mostrano la vista che aggiorna direttamente il modello ( link ).

So che questi sono solo schemi, quindi ci saranno diverse implementazioni, ma la vista che aggiorna il modello sembra che stia facendo molto di più di quanto dovrebbe.

Per esempio, ho avuto una classe di persone che conteneva un nome e un numero di telefono. La vista può visualizzare questo nome e numero e un pulsante di invio per modificare il nome e il numero della persona. Quando si fa clic sul pulsante di invio, mi aspetto che l'aggiornamento venga gestito nel Presenter e non nella Vista. Tuttavia, l'articolo che ho fatto riferimento propone che la vista possa aggiornare direttamente il modello.

Quindi, la vista dovrebbe sempre aggiornare il modello? O dovrebbe essere gestito solo dal Presentatore?

EDIT:

Codice dell'articolo MSDN:

public class PersonalDataView : UserControl, IPersonalDataView
{
    protected TextBox _firstNameTextBox;

    public void SetPersonalData(PersonalData data)
    {
        _firstNameTextBox.Value = data.FirstName;
    }

    public void UpdatePersonalData(PersonalData data)
    {
        data.FirstName = _firstNameTextBox.Value;
    }
}
    
posta Eric S 31.03.2016 - 23:16
fonte

2 risposte

7

Ci sono diverse varianti di MVP in giro dal suo design originale nel 1996 da Mike Potel . Martin Fowler ne discute alcuni in un altro articolo sull'architettura della GUI .

Una delle differenze chiave tra le varianti è se la vista è totalmente isolato dal modello o no:

  • Nel primo caso, il presentatore è l'uomo nel mezzo di una "vista passiva" e del modello.
  • Nel secondo caso, il presentatore è un "supervisore supervisore", ma ci sono interazioni direttamente tra la vista e il modello. Il documento di Potel descrive bene il tipo di interazioni: la vista può richiedere dati dal modello e il modello può notificare la visualizzazione di alcuni eventi.

In nessuno dei casi la vista cambierebbe direttamente il modello. La modifica del modello passa sempre tramite Presenter (o controller in un MVC).

Osservazione 1: l'articolo MSDN mostra solo una freccia direttamente dalla vista al modello, nella sua introduzione sulla parte MVC (Model View Controller). La freccia è nella direzione sbagliata, ma il testo è corretto: la vista può accedere al modello e cambiare se stesso (cioè non il modello, ma ridisegnare se stesso) in seguito al cambiamento dei dati del modello.

Nota 2: l'articolo MSDN mostra anche il pattern MVVM di Microsoft, che è approssimativamente un MVP, ma il presentatore è chiamato ambiguamente "ViewModel". Ma ancora una volta, la vista in esso non aggiorna direttamente il modello.

La tua modifica:

Il codice della modifica mostra un'associazione dati bidirezionale, in cui l'aggiornamento dei dati nella vista attiverebbe direttamente un cambiamento nel modello. Questo in effetti contraddice il pattern MVP originale in cui la View informa il Presenter delle modifiche desiderate tramite un "Interactor" e il Presenter ha il monopolio di invocare "Comandi" per aggiornare il Modello.

Nota 3: Penso che l'autore di questo blog MSDN fosse più interessato all'introduzione dell'architettura MVVM che alla scrittura di un articolo approfondito completo, come fece Martin Fowler, sulle altre architetture. Penso anche che l'architettura di database ADO di Microsoft di Microsoft risalente ai primi giorni della .net framework ha favorito un design così misto e ha creato un classico MVP meno banale da implementare (richiedeva una DataObjectSource per isolare l'accesso al modello di dati).

    
risposta data 01.04.2016 - 01:05
fonte
1

Dall'articolo Presentatore supervisore di Fowler che hai collegato nella tua domanda:

Factor the UI into a view and controller where the view handles simple mapping to the underlying model and the the controller handles input response and complex view logic.

Si dice chiaramente che per tutte le attività semplici la vista può dialogare direttamente con il modello. Quindi non contraddice l'articolo MSDN. Questo è esattamente perché per la mappatura / associazione semplice delle proprietà non è necessario coinvolgere un altro livello in quanto ciò complicherebbe solo le cose senza troppi benefici.

Ancora una volta, Fowler ne parla alla fine dell'articolo:

[...] the driving issue is how much behavior to leave in the view. Passive View is a very similar pattern to Supervising Controller, but with the difference that Passive View puts all the view update behavior in the controller, including simple cases. This results in extra programming, but does mean that all the presentation behavior is testable. The choice between the two depends on what kind of Data Binding support you have and whether you're happy to leave that untested by controller tests.

Devi tenere a mente alcune cose:

  • Assicurati che il modello sia sempre il "padrone" dei suoi dati. Ciò significa che la vista non dovrebbe mai scrivere direttamente nei campi del modello (comunque una cattiva idea). Le proprietà sono ok se la tua lingua le supporta. In questo modo, il modello può ancora reagire a qualsiasi aggiornamento ai suoi dati (ad esempio calcolando un altro campo).
  • Non associare il modello alla vista. Il modello deve essere testabile in modo indipendente e in linea di principio si dovrebbe essere in grado di cambiare la vista senza influenzare il modello. Ciò significa che il modello non dovrebbe mai chiamare direttamente la vista. Usa le interfacce, o probabilmente la migliore qui, il pattern Observer. La vista può iscriversi al modello per gli aggiornamenti.
  • Non inserire mai alcuna logica (aziendale) nella vista. Se ti trovi a scrivere if statement nel codice della vista, pensa se questi dovrebbero piuttosto appartenere al presentatore o al modello.
risposta data 05.04.2016 - 09:50
fonte

Leggi altre domande sui tag