Cocoa Isn';可可MVC真的是MVP吗?

Cocoa Isn';可可MVC真的是MVP吗?,cocoa,model-view-controller,design-patterns,mvp,Cocoa,Model View Controller,Design Patterns,Mvp,再一次,一个与MVC相关的问题。几天前,我开始阅读苹果公司的《可可基础知识指南》,苹果公司在其中解释了MVC的实现 在MVC作为复合设计模式()一章中,他们比较了两个MVC版本: 旧的/传统的SmallTalk版本: 当前苹果定义的版本: 他们对当前模型的描述如下: 此复合设计模式中的控制器对象包含 中介模式和策略模式;它调解了流动 模型和视图对象之间双向的数据交换中的变化 模型状态通过控制器传达给视图对象 应用程序的对象 传统的模式看起来像MVC,没有错。但他们当前模式的名称让我感到困

再一次,一个与MVC相关的问题。几天前,我开始阅读苹果公司的《可可基础知识指南》,苹果公司在其中解释了MVC的实现

在MVC作为复合设计模式()一章中,他们比较了两个MVC版本:

  • 旧的/传统的SmallTalk版本:

  • 当前苹果定义的版本:

他们对当前模型的描述如下:

此复合设计模式中的控制器对象包含 中介模式和策略模式;它调解了流动 模型和视图对象之间双向的数据交换中的变化 模型状态通过控制器传达给视图对象 应用程序的对象

传统的模式看起来像MVC,没有错。但他们当前模式的名称让我感到困惑。据我所知,这可以被看作是显而易见的,因为控制器似乎总是在视图和模型之间进行调解


我是否完全错了,我是否误解了MVC或MVP?还是苹果只是对这种模式使用了错误的名称?更重要的是,为什么当前的模式被称为MVC?

你没有错,但苹果文档的作者也没有错

MVC的历史现在是漫长而复杂的——不仅仅是因为许多系统提倡三方分离,这实际上将控制器混入模型或将控制器混入视图。从很早的Smalltalk实现开始,很明显将模型信息排除在视图之外是一件非常好的事情,而且这相当容易做到

另一方面,将控制器和视图的职责清晰地分开要简单得多。许多视图需要重用,比如按钮或文本字段。他们控制器的可重用部分也希望被重用。但你不会按文本字段或加粗按钮;许多按钮行为都与视图紧密相关。同时,很难确定业务规则何时属于模型,何时属于控制器

此外,这篇(非常好的)苹果文档试图捕捉一种哲学的设计理念,而不是描述一种真实的方式。许多Cocoa控制器子系统看起来很像传统的MVC。传统的cocoa不再强调控制器,因此本文档实质上是在(可重用的)视图和(可能可重用的)模型之间为它们提供一个中介位置


许多Cocoa实现者更喜欢瘦控制器,本质上是作为立面来分离视图和模型。

因为MVP是MVC的一个子集,所以在MVC系统中发现它并不奇怪。是的,第二个图表说明了MVP模式

苹果称它为中介控制器,我综合说,它只是MVP的另一个名字

坦率地说,我不确定MVP这个词是否应该流行起来。这意味着这是一种完全不同的模式,演示者似乎专注于UI,而有时候它只是模型和控制器之间的关系。中介控制器非常简单地描述了这种区别


我必须查一下MVP,甚至知道你在问什么。1996年的一篇论文中使用了这个术语。当OSX发布时,它仍然是新的。

这要看情况而定。如果您的“视图”只是哑模板,而模型只是活动记录实例的集合,那么您拥有的甚至不是MVP。这只是Rails的复制品。回答得好。甚至可可的好部分也会越过这些界限。出于性能原因,NSImage封装了控制器行为,如故障和缓存,NSImageView可能会在不咨询中介控制器的情况下向图像请求调整大小的表示。另外,拥有NSImageView也是完全合理的,NSImageView是为特定模型类构建的视图。此外,Apple doc提到了Cocoa绑定,但表明它们是视图和模型之间的非中介连接。我通常认为绑定本身就是中介控制器,特别是考虑到消息流。回答不错。我认为这更多的是展示什么是好的实践,然后是定义一种精确且总是正确的设计方法。MVC并不局限于一个定义,而是展示了如何开发应用程序的灵活/抽象的概念。谢谢你抽出时间。