2010-09-14 156 views
1

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

我有3个班;

多边形 - 这可以保存诸如边数等信息。这是我的模型类

控制器 - 这种响应之类的东西在视图按钮按下,然后卡列斯在模型的方法来增加或减少边数等,这是我的控制器(惊喜!)

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

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

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

2)在视图中有一个重绘(...)方法,该方法以接收到的新信息为参数。这看起来很干净,但我认为不会很好地扩展。

任何建议将是伟大的。正如我通常说的,我会做选择一,但会爱一个人告诉我的东西,以改善我的想法这种方式....

谢谢!

回答

2

这里最基本的是联轴器。如果太紧,设计会受到影响,你会重复自己,代码将难以维护。如果它太松,就会让简单的事情难以管理。如果你想根据某个模型绘制一个简单的多边形,你应该有这个模型,因为把所有的顶点通过一个控制器是疯狂的。毕竟,视图是专门为显示多边形而编写的,因此拥有指向其表示的指针是非常自然的。

什么意见不是关心的是上下文,显示对象的“生活故事”。它可能来自网络,它可能会很快发生变化,点击它可能会变大一倍。该视图不关心。如果点击它,视图可以将事件报告给控制器,而不再关心它。如果对象改变,控制器会告诉视图更新。

我不认为设计这种关系有一个硬性规则,但重点很简单:保持松散耦合而不会过多地泄露细节。它经常帮助我思考测试和变化。我可以隔离模型进行测试吗?我可以使用完全不同的视图而不更改其他部分吗?我可以根据相同的模型编写不同的用户界面吗?如何处理不同的“皮肤”?我需要重写多少?

0

你的看法应该只是展现视图。所以如果你需要在视图中显示更新的信息,你可以从缓存中进行操作(这在这里并不适用,但是我把它抛出去了,因为它最近一直在用网页来做很多事情),或者您重新使用控制器并让控制器再次使用有关该模型的更新数据调用视图。

所以在技术上,你的第二个选择是更正确的。该视图应该通过调用控制器并询问更新的信息来重新绘制自己。

0

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

因此,模型就像一个数据文员。管理员应该像办公室的管理员或组长。这个观点应该像是一个读新闻记者的读者。

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

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