MVC最佳实践问题

时间:2010-09-14 15:31:46

标签: model-view-controller

我有一个关于MVC设计的问题,基于斯坦福iPhone的讲座。

我有3个班级;

多边形 - 它包含诸如边数等信息。这是我的Model类

控制器 - 这会响应按钮按下视图中的按钮,然后调用模型中的方法来增加和减少边数等。这是我的控制器(惊喜!)

查看 - 对于这个问题,视图将是一个表示单个视图的类,它将多边形绘制到屏幕上。

我的问题是View类获取有关Polygon模型类的信息的最佳方法是什么?虽然这对于这个例子来说是微不足道的,但我希望在构建更复杂的应用程序时,答案对我有帮助。我有的选择;

1)将Polygon类的实例传递给View,以便视图有一个指向它的指针。然后我可以随时调用刷新,视图将知道该怎么做。这就是我通常会做的事情,但是因为View和Model似乎绕过控制器而破坏了MVC方法,这让我觉得这可能不是最好的方法。

2)在视图中有一个重绘(...)方法,无论收到什么新信息,都将其作为args。这看起来很干净,但我认为不会很好地扩展。

任何建议都会很棒。正如我经常说的那样,我会做一个选项,但是会喜欢有人告诉我一些事情来改善我对此的看法....

谢谢!

3 个答案:

答案 0 :(得分:2)

这里必不可少的是耦合。如果它太紧,设计会受到影响,你会重复自己,代码将难以维护。如果它太松散,那么简单的事情就太难管理了。如果你想根据某个模型绘制一个简单的多边形,你应该掌握模型,因为通过控制器拉出所有顶点会很疯狂。毕竟,视图专门用于显示多边形,因此指向其表示形式是完全自然的。

关心的视图是上下文,即所显示对象的“生活故事”。它可能来自网络,它可能很快就会改变,当你点击它时可能会变成两倍大。视图并不在乎。如果单击它,视图可以将事件报告回控制器,并且不再关心它。如果对象发生更改,控制器将告知视图更新。

我不认为设计这种关系有一个硬性规则,但重点很简单:保持松耦合而不会过多地冒汗。通常可以帮助我考虑测试和更改。我可以隔离模型进行测试吗?我可以在不更改其他部分的情况下使用完全不同的视图吗?我可以根据相同的型号编写不同的用户界面吗?不同的“皮肤”怎么样?我需要重写多少?

答案 1 :(得分:0)

你的观点除了展示视图外什么都不做。因此,如果您需要在视图中显示更新的信息,您可以从缓存中执行此操作(这在这里并不适用,但我将其丢弃,因为我最近在网络上做了很多事情),或者您重新启动控制器并让控制器再次使用有关模型的更新数据调用视图。

从技术上讲,你的第二个选择是更正确的选择。视图应该通过调用控制器并要求它获取更新信息来重绘自己。

答案 2 :(得分:0)

模型是数据。控制器是逻辑。视图显示。

因此,模型就像数据职员。控制器应该像办公室的管理员或团队负责人。这个观点应该像一个新闻记者阅读一个提示读者。

控制器可以控制所有人,并控制输入的数据和提词器上的文本 - 并将实际工作外包给模型(用于数据)和查看(用于显示)。

因此,回答你的问题。该视图应该echo $this->view->myPentagon->someAttribute。控制器从模型中获取myPentagon对象,并将其分配给视图对象。该模型处理数据结构和数据库API。视图处理显示。控制器告诉视图何时显示。