comunicazione Presenter-Modello: MVP
-
30-09-2019 - |
Domanda
Ho una domanda circa la progettazione della comunicazione tra il modello e il presentatore nel modello di progettazione MVP -. O più precisamente la sua forma derivata della vista passiva
Supponiamo che il seguente GUI semplice come esempio: Ho una finestra in cui mio punto di vista è una lista e non v'è la possibilità di aprire una finestra di dialogo per selezionare un file. Una volta che ho finito la mia selezione del file deve essere aggiunto alla lista.
Il mio modello sarà la raccolta di tutti i file che ho aperti.
Un'implementazione straight-forward tratta di (pseudo codice python) mente:
Soluzione A
class Model():
def add(filename):
# add file
...
# return True if successful
return True
class Presenter():
# event from GUI
def onFileOpen():
filename = FileSelectorStuff()
isFileAdded = model.add(filename)
if isFileAdded:
view.insertItem(filename)
In questo caso so che il file è stato aggiunto al modello e quindi posso aggiornare la vista di conseguenza.
D'altra parte ho potuto aggiungere il file al modello, e quindi attendere che il modello di notificare me che è è cambiato e che il presentatore ha per aggiornare la vista, in questo modo:
Soluzione B
class Model():
def add(filename):
# add file
...
# alert controller
modelChanged(Type.FileAdded, filename)
class Presenter():
# event from GUI
def onFileOpen():
filename = FileSelectorStuff()
model.add(filename)
# event from model
def onModelChanged(type, filename):
if type == Type.FileAdded:
view.insertItem(filename)
elif type == Type.FileRemoved:
...
Ora, in questo caso entrambe le implementazioni funzionano bene. Ma supponiamo che il modello controlla anche i file e deve dire il presentatore quando uno di loro è stato cancellato, per esempio. Poi ho bisogno di questo tipo di onModelChanged () meccanismo di richiamata in ogni caso.
La mia domanda ora è: dovrebbe mescolo i due modi per aggiornare la vista (A per gli aggiornamenti sincroni, e B per asincrona) o meglio tenere tutto centrale in un unico luogo come proposto nella soluzione B ?
Soluzione
Il problema è probabilmente molto risolto, ma mi ha colpito da un motore di ricerca ecco la mia risposta:
Usa B. Forget miscelazione.
Se si desidera aggiungere in bit di A per l'efficienza dovrete avere due metodi per il modello: uno di restituire un valore booleano, gli altri eventi che emettono. Se il metodo Model.add sincrono emette eventi, allora il gestore di eventi nella presentatore dovrà ignorare durante tale metodo chiamata. Disordinato.
Tuttavia la mia comprensione di Passive View suggerisce che il Presenter è quello in carica di aggiornamento del Modello, così si potrebbe sostenere che dovrebbe essere quello di rimuovere i file dal modello, in ogni caso. Questo spiana la strada a una Un unica soluzione.
La mia risposta finale: Usa A, o l'uso B. non si mescolano.