MVC с вложенными представлениями

Рассмотрим следующую структуру представления:

  • Layout View
    • Map View
    • List View
      • Item View
        • List View
          • Item View
          • Просмотр элемента
      • Item View
        • List View
          • Item View
          • Просмотр элемента

На данный момент у меня есть только один контроллер для всей этой структуры. Все вложенные представления взаимодействуют с этим контроллером посредством всплывающих событий.

Хотел бы я создать контроллер для каждого уровня? То, что у меня есть, работает, но я чувствую, что мой вид макета и представления списка делают слишком много - например. когда контроллер говорит «вот обновленный список элементов (с сервера)», представление макета отвечает за удаление маркеров карты, которые не являются частью новых данных, обновление существующих и добавление новых. В то же время первый ListView LayoutView отвечает за то же самое, но за свои элементы.

Было бы лучше создать контроллер для каждого? Если да, то как бы я поступил? Должен ли вид макета получить ListController и MapController, которые будут отвечать за создание дочерних представлений?

Если технология представляет интерес: это для виджета JavaScript.


comment
Это немного абстрактно и трудно понять без примера кода, поэтому взамен я могу дать вам только абстрактный ответ. Если в вашем контроллере много методов/действий, это нормально, если все они связаны с одной и той же концепцией и используют много общего кода. Если вы обнаружите, что ваш контроллер использует множество разных моделей представления, то это хороший признак того, что пришло время для другого контроллера. Пусть ваш дизайн руководствуется принципами SRP и DIP.   -  person Jason Nesbitt    schedule 13.05.2014
comment
@JasonNesbitt, как сейчас, все представления, которыми управляет LayoutView, используют LayoutView в качестве своего контроллера.   -  person Jeff    schedule 14.05.2014
comment
Что ты в итоге сделал?   -  person Seth    schedule 30.07.2014
comment
Я использовал свою первоначальную структуру, так как выполнение чистого MVC было бы всеобъемлющим для автономного виджета, который должен включать -› myWidget.create({with: 'some options'}).   -  person Jeff    schedule 30.07.2014


Ответы (1)


Вы перечислили только набор просмотров. Если вы хотите реализовать библиотеку виджетов на основе MVC, вам необходимо иметь соответствующие модели и контроллеры. То есть для каждого представления, которое у вас есть, вам нужно иметь экземпляр модели и экземпляр контроллера (вам нужно закодировать соответствующие классы).

Например, у вас будут классы ListModel, ListView и ListController. Вы можете решить закодировать другой класс с именем List, чтобы связать все вместе, чтобы ваш код построения пользовательского интерфейса приложения просто создавал экземпляр класса List и использовал его. При желании вы можете уменьшить количество занятий. Например, вы можете решить объединить представление и контроллер в одно целое (поскольку связь между представлением и контроллером тесная).

Точно так же у вас будут классы ItemModel, ItemView и ItemController (а также класс Item).

Классы моделей будут иметь средства для представления ваших данных в соответствующие классы представлений способами, которые соответствующие классы представлений могут использовать для визуализации конкретных представлений. Контроллеры будут знать, как интерпретировать взаимодействия пользовательского интерфейса, которые происходят в соответствующих представлениях, и вызывать методы в соответствующих представлениях и соответствующих моделях.

Чтобы разрешить создание древовидной иерархии, в идеале следует использовать шаблон композиции GoF.

В качестве альтернативы шаблону MVC вы можете рассмотреть шаблон PAC, в котором стратегия распределения ответственности отличается. MVC широко используется в настоящее время.

person Community    schedule 04.06.2014
comment
Я слышу вас, поэтому View+Controller+Model для каждого уровня. Но как бы я сочинил это? Должен ли LayoutController создавать экземпляры MapController и ListController? Или это, возможно, чрезмерная инженерия? - person Jeff; 05.06.2014
comment
Чтобы было ясно, не View+Controller+Model для каждого уровня, а View+Controller+Model для каждого компонента или виджета (независимо от того, являются ли они составными компонентами или листьями). Как я уже сказал, подумайте о классе, который будет состоять из всех (M, V, C) и формировать компонент (W). Таким образом, W внутренне создаст экземпляры M, V и C. Иерархия сдерживания пользовательского интерфейса может быть построена с точки зрения экземпляров W в данном приложении. Создание экземпляров Ms, Vs и Cs в основном зависит от создателя библиотеки компонентов. Но Ws должен способствовать внедрению в них созданных приложением M, Vs и Cs, если требуется настройка. - person ; 05.06.2014
comment
Это может быть слишком сложным, если у вас есть только одно приложение, которое должно поддерживаться вашей библиотекой виджетов. Но если вы не заботитесь о реализации повторно используемой или модифицируемой библиотеки виджетов или очень легко модифицируемого представления для вашего приложения, вам нужно дважды подумать, почему вам нужно уделять много внимания абстракциям и разделению задач. - person ; 05.06.2014
comment
Я разделяю проблемы, потому что мне легче поддерживать. Пользователь виджета ничего не знает о внутренностях. - person Jeff; 08.06.2014
comment
Прочитайте это для ясности по использованию MVC при реализации виджета: Is MVC шаблон проектирования или архитектурный шаблон? - person ; 09.06.2014