【问题标题】:What's considered to be better design here?这里什么被认为是更好的设计?
【发布时间】:2010-01-02 01:35:32
【问题描述】:

我希望这不是太主观。我无法在这两个设计机会之间做出决定。

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

现在假设您想创建一个类似 SO 的网站。每个页面看起来都非常相似:相同的页眉、相同的菜单、相同的页脚。只是内容领域不同。您浏览到“”页面,并希望“提出新问题”表单出现在布局中。

所以我们用RootView 模板制作了一个RootViewController,该模板设置了布局并有一个内容占位符。还有一个带有AskQuestionView 模板的AskQuestionViewController

我们的前端控制器加载AskQuestionViewController 类。系统调用loadView()方法,然后调用viewDidLoad()方法。

选项 A:AskQuestionViewController 继承自 RootViewController

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

选项 B:AskQuestionViewController 不继承自 RootViewController

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

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

哪个选项会更好设计?

【问题讨论】:

    标签: design-patterns oop architecture


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      AskQuestionViewController 并不是RootViewController 的真正特化。所以,我肯定会说 B。两个控制器都从一个公共父类继承可能是有意义的。

      【讨论】:

      • 确实每个 View Controller 都有一个抽象的 ViewController 父类 :-)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2012-01-02
        • 2019-10-01
        • 1970-01-01
        相关资源
        最近更新 更多