Проблемы использования MVC
Запись от Котяра размещена 13.01.2010 в 13:12
Обновил(-а) Котяра 14.01.2010 в 12:44 (добавил ссылки)
Обновил(-а) Котяра 14.01.2010 в 12:44 (добавил ссылки)
Проблемы использования MVC
(Черновик)
Концепция MVC очень привлекательна, и до некоторого временя я был ярым её приверженцом, и даже, мягко сказать, фанатом)
Но, переводя старые проекты на этот паттерн, и проектируя новые, я столкнулся с некоторыми проблемами, которые я попробую описать и формализовать.
Часть примерных решений проблем я опишу, часть остаётся открытыми. Прошу помочь!
Целью статьи является ФОРМАЛИЗАЦИЯ проблем при разработке архитектуры проекта, если вдруг пришло в голову использовать MVC (готовый или самописный)
В статье попробую описать проблемы конструирования проекта и реализации MVC для ActionScript3, с которыми сталкивался лично, хотя многие проблемы не связаны напрямую с языком, и, скорее являются проблемами архитектуры в чистом, незамутнённом реализациями, виде, или, что более вероятно, проблемами моего восприятия концепции MVC)
Я пока не знаком со всеми реализациями MVC, ссылки на которые указал ниже, возможно, в некоторых из них многих проблем не существует.
И вообще, как сказал wvxwv:
Цитата:
MVC - это инструкция как писать свой код, но ее нельзя отделить от какого-то конкретного кода, положить в библиотеку и использовать по новой, ну, примерно так же, как нельзя выделить написание только гласных букв из процесса написания кода
Вводная:
TODO: описание MVC - примеры реализаций, ссылки.
Существует множество реализаций MVC, как для pure AS3, так и для Flex.
вот некоторые из них:
TODO: добавить краткий обзор каждого, и ссылки на документацию.
* Cairngorm
http://opensource.adobe.com/wiki/dis...gorm/Cairngorm
* PureMVC
http://puremvc.org/
* Mate
http://mate.asfusion.com/
* HydraMVC - A rewrite of the PureMVC API exclusively for Flex
http://www.hydramvc.com/
* Slide
http://code.google.com/p/flex-slide/
* Guasax
http://www.guasax.com/
* Parsley
http://www.spicefactory.org/parsley/
* FlashMVC - A flexable lightweight framework engine for AS3.
http://www.flashmvc.com/
* Hive - A state-based MVC framework for AS3.
http://code.google.com/p/as-hive/
* Soma and SomaUI - An AS3 MVC framework and software to generate an AS3 flash site based on it.
http://www.soundstep.com/blog/downloads/somaui/
Самая основная проблема:
0. А нужен ли MVC вообще в этом, конкретном проекте:
TODO - плюсы и минусы MVC, проекты где без MVC не обойтись/ проекты где MVC лучше не использовать.
Проблемы отделения:
1.Отделение контроллера от вида
Отделить контроллер от представления обычно легко - в качестве контроллера у меня часто выступает некий parent - это может быть документ класс или составной VC (подмодуль).Фанаты явно отделяют контроллер от основного вида используя композицию.
На самом деле Фасад (F)- по сути является контроллером, хотя с другой стороны является видом более высоко порядка. В иерархическом MVC я не вижу смысла отделять Фасад
2.Отделение модели(M) от вида(V).
Собственные данные вида, такие как x,y - очень часто выглядаят как данные модели, и возникает соблазн не заводить их в модели и менять напрямую из контроллера. После таких конструкций более логично выглядит и остальные данные привязать напрямую с видом. Этого делать нельзя, но очень хочется - значит можно.
Пример:
добавляем вид слушающий x,y модели. но модель не изменяется, соответственно нет события изменения.
Решение 1: вызов view.init() - > самостоятельное взятие данных из модели..
Вроде хорошое решение, но из этого решения вытекает проблема №7
3.Отделение модели от контроллера(C)
тут не так всё однозначно.. часто событие обновления данных модели напрямую меняет виды.
Проблемы иерархий:
4. Синглтоны
5. Иерархия вложенных MVC
6. Изменение связанных данных модели поочерёдно.
Поясню проблему примером:
Изменились x,y - вид слушает оба изменения. т.е. ловит два соытия и оба раза изменяет своё состояние..
Решение: связанные данные связывать)) т.е. менять не x,y, а Point.
Другой вопрос, что
Проблемы ссылок:
7. Всегда ли вид должен иметь ссылку на модель, как объект содержащий данные, или только как объект раздающий события?
Цитата:
Сообщение от Nirth
Вообще MVC за исключением Mate не используют событий, если исходить из классического ( GoF ) реализации, то у нас будет использоватся обсервер, и все три компонента ( Model + View + Controller ) будут подписанны, к Обсерверу.
Далее например модель посылает DataUpdated сообщение через Обсервер, и подписанный Вид на это сообщение будет обновляться.
То есть все три связуются не через ссылки друг на друга, а через Обсервер. Таким образом в любой момент можно подменить модель, не меняя ничего в Контроллере или Виде, просто сообщения, которые они посылают должны быть слушаемыми.
А если вид, контроллер или модель друг на друга ссылаются, весь смысл использования MVC улетучивается моментально.
Далее например модель посылает DataUpdated сообщение через Обсервер, и подписанный Вид на это сообщение будет обновляться.
То есть все три связуются не через ссылки друг на друга, а через Обсервер. Таким образом в любой момент можно подменить модель, не меняя ничего в Контроллере или Виде, просто сообщения, которые они посылают должны быть слушаемыми.
А если вид, контроллер или модель друг на друга ссылаются, весь смысл использования MVC улетучивается моментально.
8. Создание множества лишних классов.
концепция MVC плодит множество классов и соответствеено увеличивает СЛОЖНОСТЬ, как понятие надёжности.
пример: надо сделать движение 10 шариков по экрану. координаты шариков приходят с сервера(имитация в Main.serverOnData).
без mvc : класс Main добавляет 10 шариков Ball. Main вызывает ball[i].move(xArr[i],yArr[i]). всего 2 класса,11 стационарных объектов.
TODO: код,вложения.
mvc: класс Main (FC) создаёт 10 объектов BallView, один MainModel и 10 BallModel. затем связывает каждый ballView и ballModel.
Каждый ballView подписан на событие BallModelEvent.CHANGE_POINT создаваемое в ballModel.
Main изменяет MainModel.ballModelArray
итого:
TODO: код,вложения.
Цитата:
Сообщение от Nitrh
По Hydra/PureMVC нам нужно примерно 6 классов ( Model, View, Controller, ModelAdapter, ViewMediator etc ), если проект большой и длительный (больше 3х месяцев), и есть несколько филиалов, или используются аутсорсеры. То проект обречен на то, что будут забывать или игнорировать классы, и ссылатся напрямую вместо обсерверов. По моему все, что нужно это налаженная кодо-генерация прямо из коробки в Flex Builder. Примерно, как в Ruby on Rails, Merb, Django, где модель, вид и контроллер генерируются сами, а программист уже заполняет функции, и не думает о рутине.
10. ~7+ иерархические модели
..
Проблемы производительности
20. Проблема вызовов.
лучше в одной ф-ции (render) напрямую поменять виды чем изменять модели, и ждать событий изменения.
Проблемы состояний и отложенных действий.
30. Где хранить промежуточные данные? в контроллере?
пример
от сервера приходит действия: шарику двигаться на x1, затем на x2, потом показать табличку, затем плавно поменять счёт.
Всего комментариев 19
Комментарии
![]() ![]() |
|
не в обиду будет сказанно, сложилось впечатление что тебе не совсем понятно как использовать MVC =)
|
![]() ![]() |
|
@wvxvw
Ты знаешь, я не ощутил неудобства при использовании Mate / Swiz, вот PureMVC/Cairnogm у меня вызывают стойкое отвращение. |
![]() ![]() |
|
Не знаю, мое мнение - идея архитектурного фреймворка не имеет права на жизнь, и я еще не встречал ситуации, когда использование такого фреймворка было бы лучше его отсутствия.
Вообще, эти фреймворки напоминают ситуацию в AS2 со слушателями - т.е. если помнишь, там скорее всего в хелпе был пример типа: И не смотря на то, что это был просто пример где создавался просто объект "для наглядности" - я встречал уйму, даже не то, чтобы уйму, безумное, подавляющее большинство кодеров зачем-то создавали этот "объект для примера" чтобы добавить слушателя. Т.е. пример массового безумия вызваного какими-то на первый взгляд абсолютно безобидными и вроде как даже не располагающими к тому причинами. Я к чему - как мне это видится, MVC - это инструкция как писать свой код, но ее нельзя отделить от какого-то конкретного кода, положить в библиотеку и использовать по новой, ну, примерно так же, как нельзя выделить написание только гласных букв из процесса написания кода ![]() |
|
Обновил(-а) wvxvw 14.01.2010 в 13:27
|
![]() ![]() |
|
Вообще основная моя основная идея этого поста рассмотреть создание кастомных MVC архитектур для конкретных проектов:
что-то вроде: надо чтоб 10 шариков слушали изменение положения 11 шарика , и изменяли своё положение.. хорошо бы сделать так-то.. завести одну модель данные которой позиция 11 шарика, 10 других шариков сделать слушателями изменения..итп.. т.е. основной упор на не использовании конкретного фрэймворка, а на создании архитектуры. кроме того описать, как это реализовать кастомно или с использованием pureMVC/Mate etc.. В итоге, разобрав ситуации, можно будет приблизиться к требованиям по разработке ИДЕАЛЬНОГО фрэймворка) |
|
Обновил(-а) Котяра 14.01.2010 в 18:12
|
![]() ![]() |
|
Нет, я не жалуюсь, я утверждаю, что автомашины с колесами формы отличной от круга ездят хуже.
![]() |
![]() ![]() |
|
это ирония)
|
Последние записи от Котяра
- Страх и ненависть в Нью-Дели или сборка мультипака для arm7 и x86 c Adobe AIR 14 в FB (16.06.2014)
- Нативный EventDispatcher в старлинге (27.11.2013)
- Нужны ошибки компиляции при создании экземпляра синглетона извне? Запросто! (13.09.2013)
- ARP - новый формат упаковки ресурсов (07.02.2013)
- DropShadowFilter и GlowFilter в Starling (16.01.2013)