Model view controller MVC架构

Model view controller MVC架构,model-view-controller,architecture,Model View Controller,Architecture,我想澄清一下MVC架构。在浏览一些文档时,我可以看到在模型视图和控制器之间建立了以下关系。请帮助我理解这是如何可能的 视图查询模型的状态 模型将状态信息传递给视图 一般来说,您所描述的将由控制器完成。控制器将查询模型,解释数据,并将其发送到视图,以视图理解的形式显示 然而,MVC并不是一条硬性规定。有很多种解释,如果“正确”地做比稍微扭曲规则更难看,后者通常更可取。MVC遵循一些简单的规则 模型与控制器对话 控制器与视图对话 视图从不与模型对话 您的模型通常会映射到数据库表。例如,如果您有一

我想澄清一下MVC架构。在浏览一些文档时,我可以看到在模型视图和控制器之间建立了以下关系。请帮助我理解这是如何可能的

  • 视图查询模型的状态
  • 模型将状态信息传递给视图

  • 一般来说,您所描述的将由控制器完成。控制器将查询模型,解释数据,并将其发送到视图,以视图理解的形式显示


    然而,MVC并不是一条硬性规定。有很多种解释,如果“正确”地做比稍微扭曲规则更难看,后者通常更可取。

    MVC遵循一些简单的规则

    • 模型与控制器对话
    • 控制器与视图对话
    • 视图从不与模型对话
    您的模型通常会映射到数据库表。例如,如果您有一个“blogposts”表,该表有两列,“title”和“body”,您可以执行以下操作:

    Blogpost.create(:title => "Hello", :body => "World")
    
    你刚刚创建了一篇博文!现在,在控制器中,您将执行以下操作:

    blogs = Blogpost.find(:all)
    

    现在可以将“blogs”变量传递到视图中,它可以决定如何向用户显示该数据。很抱歉,如果我的示例代码不够清晰,它是用Ruby(在Rails上)编写的,这是我当前选择的MVC语言。

    假设您有一个名为View的对象和一个名为Model的对象。每个对象都拥有对另一个对象的引用。您描述的工作方式是,视图将调用模型中的函数,询问模型的状态,模型将返回它想要的信息。实现它的一种更有效的方法是,模型将告诉状态什么时候发生了变化,然后View将询问它想要的信息。我身上没有代码示例,但您可能想研究如何使用。

    我以前看过一篇描述MVC“三角形”形式的文档,我想有人在某个时候让它工作了(或者,或者关于它的文档只是在谈论vaporware)。然而,我还没有发现它有多少实际用途,因为它导致了一个严重的软件“工程”问题:循环依赖。如果视图依赖于模型的确切形状来执行某些查询,并且模型依赖于控制器的确切形状,而控制器依赖于视图的确切形状,那么实际上就不可能调出任何这些元素

    我发现有一个模型非常有用,它不依赖于任何东西,而仅仅依赖于一个简单的命令行程序。一个不依赖任何东西的视图,除了您正在使用的gui工具包或图形绘制api,以及一个充当两者之间的代理的控制器,实现了这种解耦。这是一种策略,允许您创建模块化和可交换的模型和视图,只留下一个组件:控制器,以及所有这些讨厌的依赖项


    当然,MVC模式可能有某种“官方”版本,但我还没能通俗地阅读任何文档来描述这样的事情,从某种意义上说,它确实适用于现实世界的系统。但也许我就是有点傻

    在我读过的许多文章中,他们说视图可以与模型对话。它不是模式的典型或规范版本。是的,但是如果您抽象每个部分、视图、模型和控制器以适合您心目中的模型,那么您就可以避免问题。你应该总是有一些抽象的层次。我已经管理了一些“正式”的MVC项目,但是你不必严格按照这个模式。您可以随时根据自己的需要修改它们。它们更多的是指导原则,而不是实际规则。我不确定你在这种情况下所说的“抽象”是什么意思。你的意思是提前决定部件之间的接口是什么?我发现这种方法相当困难,我不是一个真正优秀的程序员,在我构建一个设计之前,在我有机会进行调整之前,我不能确定一个设计是否会提前工作,所以取决于一开始设计的一个界面,不能改变听起来很可怕。也许你指的是别的。不,我指的是一个抽象类或接口,其他类似对象可以继承它来创建类之间接口的标准方式。不过,不要过于抽象,那样会产生其他问题。我原以为你是这个意思。不过,我也有同样的担忧。你到底什么时候设计这个界面?它只是取代了问题,而不是一个类依赖于另一个类,它依赖于抽象。也许我想得太多了。也许我在想这件事。也许我只是需要小睡一下。这就是为什么我通常使用Java的observer。它为您提供了足够的抽象,其中您有用于通知的公共类,但您并不是那么抽象,而是定义了所有可以做的事情。就我而言,通知是唯一需要标准化的东西,其他一切都可以是直接的。我在软件工程课程中学到的一件事是,没有什么东西是真正独立的,总是会有依赖关系。关键是要将它们保持在可管理的水平。