什么被认为是更好的设计在这里?

时间:2010-01-02 01:35:33

标签: design-patterns oop architecture

我希望这不是太主观。我无法决定这两种设计机会。

我有一个前置控制器模式。当用户浏览特定的URL时,我的框架会为此URL加载指定的View Controller。然后,View Controller会计算一些内容并加载视图模板,以显示结果。

现在想象你想创建一个像SO这样的网站。每个页面看起来非常相似:相同的标题,相同的菜单,相同的页脚。只是内容区域不同。您浏览“提问”页面,并希望“问新问题”表格出现在布局内。

因此,我们使用RootViewController模板制作RootView,以设置布局并为内容添加占位符。还有AskQuestionViewController AskQuestionView模板。

我们的Front Controller加载AskQuestionViewController类。系统调用loadView()方法,然后调用viewDidLoad()方法。

选项A:AskQuestionViewController继承自RootViewController

方法被系统调用,并首先调用parent::loadView()。因此RootViewController有机会创建其RootView模板。接下来,loadView()加载AskQuestionView模板,并将其分配给RootView模板的内容占位符。

选项B:AskQuestionViewController不会从RootViewController继承。

loadView() AskQuestionViewController方法首先加载RootViewController。然后,它会加载自己的AskQuestionView模板,并将其分配给RootView模板的内容占位符。

这些视图控制器之间的唯一区别是,它们加载了不同的视图模板,并且它们具有不同的自定义方法来执行某些任务。即RootViewController能够组成导航菜单并突出显示当前访问的内容。 RootViewController中没有其他内容可用于AskQuestionViewController

哪种选择更好的设计?

3 个答案:

答案 0 :(得分:5)

prefer composition over inheritance原则表明 B 更可取。

答案 1 :(得分:2)

AskQuestionViewController实际上不是RootViewController的专业化。所以,我肯定会说B.这两个控制器都可以从公共父类继承。

答案 2 :(得分:1)

这很难以一般的,独立于平台的方式回答,但我会选择B。