我将我的代码与MVC(模型,视图和控制器)分开。
我们说我有两个视图类,一个是概念上的页面(包含许多项目),另一个只是一个小部件(如最近的新闻列表)。
以下是我看到的方式:
控制器实例化页面和窗口小部件类,然后将窗口小部件对象传递到页面中。如果页面有很多小部件,我必须弄清楚如何将其全部传递而不会让人感到困惑。
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
}
}
页面实例化窗口小部件类。但是现在页面类引用了各种视图,而不是只要它具有适当的接口就可以放置视图。
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
}
}
还有别的吗?
您的建议是什么?为什么?
谢谢。
答案 0 :(得分:1)
从概念上讲,#2对我来说最有意义。
如果一种类型的视图包含另一种视图,那么在视图之间进行耦合是完全正确的。例如,管理每个窗口小部件的位置,何时隐藏某些窗口小部件等应该是页面的工作。
但是,除非需要,否则页面不应关心与这些小部件有关的事件。如果一个小部件有一个按钮,它应该只回调一个控制器并跳过告诉页面...除非它导致小部件被调整大小并且页面需要以不同的方式进行布局。
希望这对你有用。
答案 1 :(得分:1)
我实际上在某种程度上支持方法1。我会说Page应该可以使用或不使用小部件进行实例化。在运行业务逻辑和规则时,您可以通过页面中的其他一些配置一次添加一个小部件集合和/或一个一个小部件。
这使您可以更灵活地修改页面结构。
小部件包含有关它们如何在页面布局中起作用及其呈现的信息。
Page只应负责从包含的小部件获取信息/指令并初始化/渲染它们。 这将允许更灵活和流畅的设计。