Вопрос

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

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

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

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

Решение А.

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 для Async) или, скорее, сохраняйте все это центральное в одном месте, как предложено в решении B?

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top