0

我正在分离类似于 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 回答 2

1

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

如果一种视图包含另一种视图,那么在视图之间进行耦合是非常好的。例如,管理每个小部件的放置位置、何时​​隐藏某些小部件等应该是页面的工作。

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

希望这对您有用。

于 2013-03-07T20:23:11.190 回答
1

实际上,我在某些方面支持方法 1。我会说 Page 应该能够在有或没有小部件的情况下进行实例化。当您运行业务逻辑和规则时,您可以通过页面中的其他一些规定添加一组小部件开始和/或一次添加一个。

这使您可以更灵活地随时修改页面的构造。

小部件包含有关它们如何运行以及它们在页面布局中的呈现方式的信息。

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

于 2013-03-07T20:33:00.627 回答