MVC中的M在哪里?

时间:2011-06-16 20:43:41

标签: flex model-view-controller design-patterns cairngorm

我要问的问题是受到我最近使用Flex平台的工作(以及一些假装实现MVC的框架)的启发,但我认为这足以让具有各种专业知识的人参与其中。

很长一段时间以来,我都遵循了像Cairngorm这样的框架提出的范例 -

查看,绑定到单例模型的属性以及调度事件。 事件被前端控制器捕获,结果命令被执行。 命令调用服务,获取数据并提供模型。 该模型通过绑定隐式更新视图。

在我得到以下数据结构之前,这一切都很好听:

用户  有很多粉丝(用户)  跟随很多用户  有一堆照片  跟随许多地方

照片  有很多喜欢的人(用户)  有一个位置  有一个创造者  有很多相关的照片

地点  有很多照片  有很多粉丝

同样,使用Cairngorm提出的想法也不会有问题 currentUser,currentLocation和currentPhoto,只是绑定到它们。

问题出在观点本身。我有一系列复杂的“页面”视图,它提供了可以想象的钻取信息。例如,位置页面显示最新/流行照片的网格,关注者的面板以及基于拍摄这些照片的坐标的地图。问题出现了:

显然,出于性能原因,我无法获取关注特定位置的所有用户或位置可能拥有的所有照片。我预先提取了一些,其他的将由服务器按需提供。

我想深入了解同一个视图,例如点击关注者的头像页面时,我应该得到该用户照片的小网格,或者......但我在模型中只有一个currentUser。

这导致了一个问题,为什么我甚至需要绑定到中央单例模型?我不能只是将每个视图转换为一个响应者,即视图再次调度,但这次命令而不是提供模型,将直接提供调用视图。

不会有任何耦合,因为每个视图都会实现IResponder。该命令只需要一个IResponder,它将从调用它的事件中获取。

我所看到的“模特”将扮演不同的角色。它更像是一个缓存,一种用于本地存储的全局字典,在它从服务器发出请求之前将由命令检查。这样它可以节省一些对服务器的调用,但是,如果数据非常偶发,则同一数据将与其他数据一起一次又一次地获取。 (我可能在缓存中有一些用户数据,但一般情况下我会调用服务器以获取一组关注者数据,无论其中是否有一些我可能已经拥有,为了保持一致性)

欢迎任何有关这些想法的反馈

2 个答案:

答案 0 :(得分:1)

我认为你的实际问题是:

  

这导致了一个问题,为什么我   甚至需要绑定到一个中心   单身人士模特?

您不需要绑定到中央单例模型。事实上,许多人声称这种方法很糟糕,会导致性能问题。绑定可能是一项昂贵的操作,因此将所有可绑定值放在一个位置会导致应用程序出现连锁反应。

Cairngorm似乎将你推向这个方向这一事实对Cairngorm来说是一个普遍的批评。在Cairngorm的辩护中,我认为没有理由 - 在Cairngorm架构内 - 如果你愿意,你不能拥有多个“全球数据单身人士”。我首先要避免反对反对单身人士的论点。

大多数后Cairngorm框架可以被视为对Cairngorm的回应以及尝试以不同方式做事。

答案 1 :(得分:1)

这不是一个真正的答案,因为问题不是一个问题。但是,如果你想看看'MVC',你应该远离Cairngorm ,因为它在Flex的所有应用程序框架中实现了最糟糕的MVC模式。最好的例子之一(或者最糟糕的取决于你如何看待它)是他们使用Theo already blogged about的单例模型。

您应该查看RobotLegsParsley以获取正确的MVC架构。在我个人对架构的看法中,“模型”只是说“数据”的另一种方式。它只是一个为您的应用程序保存数据或状态的类。