如何在MVC系统工作?(How does an MVC system work?)

2019-06-24 20:30发布

我想学习的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);
  }
}

一些问题:

  1. 是对的吗?
  2. 我不明白为什么视图不能直接改变模式 ,而是通过控制器。
  3. 假设我有一个动作后进行动画。 谁必须处理这个动画:模型,视图或控制器? 另外:动画逻辑模型,视图,或Controller的一部分吗? 更多:假设一个扑克游戏。 用户选择后的动作(比如,“提高”),系统必须播放动画(比如,芯片从玩家现场去到桌面)。 我怎么能看到这个扑克例子(动画)作为MVC? 你能解释,并给予有关伪?

谢谢。

Answer 1:

  • 模型只是数据,并通知数据的变化。
  • 查看读取模式的消息更新视图。
  • 控制器读取从查看用户输入,并根据该模型的变化。

该模型不仅仅是数据更多。 该模型也是业务逻辑。 它包含了所有系统的情报,或者至少幕后的情报(如数据库调用或其他服务的调用)的抽象。 考虑说法,“让你的模型重,你的控制器光”。

  • 模型是没有一个。
  • 查看知道模型。
  • 控制器知道这两个视图和模型。

该型号是没有一个,这是正确的。 该模型应该是应用程序之间进行移植,而不应依赖于以任何方式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响应与查看指示错误,在这种情况下,该景观将显示别的东西。)



Answer 2:

我会用简单的比喻银行去。

  • 柜员的意见。
  • 运动员是控制器。
  • 银行家模型。

银行家是聪明的,他们知道所有的业务逻辑,并完成所有的复杂的计算。

浇道是用于从银行家到柜员运输的钱(数据)。

本特勒提出的钱给客户。

简单表示:

模型

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>


Answer 3:

如果你有兴趣在历史上真正的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应用程序-他所谓的交互器,实体边界架构缺乏一个更好的名字。 周围挖了与他有关的“失去的岁月建筑”会谈相关的东西。



文章来源: How does an MVC system work?