Как вы общаетесь между ведущим и представлением в схеме MVP?

В основном есть два варианта, насколько я знаю.

Во-первых, это просмотр событий уведомлений, на которые докладчик должен быть подписан. Когда пользователь нажимает на какую-либо кнопку в представлении, представление просто запускает какое-то событие, уведомляя об изменении чего-либо.

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

Как Джереми Миллер в своем легендарном В сообщениях блога "Создайте свою собственную серию CAB" говорится, что ему лучше использовать второй вариант.

Каково ваше мнение по этой теме? Как вы связываете ведущего и вид в своих проектах? Каковы преимущества или недостатки для каждого варианта?

Давайте проведем опрос здесь. Я думаю, это было бы полезно. Заранее спасибо!


Чтобы ответить на ответ Питера Ритчи.

Моя проблема в том, что по неопытности мне приходится полагаться на чье-то мнение, чтобы принять решение и выбрать тот путь, который мне кажется правильным.

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

Но с другой стороны, разве события не служат неким контрактом (как интерфейс)? Он привязывал ведущего к представлению, поскольку он должен реагировать на эти события.


person kseen    schedule 12.05.2012    source источник
comment
события являются более свободным контрактом. Вы подписываетесь на событие с делегатом; это может быть общедоступный метод, частный метод, анонимный метод и т. д. С интерфейсом он должен реализовать этот интерфейс как общедоступные методы.   -  person Peter Ritchie    schedule 12.05.2012


Ответы (1)


Наблюдатель может быть немного утомительным. Если у вас есть несколько элементов управления, которые производят события, или несколько событий, вам нужно подключать их по одному. В то время как, если вы используете интерфейс, все это находится в одном месте, и вы получаете безопасность типов и ошибки компиляции, если забываете реализовать определенный член интерфейса. Недостаток интерфейсов заключается в том, что у вас есть определенная связь. Представление связано с интерфейсом, и что-то должно реализовать этот интерфейс. вы можете использовать сегрегацию интерфейса, чтобы ограничить привязку интерфейса к одному конкретному классу; но это добавляет определенный уровень сложности.

На этот вопрос нет единственно правильного ответа; Есть ли какие-то критерии, которые вы можете предложить, чтобы помочь с вашим решением?

person Peter Ritchie    schedule 12.05.2012
comment
@Peter Ritchie, не могли бы вы пролить свет на то, как следует общаться с model на presenter, чтобы presenter мог выполнить какое-то действие с view. например, скажем, чтение базы данных выполняется в model, тогда как model должен сообщить presenter, что он прочитал данные и передать данные обратно в presenter, чтобы presenter мог обновить view - person eRaisedToX; 25.05.2017
comment
@eRaisedToX Очень важно, чтобы модель была как можно более слабо связана с ведущим (теоретически вы не можете полностью отделить что-то от того, что ее использует). Это делается с помощью типичных методов абстракции и инкапсуляции. Как я упоминал выше, один из способов — эффективно использовать инверсию зависимостей и зависеть от интерфейсов (абстракций), а не напрямую от презентатора или конкретного презентатора. Но это означает, что докладчик должен иметь экземпляр этого интерфейса, чтобы вызвать его. Другой тип абстракции заключается в посредничестве связи между... - person Peter Ritchie; 25.05.2017
comment
... модель и ведущий через какой-то прокси. Часто мы видим, что это реализовано с помощью очередей сообщений, но это не означает использование промежуточного программного обеспечения. Например, обычно UI-фреймворки взаимодействуют из представления с приложениями посредством сообщений, что является способом отделения UI-фреймворка от какого-либо конкретного действия без использования промежуточного программного обеспечения. Мне очень нравится этот тип развязки, я нахожу его очень гибким. Таким образом, модель может взаимодействовать с другими вещами, помещая сообщения в очередь (которая может быть просто экземпляром ConcurrentQueue). - person Peter Ritchie; 25.05.2017
comment
Большое спасибо за ваш ценный комментарий ..! Это действительно помогло бы. - person eRaisedToX; 26.05.2017