【问题标题】:MVC best practice questionMVC 最佳实践问题
【发布时间】:2010-09-14 15:31:46
【问题描述】:

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

我有 3 节课;

多边形 - 它包含边数等信息。这是我的模型课

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

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

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

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

2) 在视图中有一个 redraw(...) 方法,它将接收到的任何新信息作为其参数。这看起来很干净,但我认为不会很好地扩展。

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

谢谢!

【问题讨论】:

    标签: model-view-controller


    【解决方案1】:

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

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

    我认为设计这种关系没有硬性规定,但要点很简单:保持松散耦合,不要过多关注细节。它经常帮助我思考测试和改变。我可以隔离模型进行测试吗?我可以在不改变其他部分的情况下使用完全不同的视图吗?我可以基于相同的模型编写不同的用户界面吗?不同的“皮肤”怎么样?我需要重写多少?

    【讨论】:

      【解决方案2】:

      您的视图应该只显示视图。因此,如果您需要在视图中显示更新的信息,您可以从缓存中执行此操作(这在这里并不适用,但我将其丢弃,因为它是我最近对网络内容所做的很多事情),或者您重新使用控制器并让控制器再次使用有关模型的更新数据调用视图。

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

      【讨论】:

        【解决方案3】:

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

        因此,模型就像一个数据文员。控制器应该像办公室的管理员或团队负责人。并且视图应该像新闻记者阅读提词提示阅读器。

        控制器可以指挥每个人,控制输入的数据和提词器上的文本 - 并将实际工作外包给模型(用于数据)和视图(用于显示)。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多