FAQ-如何理解 MVC 中的 Model?

现在还是学生,没有啥大型项目的开发经验。之前在一些网络公司实习的时候也做过一些开发,基本上都是用个MVC框架做Web开发。 按照我的理解,Model应…
关注者
194
被浏览
61,377
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏
按照我的理解,Model应该是用来传递数据的一种封装,但是这种封装在一些脚本语言中基本上体现不出来,感觉在Python等脚本语言中Model已经 被充分弱化了(以前做Java EE开发的时候好歹还会有一些Model对象),有时一个数组一个字典就能实现所谓的封装。

你理解错了,把几个模式、概念搞混了。

用来“传递数据”的封装对应的架构(设计)模式是 Value Object,它的作用是在软件架构的各个层次(如 Model、View)之间传递数据,例如你说的用一个数组或一个字典,在 JEE 里常用的是 Java Bean。

而 MVC 是另一种常见的架构模式,这里的模型(Model)或 Model Object 通常指的是应用逻辑层(也叫领域层)的对象,如 Account、Order 等等。这些对象是你开发的应用程序中的一些核心对象,负责应用的逻辑计算,有许多与业务逻辑有关的方法或操作(如 Account.sendEmail()、Order.calculateTotal()、Order.removeItem() 等等),而不是仅仅像 Value Object 那样用来传递数据(getter、setter)。

现在我的开发中,Controller中充斥着各种业务逻辑,然后用Dict这样的数据类型随手封装一个Model,再把这个Model送到模板系统 View中。。感觉在这样的操作之下,Model已经被弱化得不像是一个单独的模块了,感觉我现在把MVC框架已经用成了VC框架了,所以现在很困惑 Model到底体现在什么地方……

从一开始你对 MVC 以及 Model 对象的理解就是错误的。

为什么要在 Controller 中放各种业务逻辑?业务逻辑这原本就不是 Controller 的职责。应该把这些业务逻辑抽取出来,放到合适的各个 Model 对象中。

几个可能的主要错误:

1、把业务逻辑放在 MVC 的 Controller 中,这种设计是不合理的。

MVC 中的 Controller(也叫 View Controller,视图控制者)的主要职责是管理和处理用户的输入,并根据用户在 View 上的输入、系统当前状态和任务的性质,挑选后台合适的一些 Model 对象(也叫领域对象 Domain Object)来处理相应的业务逻辑,并把经处理后的用户输入请求等信息传递给 Model 对象。View Controller 本身不应该负责一个应用程序中业务逻辑的计算。

2、把 Model Object 混同于 Value Object,从而得出 Model 没什么用的误解。

3、混淆了 MVC 中的 View Controller 与整个应用的集中控制者 Application Controller。

混淆视图控制器与应用控制器这两种控制器,是许多初学者在学习 MVC、OOAD 、软件架构设计时常见的一个误解。