Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC系统是如何工作的?_Model View Controller_Oop_Design Patterns - Fatal编程技术网

Model view controller MVC系统是如何工作的?

Model view controller MVC系统是如何工作的?,model-view-controller,oop,design-patterns,Model View Controller,Oop,Design Patterns,我试图学习MVC模式,但每个地方都有不同的说法。所以现在我不知道什么是真正的MVC 所以我猜这是最纯粹的MVC: 模型仅为数据并通知数据更改 视图读取模型的消息以更新视图 控制器从视图读取用户输入,并根据需要更改模型 实施 模特不认识任何人 视图知道模型 控制器既知道视图又知道模型 伪代码: /* Model */ class Color{ color = blue; setColor(color); notifyUpdate(); } /* View */ class C

我试图学习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);
  }
}
一些问题:

  • 是这样吗
  • 我不明白为什么视图不能直接更改模型,而是通过控制器
  • 假设我有一个动作后要执行的动画。谁必须处理此动画:模型、视图或控制器?另外:动画逻辑是模型、视图或控制器的一部分?更多:假设一场扑克游戏。在用户选择一个动作(比如“升起”)后,系统必须播放一个动画(比如,从播放器位置到桌面的芯片)。如何将这个扑克示例(带有动画)视为MVC?你能解释一下并给出一个伪代码吗
  • 多谢各位

    • 模型只是数据和通知数据更改
    • 视图读取模型的消息以更新视图
    • 控制器从视图中读取用户输入,并根据需要更改模型
    模型不仅仅是数据。模型也是业务逻辑。它包含系统的所有智能,或者至少是后台智能的抽象(例如数据库调用或其他服务调用)。考虑一下这个说法:“保持你的模型很重,你的控制器是轻的。”
    • 模特不认识任何人
    • 视图知道模型
    • 控制器同时知道视图和模型
    模型不知道任何人,它是正确的。该模型应该在应用程序之间可移植,并且不应该以任何方式依赖于UI关注点。(在本例中,视图和控制器是UI关注点。)

    视图知道模型,也正确。视图基本上“绑定”到模型。它显示所有UI元素,并相应地将模型数据放置在UI元素中

    控制器有点“知道视图”,它知道应该将控制指向哪个视图,但它对该视图一无所知。它也不知道以前的控制来自哪个视图。控制器对事件作出响应。事件从UI进入,携带某种状态信息(可能是ViewModel),通过模型(业务逻辑发生的地方)引导逻辑控制,并用模型(或ViewModel,如果特定于特定视图的数据形状与模型不同)和视图响应

    我不明白为什么视图不能直接改变模型,而是通过控制器

    视图可以在用户交互的上下文中操纵模型,但不应期望这些更改以任何方式持续存在。视图应该被视为“客户端”,而不知道任何“服务器端”。(即使您谈论的是本机应用程序而不是web应用程序。)持久化任何更改都被视为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时,动画将播放。它可能会使用指示错误的视图响应UI,在这种情况下,该视图将显示其他内容。)

    如果您对历史上真正的MVC感兴趣,请从开始。他在20世纪70年代末创建(观察、编目)了它。从1979年开始读。它定义了术语。请注意它的标题-这三个角色都是多元化的。这是大多数人似乎第一件出错的事情

    关于MVC最初的使用,我发现最好的描述是在2004年的一篇题为。我猜描述Smalltalk 80 MVC最终版本的规范性论文是Krasner&Pope和 史蒂夫·伯贝克的。这两篇论文都很值得一读

    如果你有时间消磨时间,并且不介意听罗伯特·马丁的话,他在MVC方面做得很好。信息技术
    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>