MVP: Презентатор-модель общения - PullRequest
2 голосов
/ 22 августа 2010

У меня есть вопрос проектирования о связи между моделью и презентатором в шаблоне проектирования MVP - или, точнее, его производной форме пассивного представления .

Давайте предположим следующеепростой графический интерфейс в качестве примера: у меня есть окно, в котором мой вид представляет собой список, и есть возможность открыть диалоговое окно для выбора файла.Как только я закончу свой выбор, файл будет добавлен в список.

Моя модель должна быть коллекцией всех файлов, которые я открыл.

На ум приходит простая реализация (псевдо-код Python):

Решение 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)

В этом случае я знаю, что файл был добавлен в модель, и, таким образом, я соответствующим образом обновляю представление.

С другой стороны, я мог бы добавить файл в модель, а затем подождать, пока модель уведомит меня, что это изменилось, и что докладчик должен обновить представление следующим образом:

Решение 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:
            ...

Теперь в этом случае обе реализации работают просто отлично.Но давайте предположим, что модель также отслеживает файлы и должна сообщить докладчику, например, когда один из них был удален.Тогда мне все равно нужен такой механизм обратного вызова onModelChanged ().

Мой вопрос сейчас такой: Должен ли я смешать два способа обновления представления (A для синхронных обновлений и B для асинхронных) или, вернее, держите все это центральным в одном месте, как это предлагается в решении B?

1 Ответ

0 голосов
/ 10 марта 2011

Эта проблема, вероятно, давно решена, но я нашел ее в поисковой системе, поэтому вот мой ответ:

Используйте B. Забудьте о смешивании.

Если вы хотите добавить биты A для эффективности, у вас должно быть два метода для модели: один возвращает логическое значение, другой генерирующий события. Если синхронный метод Model.add генерирует события, то обработчик событий в презентаторе должен будет игнорировать их во время вызова этого метода. Грязное.

Однако мое понимание пассивного представления предполагает, что докладчик является ответственным за обновление модели, поэтому можно утверждать, что именно он должен удалять файлы из модели. Это открывает путь для единственного решения.

Мой окончательный ответ: Используйте A или B. Не смешивайте.

...