查看实例化另一个视图

时间:2013-03-07 20:14:48

标签: separation-of-concerns

我将我的代码与MVC(模型,视图和控制器)分开。

我们说我有两个视图类,一个是概念上的页面(包含许多项目),另一个只是一个小部件(如最近的新闻列表)。

以下是我看到的方式:

  1. 控制器实例化页面和窗口小部件类,然后将窗口小部件对象传递到页面中。如果页面有很多小部件,我必须弄清楚如何将其全部传递而不会让人感到困惑。

    class PageController {
        function foo() {
            Widget widget1 = new Widget();
            Widget widget2 = new Widget();
            Page page = new Page(widget1, widget2);
        }
    }
    
    class Page {
        function Page(Widget widget1, Widget widget2) {
            //do something with the widgets
        }
    }
    
  2. 页面实例化窗口小部件类。但是现在页面类引用了各种视图,而不是只要它具有适当的接口就可以放置视图。

    class PageController {
        function foo() {
            Page page = new Page();
        }
    }
    
    class Page {
        function Page() {
            Widget widget1 = new Widget();
            Widget widget2 = new Widget();
            //do something with the widgets
        }
    }
    
  3. 还有别的吗?

  4. 您的建议是什么?为什么?

    谢谢。

2 个答案:

答案 0 :(得分:1)

从概念上讲,#2对我来说最有意义。

如果一种类型的视图包含另一种视图,那么在视图之间进行耦合是完全正确的。例如,管理每个窗口小部件的位置,何时隐藏某些窗口小部件等应该是页面的工作。

但是,除非需要,否则页面不应关心与这些小部件有关的事件。如果一个小部件有一个按钮,它应该只回调一个控制器并跳过告诉页面...除非它导致小部件被调整大小并且页面需要以不同的方式进行布局。

希望这对你有用。

答案 1 :(得分:1)

我实际上在某种程度上支持方法1。我会说Page应该可以使用或不使用小部件进行实例化。在运行业务逻辑和规则时,您可以通过页面中的其他一些配置一次添加一个小部件集合和/或一个一个小部件。

这使您可以更灵活地修改页面结构。

小部件包含有关它们如何在页面布局中起作用及其呈现的信息。

Page只应负责从包含的小部件获取信息/指令并初始化/渲染它们。 这将允许更灵活和流畅的设计。