模型-视图-控制器是糟糕的面向对象设计吗? [关闭]
Posted
技术标签:
【中文标题】模型-视图-控制器是糟糕的面向对象设计吗? [关闭]【英文标题】:Is Model-View-Controller Poor Object-Oriented Design? [closed] 【发布时间】:2011-08-12 13:48:22 【问题描述】:OOD(面向对象设计)和 MVC(模型-视图-控制器)架构都已成为现代软件设计的主要内容。然而,我最近就 MVC 架构如何利用(甚至可能违反)OOD 原则进行了一次有趣的讨论。这种可能性实际上相当有趣,因为 OOD 和 MVC 都旨在实现许多相同的目标:关注点分离和软件可重用性。但我提出的问题是:这两种设计策略是否直接相互冲突?由于我都使用过,在实践中,我开始认为:很可能是的。
我之所以这么说是因为:在模型、视图和控制器之间执行严格的分离通常会导致架构中模型被实现为只能通过外部控制器操作的愚蠢的容器。我认为这直接与面向对象设计的主要原则之一相冲突:对象包含执行必要操作并在必要时封装它们的操作。例如,在纯面向对象架构中,假设的 File
类将包含诸如 open()
和 save()
之类的方法。 MVC 建议我们有两个类File
和FileManager
(这样后者包含open()
和save()
方法)。对我来说:MVC 设计相当混乱。如果需要创建一种更专业的File
类型(例如用于处理在open()
或save()
上通过网络流式传输的文件),则只需将File
子类化为一个名为(假设):StreamedFile
。使用 MVC,您必须要么创建另一个管理器类,要么使原始管理器类的设计复杂化。
由此,可以得出结论,在更复杂的系统中,MVC 可能对关注点分离和代码可重用性产生灾难性影响。或不?也许 MVC 模式可以在不违反 OOD 原则的情况下实现?还是说 MVC 是一种固有缺陷的方法,使得使用松散耦合的组件难以实现软件系统?
【问题讨论】:
相关:softwareengineering.stackexchange.com/questions/168316/… 【参考方案1】:相反,健康的 MVC 使用应该鼓励 skinny 控制器和 fat 模型,以便模型(对象)是动作发生的地方(它本身鼓励封装和其他良好的 OOP 原则),控制器只是在那里将某些请求指向对象的正确方向。
【讨论】:
而且 OOD 不鼓励瘦和胖的课程。它鼓励在其一等公民(物体)之间分配重量(和食物)。【参考方案2】:MVC 中没有任何东西说Model
应该是愚蠢的(贫血模型)。我认为拥有丰富的Model
类是完全合适的,这样就不需要“经理”了。
话虽如此,目前流行的做法是使用ViewModel
s 将数据传递给View
。 ViewModel
基本上是您的Model
的投影,专为特定的View
量身定制。从View
的角度来看,可以算是Model
,一个有钱人Model
的门面;所以当然,Model
不仅仅是 ViewModel
。
【讨论】:
【参考方案3】:我不会将 MVC 称为与 OOD 一样痛苦的架构。 MVC 只是一种 OOD 模式,可以应用于某些设计。因此,它很简单并不能与 OOD 竞争,它只是构建好的或坏的 OOD 设计的工具之一。就像锤子无法与好的木材工艺竞争一样,锤子和 MVC 一样,只是工匠工具箱中的一个工具。
模式也不是促进糟糕设计的原因。因为良好的 OOD 设计将具有良好的关注点分离,所以 MVC 模式可以通过将表示关注点(视图)与应用程序逻辑(控制器)和更基本的域逻辑(模型)分离来为您提供这一点。因此,它是一种很好的 OO 模式,通常应用于用户界面。但在制作良好的 OOD 时,还可以考虑其他竞争模式。
【讨论】:
【参考方案4】:我们有两种形式的 MVC,Pull MVC 和 Push MVC(又名基于组件的 MVC 和 Legacy MVC)。
Push MVC 专注于概念分离,每个模型-视图-控制器集处理应用程序的某些方面,并且可以由一些单独的人设计和开发。当系统快速发展时,它工作得很好,添加功能也很容易。大型系统中的代码重用变得很糟糕。基本上只有模型被重用。
Pull MVC,专注于通过使用小部件(视图的组件)来重用代码,以便许多视图共享相同的代码并且只自定义它们的小部件。至于控制器,抽象和执行常见的控制器实践。
这是一个混合 Pull 和 Push MVC 的问题,具体取决于软件的性质和速度。
【讨论】:
非常有趣。就个人而言,我对是否将这两种形式的 MVC 描述为“推”或“拉”感到困惑,因为您所做的决定更多的是关于跨视图/模型边界的代码可重用性分布,而不是关于哪一边应用程序可以更好地控制执行流程。另一方面:这种在实施模型时仔细关注 OOD,同时快速将视图拼凑在一起的现象已成为常见做法。随着大部分应用程序智能转向客户端,我看到您所说的“拉动 MVC”正在获得动力。 我认为控制器应该是路由器。 routers 关键字用于 javascript mvc 框架,甚至 java spring 控制器都应该是路由器和数据绑定器。但是在传统的 MVC 风格中,集中式模型、集中式控制器和集中式视图在思考和编码期间切换上下文时查找起来很痛苦,而且浪费时间。我相信 MVC 的时代已经结束,基于组件/小部件的框架更受欢迎。以上是关于模型-视图-控制器是糟糕的面向对象设计吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
201771010123汪慧和《面向对象程序设计Java》第十四周实验总结
东文财 赵栋 罗松 201771010106《面向对象程序设计(java)》实验14
王之泰201771010131《面向对象程序设计(java)》第十四周学习总结
201771010124 王海珍 《面向对象设计 java》第十四周实验总结