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 ?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top