1

尽管我在网上阅读了很多论文和信息,但我还是 MVC 的新手。我知道这有点模棱两可,对 MVC 模式有很多不同的解释。但差异似乎有点小

我的主要问题是 - 是否总是需要 M、V 和 C 才能正确执行此操作?我没有看到任何人在我读过的任何东西中解决这个问题。示例(我在 Cocoa/Obj-c 中工作,尽管这无关紧要)..

1) 如果我的 GUI 上有一个简单的图像,或者只是为了用户方便而没有保存或修改的文本输入字段,那么这两个都是 V(视图)但没有 M(没有数据也没有域处理正在进行),并且没有 C 来桥接它们。所以我只有一些方面是“V” - 看起来不错

2)我有 2 个不同且可见的窗口,每个窗口上都有一个标记为“ACTIVATE FOO”的按钮 - 当用户单击任一按钮时,两个按钮都按下并更改为“DEACTIVATE FOO”,并出现第三个窗口标签“FOO”。再次单击该按钮会将两个窗口上的按钮更改为“ACTIVATE FOO”,并将删除第三个“FOO”窗口。在这种情况下,我的 V 由两个窗口上的按钮组成,我猜也是第三个窗口(可能所有 3 个窗口)。我肯定有一个 C,我的 Controller 对象将知道这些按钮和窗口,并将获得它们的点击并保持有关窗口和按钮的通用状态。但是,无论我有 1 个按钮还是 10 个按钮,我的窗口被称为“FOO”或我的窗口被称为“BAR”,这无关紧要。这里没有领域知识或数据——只是对视图的控制。所以在这个例子中,我真的有“V”和“C”,但没有“M”——可以吗?

3)最后一个例子,我跑得最多。我有一个文本输入字段作为我的视图。当我在其中输入文本时,比如说一个代表重力的数字,我将它保存在一个模型中,该模型可能会在考虑我的重力参数的同时执行诸如计算球的物理等事情。这里我有一个 V 和一个 M,但我不明白为什么我需要添加一个 C - 控制器只会接受来自视图的信号并将其传递给模型,反之亦然。因为 C 只是一个纯粹的传递,它真的是“垃圾”代码,在我看来并没有让事情变得更加可重用。在大多数情况下,当某些事情发生变化时,我需要以几乎相同的方式更改 C 和 M。我意识到认为大多数情况只需要 V 和 M.. 引导我进入下一个主题可能是 MVC 初学者的错误

4) 在 Cocoa / Xcode / IB 中,我猜我的 Controller 应该始终是 IB 中的实例化对象?也就是说,我在 IB 中放置了所有“V”组件,并且对于每个 View 对象(相关的事物)集合,我应该有一个实例化的 Controller?然后也许我的模型不应该在 IB 中找到,而只能作为 Xcode 中的类找到,这些类与在那里找到的控制器代码相关联。这是准确的吗?这可以解释为什么你会有一个没有真正增加价值的控制器 - 因为你保持一致..

5)如何命名这些东西 - 对于我上面关于 FOO / BAR 的示例,可能以 Controller 结尾的东西是 C,如 FancyWindowOpeningController 等?对于模型 - 我应该给它们加上 GravityBallPhysicsModel 等后缀,还是应该只命名我喜欢的那些?我没有看到足够多的代码来知道野外有什么,我想尽早走上正确的轨道

提前感谢您让我直截了当或让我知道我走在正确的轨道上。我觉得我开始明白了,我在这里所说的大部分内容都是有道理的,但验证我的猜测会帮助我感到自信。

4

1 回答 1

4

我认为您的所有示例都将单个操作/功能与整体应用程序设计混淆了。因此,您所有问题的一般答案是,不,应用程序的每个操作或功能都不必使用所有三个 MVC 组件。

MVC 设计的真正目标是最大限度地使每个组件模块化和独立。因此,要求每个组件的每个操作都涉及所有三个 MVC 组件将首先违背设计模式的目的。

模型和视图应该被设计成原则上它们可以在没有另一个的情况下工作。无论数据显示在窗口、webviews、文件、打印还是命令行中,模型都应该工作。视图应该能够显示自己的空版本。只有控制器必须同时了解模型对象和视图对象,但这是因为控制器的全部目的是将两者联系起来。

你的问题:

(1) 如果UI元素不需要引用直接视图之外的任何东西,那么控制UI元素的逻辑就属于视图。当您可以将视图移动到具有不同模型和不同控制器的另一个项目并且它仍然可以工作时,您就知道视图已正确封装。

(2) 在这种情况下,您不需要模型,因为您没有对任何东西进行建模。模型是一些物理对象或动作的数据表示。如果窗口和控件不显示代表性数据,则它们不需要模型。他们只是在画自己。

(3) 您需要一个控制器,这样您就不必在每次更改另一个时都重写模型或视图。这在小型项目中并不明显,但是一旦您获得一个具有多个不同界面(UI、网络、磁盘操作等)以及在每个界面中表示的多种不同方式的项目,那么将视图与模型联系起来会很快中断。

(4) 如果您没有控制器,那么您的模型必须引用每个视图。nib 系统使用控制器作为管理 nib 中其他对象的对象。您必须有一个分层对象并且文件所有者履行该角色。

(5) 名称越长越好。六个月后,当您回来进行维护时,您将不记得打开了哪个窗口“WindowOpeningController”或者它有什么特别之处(如果有的话)。

欣赏 MVC 的最佳方式是退后一步,思考真正庞大、非常复杂、不断发展的应用程序。然后在不同的应用程序中添加重用组件。然后添加调试每个组件。很快就会清楚为什么它是伟大的设计模式。

于 2010-06-14T19:06:42.877 回答