我想学习的MVC模式,但每个地方说不同的东西。 所以,现在我不知道什么是真正的MVC。
所以我猜测它最纯粹的MVC:
- 模型 只是数据 ,并通知数据的变化。
- 查看读取模式的消息更新视图。
- 控制器读取从查看用户输入,并根据该模型的变化。
实施
- 模型是没有一个。
- 查看知道模型 。
- 控制器知道这两个视图和模型 。
伪代码:
/* 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);
}
}
一些问题:
- 是对的吗?
- 我不明白为什么视图不能直接改变模式 ,而是通过控制器。
- 假设我有一个动作后进行动画。 谁必须处理这个动画:模型,视图或控制器? 另外:动画逻辑模型,视图,或Controller的一部分吗? 更多:假设一个扑克游戏。 用户选择后的动作(比如,“提高”),系统必须播放动画(比如,芯片从玩家现场去到桌面)。 我怎么能看到这个扑克例子(动画)作为MVC? 你能解释,并给予有关伪?
谢谢。
- 模型只是数据,并通知数据的变化。
- 查看读取模式的消息更新视图。
- 控制器读取从查看用户输入,并根据该模型的变化。
该模型不仅仅是数据更多。 该模型也是业务逻辑。 它包含了所有系统的情报,或者至少幕后的情报(如数据库调用或其他服务的调用)的抽象。 考虑说法,“让你的模型重,你的控制器光”。
- 模型是没有一个。
- 查看知道模型。
- 控制器知道这两个视图和模型。
该型号是没有一个,这是正确的。 该模型应该是应用程序之间进行移植,而不应依赖于以任何方式UI担忧。 (视图和控制器在这种情况下,UI的关注。)
该视图知道型号,也是正确的。 该视图基本上是“结合”的模式。 它提出的所有UI元素和相应的UI元素内放置模型数据。
该控制器那种 “知道的视角。” 它知道它的看法,对此应该直接控制,但它不知道有关的任何内容。 它也不知道哪个查看从之前的控制来了。 该控制器响应事件。 事件从UI进来,携带某种状态信息,与它(一个视图模型,也许),引导通过模型(如该业务逻辑发生)的逻辑控制,并与模型响应(或视图模型,如果形状专用于特定视图的数据的比模型)和查看不同。
我不明白为什么视图不能直接改变模式,而是通过控制器。
该视图可以操纵用户交互的上下文中的示范,但不应该指望这些变化以任何方式坚持。 该视图应该被认为是“客户端”,不知道什么“服务器端”。 (即使你是在谈论一个原生应用程序,而不是一个Web应用程序。)坚持任何变化被认为是UI“操作”或“事件”,并会去一个控制器来做到这一点。
假设我有一个动作后进行动画。 谁必须处理这个动画:模型,视图或控制器? 另外:动画逻辑模型,视图,或Controller的一部分吗?
动画听起来像一个完全基于UI的操作。 这将是在视图中。 难道还有比只是一个UI动画更发生了什么? 难道动画改变后端什么? 举例来说,如果我有一个Web应用程序,并在页面加载时,我想淡入一些数据(动画)...这是完全在视图中。 这些数据将被传递到浏览像任何其他数据,并且动画完全发生在UI(查看)中。 它不会从模型或控制器的角度做任何事情。
假设一个扑克游戏。 用户选择后的动作(比如,“提高”),系统必须播放动画(比如,芯片从玩家现场去到桌面)。 我怎么能看到这个扑克例子(动画)作为MVC? 你能解释,并给予有关伪?
(“增大”)的作用是控制器事件。 该UI会联系控制器中执行“加薪”。 因此控制器可能有这样的方法:
View Raise(GameState state)
{
// Interact with the Models to update the known state of the game.
// The Models would perform the actual Poker game logic.
// Respond with a View bound to updated Models.
}
一旦控制器响应一个新的查看用户界面,即查看将包含任何动画显示给用户。 (毕竟,你不想除非行动是成功的执行动画,对不对?当控制器响应一个新的浏览指示成功的行动UI,那么动画将发挥,这可能不是到UI响应与查看指示错误,在这种情况下,该景观将显示别的东西。)
我会用简单的比喻银行去。
银行家是聪明的,他们知道所有的业务逻辑,并完成所有的复杂的计算。
浇道是用于从银行家到柜员运输的钱(数据)。
本特勒提出的钱给客户。
简单表示:
模型
public class BankAccount
{
public int ID;
public int Balance;
public BankAccount(int id)
{
ID = id;
Balance = DetermineAmount();
}
public int DetermineAmount()
{
// Gather transaction info, debits, credits and return a
// sum of the amount left in the account depending on the
// id provided.
}
}
调节器
public class BankAccountController
{
public ViewResult Index(int id)
{
BankAccount account = new BankAccount(id);
return View(account);
}
}
视图
<ul id="account-info">
<li>Account ID: `@Model.ID`</li>
<li>Balance: `@Model.Balance`</li>
</ul>
如果你有兴趣在历史上真正的MVC,然后开始特里夫·林斯卡格 。 在70年代末,他创造(观察?编目?)它。 一开始,请阅读“模型-视图-控制器” ,从1979年它定义的术语。 注意一定要小心它的标题- 所有这三个角色都使用复数 。 这是大多数人似乎得到错误的第一件事。
我发现原来使用MVC的最好的描述实际上是在2004年日的演讲题为“内部的Smalltalk MVC” 。 我猜想,描述MVC的Smalltalk的80最终版本的规范文件是克拉斯纳与教皇的“菜谱使用模型-视图-控制器界面范式中的Smalltalk-80”和史蒂夫Burbeck在的在Smalltalk-80“应用程序编程:如何使用模型-视图-控制器(MVC)” 。 这两份文件是非常值得读。
如果你有一定的时间内杀死,不介意听罗伯特·马丁,他做了一个很好的基调,在红宝石中西部2011上MVC感动。 这是一个多小时,但是相当娱乐性和启发性。 我倾向于遵循他认为,大多数实现MVC得到错误。 我花了一点时间环顾四周,终于找到了一个图,我可以链接到其描述MVC。 我喜欢的一个来自教皇和克拉斯纳 。
MVC http://www.as3dp.com/wp-content/uploads/2010/02/mvc_pope_krasner.png
从我的角度来看,以下是要点:
- 模型实例负责通知更改的感兴趣的对象 。 需要注意的是,这些可以是任何对象实例。 该图显示了两个视图和接收更新这里控制器。
- 意见负责查询当前状态,并显示结果 。 他们通常执行滤波或数据转换为好。
- 控制器负责接受用户输入和转发视图消息沿到视图。
- 查看邮件在MVC一个共同的主题。 重要的是,这些都是独立的UI世界 - 这些都不是鼠标点击并没有什么,但事件的看法,特定的语言。 这给我们带来的下一个点。
- 视图并不取决于以任何方式在控制器上 。 控制器负责安排和创建视图,并提供了世界其他地区和视图之间的接口。
- 在一个完美的世界, 视图是负责制作模型表示可见 。 这是当MVC应用到桌面应用程序它是如何工作。
现实情况是,MVC已经被扭曲和重写的网络世界。 这不是真正的MVC再或者,也许MVC简单地重新定义。 这就是为什么你看到这么多不同的意见,MVC的表示在那里。 如果您正在寻找进入编写桌面风格的应用程序,然后查看由克拉斯纳及教皇的东西。 如果您正在寻找到MVC是如何应用到Web,那么我建议鲍勃叔叔的基调替代,它更适合于Web应用程序-他所谓的交互器,实体边界架构缺乏一个更好的名字。 周围挖了与他有关的“失去的岁月建筑”会谈相关的东西。