Как Gang of Four Design Patterns се вписват в MVC парадигмата?

От известно време обмислям Design Patterns и тъкмо започвам да виждам как всъщност мога да започна да включвам някои от тях по-съзнателно в моята развойна работа. Все още обаче съм объркан относно отношението им към MVC в началото на книгата и как се отнася към останалата част от книгата.

Повечето от рамките, с които съм работил - Spring, Yii, ASP.NET и дори Objective-C Cocoa (UIKit) - отговарят на MVC парадигмата. Получавам MVC, защото за мен това е полезен начин за класифициране на обекти и как те трябва да изпращат съобщения или да взаимодействат един с друг. Плюс това, тези рамки някак ви го налагат, дори ако не възнамерявате да мислите по MVC начин.

Чувствам също, че разбирам предпоставката на Design Patterns: те наистина не обичат подкласовете, обичат абстрактните интерфейси и се стремят към хлабаво свързване. Не мога да кажа, че все още разбирам напълно всички модели или как са полезни, но усещам.

Въпросът ми е следният: какво е взаимодействието между MVC и дизайнерските модели? Какво постигнаха в първата глава на книгата с примера за приложение на MVC? Дали някои дизайнерски модели просто не са подходящи в парадигмата на MVC? Чудя се, например, как моделът Command трябва да се вмести в MVC. Изглежда невероятно полезно, но създаваме ли CommandModel и CommandController, за да ги изпратим на други контролери? Просто създаваме Command обект, както е предписано в книгата? По принцип се чудя дали идеите на MVC и Design Patterns са напълно разединени и просто не разбирам, или има някои модели, които не се вписват в матрицата.


person tacos_tacos_tacos    schedule 02.02.2012    source източник
comment
това може да е добро четиво: stackoverflow.com/questions/3148097/mvc -and-command-pattern   -  person roman    schedule 03.02.2012
comment
Мисля, че смисълът на този първи раздел (това всъщност е глава 2) беше да покаже, че това са реални концепции, използвани в реални програми, а не просто поредната академична работа с възвишени идеи от кулата от слонова кост.   -  person tcarvin    schedule 03.02.2012


Отговори (4)


Моето лично мнение е, че MVC е опростена версия на модела на наблюдателя, който е опростена версия на шаблона на посредника.

MVC: Един модел, един изглед, контролерът управлява комуникацията между тях.

Модел на наблюдател: Един модел, множество изгледи (наблюдатели/абонати) и издателят управлява комуникацията

Модел на посредник: Няколко различни модела, няколко изгледа и посредникът управлява комуникациите между тях.

person Stephane Rolland    schedule 14.01.2013
comment
Намерих вашия дзен отговор на този въпрос и съм напълно съгласен. - person Miroslav Trninic; 07.07.2013
comment
Не мисля, че има връзка 1-1 между модел и изглед в MVC. Можете лесно да имате няколко изгледа за един и същ модел. Поне доколкото разбирам, това е едно от предимствата на използването на MVC; има няколко представяния на един и същ модел, които се актуализират едновременно с една актуализация на модела. - person Thomas Eizinger; 23.12.2017
comment
@ThomasEizinger, но в такъв случай какви разлики ще видите (ако има такива) с модела на наблюдателя? - person Stephane Rolland; 24.12.2017
comment
Този човек (peter.michaux.ca/maria) например твърди, че MVC всъщност е комбинация от три модела: наблюдател, стратегия и композиция. Нямам личен опит с Smalltalk (откъдето произлиза MVC), но мисля, че е разумно да се опише MVC като комбинация от тези три модела. - person Thomas Eizinger; 24.12.2017
comment
@ThomasEizinger Ще прочета за това, въпреки че първата ми инстинктивна реакция беше, че той греши. Не виждам модел на композиция в MVC, но ще прочета повече, за да разбера неговата гледна точка. Благодаря за информацията. - person Stephane Rolland; 24.12.2017

MVC в книгата GoF е за десктоп, той използва модела на наблюдател за актуализиране на изгледи. Примерът за команда в книгата GoF е за редактор.

Има и други разновидности на MVC, при които използването на други дизайнерски модели може да не е очевидно:
Каква е разликата между MVC и MVVM?
Контрол на абстракцията на презентацията

Книгата GoF казва:

...

Взет по номинална стойност, този пример отразява дизайн, който отделя изгледите от моделите. Но дизайнът е приложим към по-общ проблем: отделяне на обекти, така че промените в един да могат да засегнат произволен брой други, без да се изисква променения обект да знае подробности за другите. Този по-общ дизайн е описан от шаблона за проектиране Observer (страница 293).

Друга характеристика на MVC е, че изгледите могат да бъдат вложени. Например, контролен панел от бутони може да бъде реализиран като сложен изглед, съдържащ вложени изгледи на бутони. Потребителският интерфейс за обектен инспектор може да се състои от вложени изгледи, които могат да се използват повторно в програма за отстраняване на грешки. MVC поддържа вложени изгледи с класа CompositeView, подклас на View. CompositeView обектите действат точно като View обекти; съставен изглед може да се използва навсякъде, където може да се използва изглед, но също така съдържа и управлява вложени изгледи.

Отново можем да мислим за това като за дизайн, който ни позволява да третираме съставен изглед точно както третираме един от неговите компоненти. Но дизайнът е приложим за по-общ проблем, който възниква винаги, когато искаме да групираме обекти и да третираме групата като отделен обект. Този по-общ дизайн е описан от шаблона за проектиране Composite (163). Позволява ви да създадете йерархия на класове, в която някои подкласове дефинират примитивни обекти (напр. Button), а други класове дефинират съставни обекти (CompositeView), които сглобяват примитивите в по-сложни обекти.

MVC също така ви позволява да промените начина, по който даден изглед реагира на въвеждане от потребителя, без да променяте визуалното му представяне. Може да искате да промените начина, по който реагира на клавиатурата, например, или да го накарате да използва изскачащо меню вместо командни клавиши. MVC капсулира механизма за отговор в обект Controller. Има класова йерархия на контролери, което улеснява създаването на нов контролер като вариация на съществуващ.

Един изглед използва екземпляр на подклас Controller, за да приложи определена стратегия за отговор; за да приложите различна стратегия, просто заменете екземпляра с различен вид контролер. Възможно е дори да промените контролера на изгледа по време на изпълнение, за да позволите на изгледа да промени начина, по който реагира на потребителско въвеждане. Например изглед може да бъде деактивиран, така че да не приема входни данни, просто като му дадете контролер, който игнорира входни събития.

Връзката View-Controller е пример за шаблона за проектиране на стратегия (315). Стратегията е обект, който представлява алгоритъм. Полезно е, когато искате да замените алгоритъма статично или динамично, когато имате много варианти на алгоритъма или когато алгоритъмът има сложни структури от данни, които искате да капсулирате.

MVC използва други модели на проектиране, като Factory Method (107), за да определи класа на контролера по подразбиране за изглед и Decorator (175), за да добави превъртане към изглед. Но основните връзки в MVC са дадени от шаблоните за проектиране на наблюдателя, композита и стратегията.

...

person Ray Tayek    schedule 02.02.2012

MVC е модел. Но то обхваща само малък аспект на уеб приложение. Друг общ модел, който се използва с MVC, е Repository. Това са повече архитектурни модели... техният обхват има по-голямо влияние върху цялостния проект.

GOF моделите ще се представят по малки начини навсякъде. Те могат да помогнат за изграждането на MVC инфраструктура в зависимост от избора на дизайн. напр. стратегията се използва много, така че можете да включите различни начини за извършване на неща като "удостоверяване" и т.н.

Не е нужно да използвате моделите такива, каквито са, те дори не трябва да са абсолютно същата структура на кода. Това е по-скоро принципът/целта на дизайна на модела, който използвате в дизайна.

person Keith Nicholas    schedule 02.02.2012

MVC е архитектурен шаблон. Перфектно се вписва с други дизайнерски модели като Command Pattern. Но вие не прилагате модели само защото съществуват и са написани в авторитетна книга. Прилагате шаблони, когато имате проблем с програмирането/проектирането и има начин да разрешите този проблем, който е открит от някой друг и е записан. Начинът за решаване на проблем е модел. Например, имате приложение, което записва данни в базата данни. Данните, които трябва да бъдат запазени, са доста сложни: някои записи трябва да бъдат вмъкнати, някои записи актуализирани и някои изтрити. Последователността на стъпките е важна, тъй като записите, които трябва да бъдат вмъкнати в една таблица, зависят от записите, които трябва да бъдат вмъкнати в друга таблица. Така че трябва да се използва транзакция на база данни. Един от възможните начини за реализиране на транзакцията е използването на команден шаблон. Начинът да го направите е много добре обяснен в „Прилагане на UML и шаблони" книга (глава „Проектиране на рамка за устойчивост с шаблони", раздел „Проектиране на транзакция с шаблона на командата“ - превъртете надолу до страница 556). PersistentObject там е абстрактен моделен клас. Всички други класове на модела го разширяват. В този пример MVC е внедрен в слоевете UI, Application и Domain, но Command е внедрен в слоя Persistence. Тези модели помагат за решаването на различни проблеми и се подкрепят взаимно в този пример.

person bancer    schedule 04.02.2012
comment
Гласувайте за, защото изрично заявявате, че MVC всъщност е архитектурен модел. - person raddevus; 04.12.2015