MVC是否仅适用于Web


14

每当我与开发人员谈论Model View Controller(MVC)时,它们几乎是瞬间的,他们说您向URL发出请求,服务器将建立一个实体(MODEL),并为您提供该模型的可视化表示。

  • 那么这是否意味着MVC 仅适用于Web,或者我是否正在和只是使用MVC编写Web应用程序的开发人员见面?

  • 桌面样式应用程序上有MVC的用法吗?

  • 我是范式的新手,我想知道MVC的任何超集


1
您是否在Programmers.SEStack Overflow 标签Wiki中检查了“ mvc”?
蚊蚋

3
@gnat是的,我做到了
Deeptechtons 2012年

6
好吧,您可能已经知道问题的答案了,不是吗?
t

4
@gnat认真不,我对MVC完全陌生(如上所述),并且从未听说过将MVC应用于Windows应用程序或使用了在下载页面上带有MVC徽章的应用程序(听说有些话)。抱歉,这个问题很愚蠢,但对我而言确实令人困惑
Deeptechtons 2012年

有很多很好的资源可用于学习MVC的历史,但是我经常会
KutuluMike 2012年

Answers:


22

MVC是一种模式。模式适用于所有编程。MVC恰好在Web上下文中运行良好。

正如gnat指出的那样,只需看一下mvc标签,您将看到其实现的多个示例。


5
这是关键。MVC在Web应用程序中确实运行良好,并且确实是现代基于MVC的框架(如Rails,Django和ASP.NET MVC)如此流行的很大一部分原因。它也可以在其他上下文中工作(例如桌面应用程序),但是很难保持视图和控制器的清晰分离,因此,删除了视图控制器分离的变量(例如Model-delegator(由Swing使用))或更改了拆分位置像Model-View-ViewModel(主要由.Net WPF应用程序使用)之类的方法在桌面应用程序中更为常见。
凯文·卡斯卡特

如果您查看有关控制器功能的原始Smalltalk描述-将用户输入转换为模型消息,则Windows本身基本上是一个大型控制器;这就是为什么将MVC作为模式无法与Windows UI应用程序很好地结合的原因。它在非Windows系统的UI框架中使用了更多内容。
KutuluMike 2012年

@MichaelEdenfield并非如此;您可以将MVC和WinForms一起使用,尽管MVP在那儿比较流行,但是MVP还是MVC的变体。
安迪

45

考虑到MVC是从1977年,和网络仅在1991年发明的,它应该是很明显的是MVC是不是只针对网页。


30
这是一个很好的答案,但口中有苦味。
Nicolas C.

2
正确狡猾。好东西!
汤姆·哈特芬

1
“ 1982年,Internet协议套件(TCP / IP)进行了标准化,并引入了称为互连网的完全互连TCP / IP网络的全球网络的概念。” 维基。如果您指的是netscape,那好吧...但是在那之前存在“网络”。
jmq 2012年

4
@jmquigley“ Internet”和“ Web”是两个非常不同的东西。
埃里克·金

1
@jmq 1977虽然仍然在1982年之前,但正如其他人指出的那样,Web!= Internet。网络在1991
Andy

9

否,针对OS X和iOS的开发使用“模型视图控制器”模式。


2
最后,对第一点和第二点的回答不加评论。
JeffO 2012年

8

在Microsoft环境中提出问题,许多人会假设您是说Asp.Net MVC,这是专门用于Web的MVC实现。

不幸的是,有许多人没有意识到这是MVC模式的实现,并认为它们是可互换的术语,从而导致了“仅Web”的假设。


3
+1这是在方法论之后命名平台的问题。当人们首先被介绍到平台时,他们看不到区别。
MattDavey 2012年

@Ozz这确实解释了为什么当MVC成为主题时,其他开发人员总是会谈论网络
Deeptechtons 2012年

1
请停止将Microsoft开发人员描绘成愚蠢的人,谢谢。
安迪

@Andy-那不是对MS开发人员的猛烈抨击,我本人也是Asp.Net MVC开发人员,我坚持最初的回答。我并不是说“所有”人员,也不是“所有” .net开发人员,只是对我见过许多人所做的假设或错误的观察。谢谢。
ozz 2014年

2

至少据我所知,MVC的第一个实现是在Smalltalk中。它肯定存在于Smalltalk-80中。尽管我没有任何方便的文档来证明它,但我相信到那时,它(或无论如何都非常相似)已经在Smalltalk中使用了几年。

大多数OO GUI框架至少包括MVC的某些变体。但是,我不确定在这种情况下“超集”到底是什么意思。很难说任何给定的变体是MVC的超集,子集还是对等体,但我倾向于考虑其中大多数对等体。

无论如何,其中许多(大多数?)已用于桌面开发,而不是Web开发。得益于AT&T的一些旧专利,大多数窗口系统都需要程序才能按需重新生成视图。这(几乎)迫使保持当前状态的代码(模型)与显示该状态的代码(视图)之间至少有一定程度的分离。在1)控制器功能的隔离程度以及2)在每个主要部分之间绘制线条的确切细节方面,这仍然留有很大的变化空间。



1

因此,在该区域中有很多不同的设计模式。

  • 模型视图演示者(mvp)
  • 模型视图视图演示者(mvvp)
  • 模型视图控制器
  • 模型2

等等。多年来,这些技术已经交织在一起,融合在一起,进行了更改,并在各种情况下得到了应用。这里重要的一点是,1977年以来的MVC设计模式已经发生了很大的变化,不再是服务器端Web框架使用的设计模式。例如,在原始的Smalltalk实现中,模型将观察视图的变化,而不再是这种情况,因为服务器端根本无法在用户浏览器中观察html元素。相反,如果视图更改,则视图将向控制器发送请求,然后控制器将更新视图。再次遵循原始MVC实现,因为对模型的更新将暗示依赖于该模型的所有视图都将被更新。

现代Web框架遵循简单的三层体系结构,也称为Model 2体系结构。

Web上当然有真实的MVC架构的示例,但是它们通常仅是客户端,连接到遵循Model 2架构的服务器,因为视图是xml和json,并且没有观察到更改。客户端纯mvc架构的示例是Sencha Touch和Sproutcore。

如果在浏览器中具有MVC,在服务器上具有mvc,在数据层中具有mvc,则您具有分层mvc实现。

注意。我只讲过Web框架,MVC的其他实现(例如java swing和Flex)还有其他实现差异。


人们为什么不赞成别人,这肯定是没有道理的,如果有什么问题,请告诉他们并给他们机会以纠正他们的观点。如果他们对这门学科一无所知,那么好老师会引导他们找到正确的来源,直到他学对了,才打败他!
Deeptechtons 2012年

该问题假定mvc和web可以很好地协同工作,并支持非web mvc,因此当您仅在Web上下文中提供mvc的示例时:-1
hildred

1

您必须知道的一件事是,与声称实现MVC的框架一样,MVC的形式也很多。

大多数人都同意模型拥有某种状态,而视图则呈现了这一事实。但是Controller的角色非常不同。

在Smalltalk最初描述的地方,模型是应用程序,数据和业务方法的核心。视图是应用程序状态(即模型)状态的图形表示,控制器负责管理用户输入,鼠标和键盘事件。例如,Controller将键盘事件路由到具有焦点的view元素。

在.jsp页面中,模型主要是数据,视图将模型呈现为HTML,而控制器将模型路由到适当的视图以进行呈现。

因此,为回答您的问题,虽然MVC同时用于独立应用程序(Java,.Net,Flex)和Web(jsp页面),但这是完全不同的事情。这意味着您知道的MVC不会在独立应用程序中使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.