MVC设计模式中的控制器

3

我想问一下,在MVC中为什么需要控制器,为什么不能直接连接模型和视图。如果没有控制器会有什么问题?

4个回答

4
Separation of concerns,它使程序更易维护,并允许我们在不破坏其他部分的情况下向系统的不同部分添加更多功能,因为它们是相互独立的...如果你的代码领域和如何将其提供给视图的逻辑以及处理屏幕上数据呈现的代码都在一个地方,那么很难改变领域代码的某些部分而不必改变将其移动到视图的逻辑的某些部分以及随后呈现它的代码...使用控制器,我们可以将逻辑移动到另一个类中,并使其与视图无关,因此当我们修复或修改应用程序时,我们只需要关注MVC模型的一个部分... https://en.wikipedia.org/wiki/Separation_of_concerns

但在另一种情况下有什么缺点呢? - sadia zar
因此,如果您的域代码和应该如何在视图中呈现数据的逻辑以及处理屏幕上数据呈现的代码都在同一个位置,那么当您需要更改域代码的某些部分时,不得不更改将其移动到视图的逻辑的某些部分以及然后呈现它的代码会变得非常困难。有了控制器,我们可以将逻辑移到另一个类中,并使其独立于视图,因此在修复或修改我们的应用程序时,我们只需要关注MVC模型的一部分... - matt_roo
@SadiaZar 如果有人的回答对你有帮助,你应该接受他们的答案 :) - matt_roo
其实我了解三层架构的概念,也理解你所说的,但是因为这个“为什么”,我有些困惑 :/ - sadia zar
另一种情况的缺点是您无法轻松测试和更换视图。在我看来,@matt_roo的答案过于简单化,没有涉及到您提出的问题的核心。我建议您先做一些背景阅读,从这里开始:http://martinfowler.com/eaaDev/SeparatedPresentation.html - David Osborne

1

MVC是一种软件架构设计模式,通过将代码分离,使其更易读、易维护和易移植。

如果删除控制器,将会有许多缺点。包括但不限于:

您的代码结构将不像MVC中那样清晰。因此,更多的代码将存在于模型中。这样更难以阅读和维护。

代码将失去部分可移植性,例如,您的模型(数据库,文件,数据等)需要包含视图函数、调用和委托等。因此,如果您想要使用相同的模型与不同的UI框架,您需要重写或编辑它。就像将应用从Mac OS X移植到iOS一样。

...

控制器像胶水一样,将模型和视图粘在一起。


有人认为将功能分解为许多松散耦合的组件会使其更难以阅读和维护。 - David Osborne
@DavidOsborne 只有在项目非常非常小的情况下才可以这样做。在大型项目中,您无法将所有功能放在一个地方。即使在相当小的项目中这样做,也会使其在未来无法扩展。还要考虑到除您之外的其他人可能希望在未来阅读或维护您的项目。 - Abcd Efg

1
一个主要的“驱动力”是可测试性,这就是为什么会出现分离的演示模式。控制器允许测试演示逻辑。

1

控制器是连接“模型”和“视图”的地方。它们属于两个不同的领域、两种不同的语言;视图使用“字符串语言”来表达,而应用程序使用另一种语言(例如Java语言)。

至少需要以下几个功能:

  • 将视图参数转换为语言对象,例如数字、日期等。用户输入的是字符串。
  • 验证视图参数;它们来自用户,可能存在格式问题或恶意行为。
  • 创建模型对象(或直接访问数据库)。
  • 在出现问题时进行错误报告。
  • 更新视图以表示模型的新状态。

可以隐藏/自动化控制器的某些工作部分;例如声明式验证、从请求中自动创建模型对象,将模型对象绑定到视图层(例如JavaBeans)。

但这并不能替代控制器本身;
控制器不仅仅指我们编写的代码,它还是把一些职责分配到的“逻辑位置”。即使看不见,对于习惯于MVC思想的人来说,它仍然存在。


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