【发布时间】:2012-06-02 04:59:09
【问题描述】:
我正在尝试学习 MVC 模式,但每个地方都有不同的说法。所以现在我不知道什么是真正的 MVC。
所以我猜它是最纯粹的 MVC:
- 模型是只是数据并通知数据更改。
- View 读取 Model 的消息以更新视图。
- Controller 从 View 读取用户输入并据此更改 Model。
实施
- 模特不认识任何人。
- View 了解 Model。
- Controller 了解 View 和 Model。
伪代码:
/* Model */
class Color{
color = blue;
setColor(color);
notifyUpdate();
}
/* View */
class ColorPicker(model){
model.register(update);
update(){
this.colorToExhibit = model.color;
}
}
/* Controller */
class Colorize(view, model){
view.register(update);
update(color){
model.setColor(color);
}
}
一些问题:
- 是这样吗?
- 我不明白为什么 View 不能直接更改 Model,而是通过 Controller。
- 假设我有动画要在一个动作之后执行。谁必须处理这个动画:模型、视图还是控制器?另外:动画逻辑是模型、视图还是控制器的一部分?更多:假设一个扑克游戏。在用户选择一个动作(例如,“Raise”)后,系统必须播放动画(例如,筹码从玩家位置到桌子)。如何将这个扑克示例(带有动画)视为 MVC?你能解释一下并给出一个伪代码吗?
谢谢。
【问题讨论】:
-
我怀疑你在不同的地方找到关于 MVC 的“说点不同的东西”的原因是在实现上存在差异。例如,David 的出色答案听起来是针对 iPhone 开发的——视图“绑定”到模型的概念并不是我从 PHP Web MVC 系统(如 symfony)中认识的描述性术语。同样,模型不必在理论上的 MVC 系统中引发事件,尽管它们在 Objective C 中会这样做。我认为你最好的选择是拿起一个 MVC 系统并使用它。您是在寻找移动/应用程序开发,还是网络方面的东西?什么语言?
-
@halfer:实际上,我从未做过 iPhone 开发。我的主要经验是 Web 开发,我试图将描述与 ASP.NET MVC 实现分开。我想这种努力取得了一些成功:) 通过“绑定”我并不是指任何特定于语言/框架的东西,而只是有一个骨架视图,它期望模型数据位于特定位置。 “绑定”的行为将填充这些点。框架有不同的工具可以做到这一点,也可以手动完成。
-
@David,谢谢。实际上,数据由控制器提供给视图 - imo 这不仅需要是模型数据,还可以同样是计算的、随机的、文字的、缓存的数据(等)。我要对 Fabricio 提出的主要观点是,并非控制器逻辑中使用的所有变量都在视图中可用 - 通常程序员会指定要提供的内容,因此两者之间的接口是干净且定义明确的。在我的 (PHP) 经验中,视图无法独立查看模型,除非控制器提供列值、行类或结果集合(等)。
-
@halfer:所有优点。在这方面,我通常更喜欢区分“模型”和“视图模型”。模型是业务领域对象。在许多情况下,这与 UI 行为是一对一的,但并非总是如此。即使是这样,它仍然是一个不同的问题。 ViewModel 将包含任何特定于视图的数据转换以及要对数据执行的任何特定于视图的函数。在这方面,我喜欢 FubuMVC 方法,即“一个 ViewModel 到 View,一个 ViewModel 回来”。拥有一个瘦 UI 绑定的 ViewModel 对于这些目的非常有用。
标签: model-view-controller oop design-patterns