Come dovrebbe il modello notificare le modifiche al controller nel paradigma MVC?

0

Stavo leggendo l'architettura del codice e il paradigma MVC / MVVP. Idealmente, dovremmo avere il modello come una politica / componente di alto livello in cui non dovrebbe conoscere o dipendere direttamente da altri componenti, come la vista. In sostanza, uno dei ruoli del controller è l'invio di input al modello e quindi il componente del modello come dipendenza. Tuttavia, abbiamo bisogno che il modello abbia bisogno di comunicare con il controller ogni volta che si verificano cambiamenti di stato. Dalla mia comprensione, non dovremmo far dipendere il modello dal controller in quanto creeremmo una dipendenza bidirezionale tra i componenti, che può portare a codice non gestibile e difficoltà nell'aggiunta di modifiche. Quindi, immagino che la relazione bidirezionale comunichi come segue:

Tuttavia,secreiamoun'interfacciaperilmodellopercomunicareconilcontroller,IController,èpossibilerimuoverequestacomunicazionebidirezionale.IControllerimplementatuttiimetodichenotificanolemodifichealcontroller.Ladipendenzasaràsimileallaseguente:

Ora, il modello è all'oscuro delle effettive implementazioni del controller. Pertanto, le modifiche nel controller non dovrebbero influire sui componenti del modello. Mi chiedevo se aggiungere un'interfaccia per il controller il modo migliore per comunicare tra modello e controller.

Sono anche consapevole del fatto che in alcuni programmi, il modello può comunicare direttamente con la vista direttamente utilizzando il modello di progettazione dell'osservatore. Tuttavia, il modello non dovrebbe conoscere i dettagli di implementazione della vista poiché il modello dovrebbe essere rispettato con una politica di alto livello e non dovrebbe conoscere le politiche di basso livello, come la vista. Pertanto, in questo caso, non consideriamo il modello di osservatore per il modello per comunicare la vista.

    
posta mtber75 12.10.2017 - 02:19
fonte

2 risposte

2

Il modello che conosce o dipende dal controller o dalla vista non è normalmente un problema in MVC.

In MVC il controller e la vista dipendono dal modello. Quindi il modello non ha bisogno di alcuna dipendenza da qualsiasi cosa.

Puoi anche andare oltre e liberarti della dipendenza della vista dal modello, creando e popolando il controller. Che è standard per le applicazioni web.

Questi metodi ti danno un problema per il caso in cui il Modello si aggiorna al di fuori di un evento del Controller. Ad esempio, diciamo che il modello ha una proprietà Time che si aggiorna automaticamente all'ora del sistema ogni secondo.

In questi casi, vorrai aggiornare la vista senza avere un evento del controller. Questo può essere ottenuto con un numero di metodi

  • Chiedi al controller o alla vista di generare un evento periodico ogni secondo per aggiornare la vista. ad esempio un oggetto Timer.
  • Avere qualcosa di controllare o essere attivato dalla causa sottostante della modifica del modello e chiamare il controller. ad esempio un trigger del database.
  • Fai in modo che il Modello rilanci un evento quando si verifica l'evento e il controllore e / o la vista si collegano a questo evento. ad esempio Model.OnTimeUpdate

Ovviamente la soluzione migliore è evitare questi tipi di modifiche non causate nel tuo Modello. Di solito c'è una causa del cambiamento, ed è possibile instradare tale causa attraverso un controller, catturando così l'evento e rimuovendo o esponendo una dipendenza del Modello allo stesso tempo.

MVVM - Model View ViewModel accetta ulteriormente associando la vista agli eventi generati da ViewModel e viceversa. Questo può suggerire di aggiungere eventi extra al modello per sfruttare ulteriormente questo modello, ma tali eventi non sono affatto necessari, né richiedono alcuna dipendenza da aggiungere al modello.

    
risposta data 12.10.2017 - 11:04
fonte
1

NotifyControllerChanges() dovrebbe essere un evento a cui qualsiasi controller del tuo sistema può sottoscrivere. Sarebbe parte dell'API pubblica del tuo modello, non un dettaglio di implementazione. Il modello non sa (e non si cura) chi lo sottoscrive e quindi non ha conoscenza dell'abbonato.

Se questo ti infastidisce, considera che gli altri metodi sul modello che chiami dal controller devono ancora sapere dove ritornare, eppure li trattiamo ancora come se avessero "nessuna conoscenza di il controller. "

    
risposta data 12.10.2017 - 17:07
fonte

Leggi altre domande sui tag