У минулому я використовував MVP і MVC, і я віддаю перевагу MVP, оскільки він набагато краще контролює потік виконання.
Я створив свою інфраструктуру (класи сховища / сховища) і без проблем використовую їх при жорсткому кодуванні зразкових даних, тому зараз я переходжу на графічний інтерфейс і готую свій MVP.
Розділ А
Я бачив MVP, використовуючи подання як точку входу, тобто в методі конструктора подань він створює презентатор, який, у свою чергу, створює модель, з'єднуючи події за потребою.
Я також бачив презентатора як точку входу, де створюється подання, модель і презентатор, потім цьому презентатору надається перегляд і модельний об'єкт у своєму конструкторі для передачі подій.
Як і в 2, але модель не передається ведучому. Натомість модель - це статичний клас, де викликуються методи і відповіді повертаються безпосередньо.
Розділ В
З точки зору збереження подання та моделі в синхронізації я бачив.
Щоразу, коли значення в представленні змінюється, тобто
TextChanged
подія в .Net / C #. Це запускає а,DataChangedEvent
що передається в модель, щоб постійно тримати її синхронізованою. І коли модель змінюється, тобто фонова подія, яку вона слухає, то подання оновлюється за допомогою тієї самої ідеї підняття аDataChangedEvent
. Коли користувач хоче здійснити зміни,SaveEvent
він запускається, переходячи в модель, щоб зробити збереження. У цьому випадку модель імітує дані подання та обробляє дії.Подібно до # b1, проте представлення не синхронізується з моделлю весь час. Натомість, коли користувач хоче внести зміни,
SaveEvent
його звільняють, а ведучий захоплює останні деталі та передає їх у модель. в цьому випадку модель не знає про дані переглядів, поки не буде потрібно діяти на них, і в цьому випадку передаються всі необхідні деталі.
Розділ С
Відображення бізнес-об'єктів у поданні, тобто об'єкт (MyClass), не примітивні дані (int, double)
У поданні є поля властивостей для всіх його даних, які відображатимуться як об’єкти домену / бізнесу. Наприклад,
view.Animals
виставляєIEnumerable<IAnimal>
властивість, навіть якщо представлення переробляє їх у "Вузли" в TreeView. Тоді для вибраної тварини це було б викритоSelectedAnimal
якIAnimal
властивість.У представленнях немає знань про об'єкти домену, він відкриває властивість лише для типів об'єктів, що включають примітивні рамки (.Net / Java). У цьому випадку презентатор передасть адаптерному об'єкту доменний об'єкт, потім адаптер переведе даний бізнес-об'єкт у елементи управління, видимі на зображенні. У цьому випадку адаптер повинен мати доступ до фактичних елементів керування на зображенні, а не до будь-якого виду, тому він стає більш щільно з'єднаним.
Розділ D
Кілька представлень, використовуваних для створення єдиного елемента керування. тобто у вас складний вигляд із простою моделлю, як збереження об'єктів різних типів. У вас може бути система меню поруч із кожним клацанням на пункт, показані відповідні елементи керування.
Ви створюєте величезний вигляд, який містить усі окремі елементи керування, які відкриваються через інтерфейс перегляду.
У вас кілька переглядів. У вас є один вид меню та пуста панель. Цей подання створює інші необхідні представлення даних, але не відображає їх (видимі = хибні); цей погляд також реалізує інтерфейс для кожного перегляду, який він містить (тобто дочірні подання), щоб він міг виставляти одного ведучого. Порожню панель заповнено іншими видами (
Controls.Add(myview)
) та ((myview.visible = true
). Події, підняті в цих "дочірніх" оглядах, обробляються батьківським видом, який, в свою чергу, передає подію ведучому, і навпаки для подачі подій назад до дочірніх елементів.Кожен погляд, будь то основний батьківський або менший дочірній погляд, кожен з них має провідний власний ведучий та модель. Ви можете буквально просто перенести елемент управління переглядом у існуючу форму, і він буде готовий до функціональності, просто потрібно підключення до ведучого за кадром.
Розділ Е
Якщо все має інтерфейс, то тепер, виходячи з того, як зроблено MVP у наведених вище прикладах, це вплине на цю відповідь, оскільки вони можуть бути не сумісними.
Все має інтерфейс, вид, презентатор та модель. Кожен із них тоді, очевидно, має конкретну реалізацію. Навіть якщо у вас є лише один конкретний вид, модель та ведучий.
У View і Model є інтерфейс. Це дозволяє відрізнятися поглядам та моделям. Ведучий створює / надає об'єкти перегляду та моделювання, і він просто служить для передачі повідомлень між ними.
Тільки Перегляд має інтерфейс. Модель має статичні методи і не створюється, тому немає необхідності в інтерфейсі. Якщо вам потрібна інша модель, ведучий називає інший набір методів статичного класу. Будучи статичною, Модель не має посилання на презентатора.
Особисті думки
З усіх різних варіацій, які я представив (більшість я, мабуть, використовував у якійсь формі), яких я впевнений, що їх більше. Я вважаю за краще A3 підтримувати багаторазову використання бізнес-логіки за межами MVP, B2 для меншої кількості дублювання даних та зменшення подій. C1 для не додавання до іншого класу, переконайтеся, що він додає невелику кількість логіки, що не перевіряється одиницею, у вигляд (як візуалізується об’єкт домену), але це може бути переглянуто код або просто переглянуто в додатку. Якби логіка була складною, я погодився б на клас адаптерів, але не у всіх випадках. Для розділу D я вважаю, що D1 створює занадто великий вид для прикладу меню. Я раніше використовував D2 і D3. Проблема з D2 полягає в тому, що вам доводиться писати багато коду для маршрутизації подій до та від ведучого до правильного дочірнього подання, а його сумісність не перетягування / падіння, кожен новий елемент управління потребує більше проводки для підтримки єдиного ведучого. D3 - це мій переважний вибір, але він додає ще більшу кількість класів у якості ведучих та моделей для вирішення погляду, навіть якщо подання виглядає дуже простим або не потребує повторного використання. Я думаю, що суміш D2 і D3 найкраще грунтується на обставинах. Що стосується розділу E, я думаю, що все, що має інтерфейс, може бути надмірним, я вже це роблю для об’єктів домену / бізнесу і часто не бачу переваги в "дизайні", роблячи це, але це допомагає в глузуванні з об'єктів у тестах. Особисто я бачив би Е2 як класичне рішення, хоча бачив Е3, який використовувався у двох проектах, над якими я працював раніше. Я думаю, що суміш D2 і D3 найкраще грунтується на обставинах. Що стосується розділу E, я думаю, що все, що має інтерфейс, може бути надмірним, я вже це роблю для об’єктів домену / бізнесу і часто не бачу переваги в "дизайні", роблячи це, але це допомагає в глузуванні з об'єктів у тестах. Особисто я бачив би Е2 як класичне рішення, хоча бачив Е3, який використовувався у двох проектах, над якими я працював раніше. Я думаю, що суміш D2 і D3 найкраще грунтується на обставинах. Що стосується розділу E, я думаю, що все, що має інтерфейс, може бути надмірним, я вже це роблю для об’єктів домену / бізнесу і часто не бачу переваги в "дизайні", роблячи це, але це допомагає в глузуванні з об'єктів у тестах. Особисто я бачив би Е2 як класичне рішення, хоча бачив Е3, який використовувався у двох проектах, над якими я працював раніше.
Питання
Чи правильно я реалізую MVP? Чи є правильний шлях про це?
Я читав твір Мартіна Фаулера, який має різні варіанти, і пам’ятаю, коли я вперше почав робити MVC, я зрозумів цю концепцію, але не міг спочатку розібратися, де точка входу, все має свою функцію, але що контролює і створює оригінал набір об’єктів MVC.