MVP: презентатор-модель связи
-
30-09-2019 - |
Вопрос
У меня есть проектный вопрос об общении между моделью и ведущим в шаблоне дизайна 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. Не смешивайте.