注意:我指的是 MVC,因为它适用于 Web 应用程序。MVC 可以应用于多种应用程序,并且它以多种方式实现,因此很难说 MVC 做了或不做任何特定的事情,除非你严格地谈论由模式定义的东西,而不是特定的实现.
我认为您对“封装”是什么有一个非常具体的看法,这种看法不符合教科书对封装的定义,也不符合它的常见用法。我找不到“封装”的定义,它要求没有设置器。事实上,由于 Setter 本身就是用于“编辑”对象的方法,所以这是一种愚蠢的论点。
从维基百科条目(注意它说“像 getter 和 setter”):
一般来说,封装是OOP(面向对象编程)的四大基础之一。封装就是把变量或者东西隐藏在一个类里面,防止未经授权的人使用。因此 getter 和 setter 等公共方法访问它,其他类调用这些方法进行访问。
http://en.wikipedia.org/wiki/Encapsulation_(面向对象编程)
现在,这并不是说 MVC 不会破坏封装,我只是说您对封装的概念非常具体,而不是特别规范。
当然,使用 Getter 和 Setter 可能会导致许多问题,例如返回列表,然后您可以直接在对象本身之外更改这些列表。您必须小心(如果您关心)隐藏您的数据。您还可以将一个集合替换为另一个集合,这可能不是您想要的。
得墨忒耳法则在这里比其他任何东西都更重要。
但无论如何,所有这一切实际上只是一个红鲱鱼。MVC 只讲 GUI,GUI 应该尽可能简单。它在视图或控制器中应该几乎没有逻辑。您应该使用简单的视图模型将您的表单数据反序列化为一个简单的结构,该结构可用于您喜欢的任何业务架构(如果您不想要设置器,则使用不需要的对象创建业务层使用 setter 并使用 mutattors。)。
UI 层几乎不需要复杂的架构。UI 层更像是一个边界和网关,它将 HTTP 的平面形式和命令性质转换为您选择的任何业务对象模型。因此,在 UI 级别不会是纯粹的 OO,因为 HTTP 不是。
这称为阻抗不匹配,通常与 ORM 相关联,因为对象模型不容易映射到关系模型。HTTP 到业务对象也是如此。在这方面,您可以将 MVC 视为 ORM 的必然结果。