Question

J'ai une question de conception de la communication entre le modèle et le présentateur dans le modèle de conception de MVP -. Ou plus exactement sa forme dérivée vue passif

Supposons que l'interface graphique simple suivante comme exemple: j'ai une fenêtre où mon avis est une liste et il y a la possibilité d'ouvrir une boîte de dialogue de fichier pour sélectionner un fichier. Une fois que je l'ai terminé ma sélection le fichier doit être ajouté à la liste.

Mon modèle est la collection de tous les fichiers que je l'ai ouvert.

Une mise en œuvre straight-forward vient à l'esprit (pseudo code python):

Solution 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)

Dans ce cas, je sais que le fichier a été ajouté au modèle et donc mettre à jour la vue en conséquence.

Par contre je pourrais ajouter le fichier au modèle, puis attendez que le modèle me notifier qui est a changé et que le présentateur doit mettre à jour la vue, comme suit:

Solution 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:
            ...

Maintenant, dans ce cas, les deux implémentations fonctionnent très bien. Mais supposons que le modèle surveille également les fichiers et doit dire au présentateur quand l'un d'entre eux a été supprimé, par exemple. Alors je besoin de ce genre de onModelChanged () mécanisme de rappel de toute façon.

Ma question est maintenant: Devrais-je mélanger les deux façons de mettre à jour la vue (A pour les mises à jour synchrones et B pour async) ou plutôt garder tout le centre dans un endroit tel que proposé dans la solution B ?

Était-ce utile?

La solution

Ce problème est probablement longtemps résolu, mais je l'ai frappé d'un moteur de recherche alors voici ma réponse:

Utilisez B. mélange Oubliez.

Si vous voulez ajouter en bits de A pour l'efficacité, vous devez avoir deux méthodes pour le modèle: un retour d'un booléen, les autres événements émetteurs. Si la méthode Model.add synchrone émet des événements, le gestionnaire d'événement dans le présentateur devra les ignorer lors de cet appel de méthode. Salissante.

Cependant ma compréhension de vision passive suggère que le présentateur est celui chargé de la mise à jour du modèle, il pourrait faire valoir qu'il devrait être celui pour supprimer les fichiers du modèle, de toute façon. Cette décision ouvre la voie à une A seule solution.

Ma dernière réponse: Utilisez A, ou l'utilisation B. Ne pas mélanger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top