MVC模式相对于老式的三层模式有哪些主要优势?

32

我在考虑在我的新项目中使用MVC模式,我清楚地看到这种模式的主要优点是将数据层(模型)与演示层(视图)更紧密地联系在一起,这将使应用程序速度稍微提高。但除了性能方面之外,MVC模式是否有其他优点,超过了视图-逻辑-数据分层类型模式?

编辑: 对于那些感兴趣的人,我刚刚上传了一个PHP代码示例,用于测试MVC的使用。我故意省略了所有安全检查,以使代码更易于阅读。请不要过多批评它,因为我知道它可以更加精细和先进,但尽管如此,它仍然有效!我欢迎问题和建议:这是链接:http://www.sourcecodester.com/sites/default/files/download/techexpert/test_mvc.zip


2
我也在从传统的三层应用迁移到MVC阶段。这个问题很有帮助。 - CHID
1
可能是MVC与n层架构的重复问题。 - Bert F
Bert,在我提交问题之前,我实际上看到了你指出的问题,并且它部分地回答了我对MVC是什么的疑问(由void先生/女士回答,我给了一个“赞”),但我仍然无法确定MVC的优势。这个问题中的arjan先生给了我一个非常直接的答案,解决了我的疑惑。谢谢! - techexpert
4个回答

42
MVC被引用为优点的关注点分离实际上也是三层/三层系统的进步。在这种情况下,业务逻辑是独立的,并且可以从不同的表现层使用。一个主要的区别是,在经典的MVC中,模型可以引用回视图。这意味着当数据更新时,模型可以将这些数据推回到可能多个视图。最好的例子是桌面应用程序,其中数据以多种方式可视化。这可以简单地作为表格和图形。表中的更改(即一个视图中的更改)首先通过控制器推送到模型,然后将其推回到图形(另一个视图)。然后,图形会更新自己。
由于桌面开发正在衰退,许多程序员只接触过某种Web变体的MVC,例如通过Java EE中的JSF。
在这些情况下,模型几乎从不引用视图。这是因为Web主要是基于请求/响应的,在请求已经被服务之后,服务器无法发送其他信息。即,从模型推送到客户端的更新将毫无意义。随着反向ajax / comet的出现,这种情况正在改变,但许多基于Web的MVC框架仍然没有充分利用这一点。
因此,在基于Web的MVC的情况下,MVC之间的典型“三角形”较少,而该MVC变体实际上比“真正”的MVC更接近n层模型。
还要注意,一些Web MVC框架在M、V和C之间有一个中间的管道部分,称为后备bean(Java / JSF)或代码后台(ASP.NET)。在JSF中,控制器由框架提供,并且视图通常不会直接绑定到模型,而是使用此后备bean作为中介。后备bean非常简洁,基本上只是单向地从模型预取数据,并将模型特定消息(例如异常)转换为视图特定消息(例如某些人类可读文本)。

这就是我所说的好答案!直奔主题!在我找了2天MVC相关资料之后,我偶然发现了这个网站,它已经回答了我关于这个主题的两个问题!非常感谢!新年快乐! - techexpert
2
此外,如果您希望进一步探索设计模式,了解MVP(Model-View-Presenter)可能对其他人也有益。MVP是MVC的一个衍生物。 - techexpert
嗯...我也在想...如果你将MVC作为大多数单向架构使用,那么你不能期望同一组件响应你的函数调用和事件,这意味着每个组件(或至少是视图)都必须实现输入和输出接口(函数),这意味着需要编写比分层架构更多的代码,因为每个函数都可以同时接收和返回。我错了吗? - techexpert
2
不完全是这样的。在MVC中,来自模型的实体(例如客户对象)可以直接绑定到视图。从视图发送的命令(例如单击按钮)被控制器捕获并委派给模型。这通常只是一个简单的方法调用,例如customer = CustomerService.getCustomer(customerID);由于视图已经绑定到此客户端,因此在重新渲染(由控制器启动)时自动显示新值。 - Arjan Tijms
1
在Java EE中,它基本上在视图中看起来像这样:someTag value="#{someBean.someEntity}"。从某种意义上说,这是一种声明性绑定。someBean存储在某个范围内(即请求、视图或对话范围)。调用模型(又名服务)返回后,someEntity将被更新。视图仅引用someEntity。在这种情况下,确实存在一些中间存储。这就是我上面谈到的“管道”部分。它有点属于M、V,甚至有时属于C。 - Arjan Tijms
显示剩余2条评论

6
除了@bakoyaro和@arjan所提到的代码重用、关注点分离、层之间较少的耦合度之外,我认为当与“约定优于配置”模式(即“Ruby on Rails”或Microsoft的“MVC for asp.net”)相结合时,MVC比3层更好。在我看来,这种组合可以导致更好、更容易的代码维护。首先,它使学习MVC框架变得有些困难,因为您必须学习惯例(例如,控制器进入控制器文件夹并且必须命名为xxxxxcontroller)。但是,在您学习了这些惯例之后,维护自己和他人的代码就变得更容易了。

谢谢!我会研究这些规范,尽管我还没有看到有人在使用我的应用程序所使用的PHP中遵循它。 - techexpert
2
你的回答听起来好像你想自己做mvc。我更喜欢你使用一个实现了“配置优于约定”的mvc框架库,让它为我完成所有的约定工作。 - k3b
很好的建议!我会寻找一些PHP库来帮助我。谢谢你!虽然我认为是Arjan先生提出了最好的问题,但我已经投了他一票,但我认为你也应该得到一些额外信息的赞扬。新年快乐! - techexpert

2
忘掉通过转移到MVC来增加应用程序速度。我发现最大的好处是易于代码重用。一旦你转移到MVC,就不会依赖于数据呈现或实际数据存储。例如,您可以编写一个servlet,将.jsp页面作为您的表示层提供服务,而第二天编写一个Web服务作为现有模型和控制器的另一个表示层。同样,如果您想要或需要切换您的DBMS。由于访问模型完全与其他所有内容分离,因此您只需要重新编写数据访问对象以以Controller可处理的方式返回数据。
通过将关注点分为3个不同的部分,您还可以促进真正的单元测试。您的表示层可以在没有Model或Controller的情况下进行测试,反之亦然。
顺便说一句,我经常觉得MVC缩写不准确。每当我看到它时,我认为它是View->Controller->Model。表示层永远不会有DAO代码,而模型永远不会有表示逻辑。控制器被迫充当中间人。

我理解MVC是一个三角形模式,视图->控制器->模型->“回到视图”,组件之间主要是单向通信。而三层架构是一种顺序或线性模式:视图<->逻辑<->数据,每个层之间有双向通信。你所说的内容也可以在三层架构中实现,只要保持每个层独立并相互独立即可,但是MVC为什么更好呢? - techexpert
@techexpert:您对MVC的描述不是我所知道的定义,肯定不是Cocoa或Rails中使用的定义。您的“视图-逻辑-数据”更像是我所知道的MVC。 - Chuck
那我建议你为了自己的利益再做一些关于这个主题的研究,因为它们确实有所不同。Arjan的回答也指出了这一点。此外,维基百科对于3层和MVC模式都有描述,以及其他模式。祝好! - techexpert

0

在三层架构中,将表示层、业务逻辑层和数据访问层分离开来。而MVC是一种表示层模式,它进一步将模型(数据)与视图(屏幕)和控制器(输入)分离。

没有选择MVC或三层/三层架构的问题。两者都可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接