【问题标题】:Question about use of Controllers关于使用控制器的问题
【发布时间】:2011-03-11 18:19:17
【问题描述】:

我收到了一个测验应用程序的用例。用例仅用于创建新测验。我无法决定哪种设计更好:

一)

alt text http://dl.dropbox.com/u/6187267/shooterpics/diagram1.jpg

b)

alt text http://dl.dropbox.com/u/6187267/shooterpics/diagram2.jpg

虽然这可能看起来像一个领域模型,但它实际上是一个类图(我懒得把方法/属性放在图中:()。

这一切背后的想法是我有一个QuizCatalog,它有Quizzes。每个Quiz 都有一组Questions,必须通过QuestionFactory 创建(Question 是抽象类,QuestionAQuestionB 等是具体类)。每个Question 都有一组PossibleAnswers

Design ADesign B 在关联方面的区别在于,首先我认为CreateQuizController 将简单地将其必须的每项任务委托给QuizCatalog。如果QuizCatalog 需要做某事,它将把它可能需要的一切都委托给层次结构。这实际上很好,因为它似乎减少了耦合。

Design B,另一方面,遵循不同的理念。在Design A 中看到的关联仍然存在(因为QuizCatalog 仍然有Quizzes,QuestionPossibleAnswers 等)但现在我已经让CreateQuizController 基本上可以访问各种对象在它可能需要在此过程中创建的域中(我已经用d 发出了这种关联的信号)。这个想法是,不是要求QuizCatalog 创建一个QuizCreateQuizController 将自己创建一个Quiz(如果它需要为Quiz 创建问题,它会自己创建一个,同样发生在QuestionPossibleAnwsers 等)。

Design A 有两件事困扰我:

1.

如果我需要创建需要在放入“系统”之前填充的临时对象(例如,Quiz 仅在填充了所有想要的 @987654356 后才实际添加到 QuizCatalog @s),按照这个设计,我必须将它们保存在 Controller 以外的其他地方。

例如,当我第一次创建Quiz 时,我可能不得不将它保存在QuizCatalog 下,而不是将其实际添加到系统其余部分可以访问的当前测验集合中。我觉得这种行为有点尴尬。我发现将这些临时对象保存在Controller 中会更好,如果发生任何错误,那么“系统”会保持原样,不会出现任何相关问题。

问题在于它使Controller 必须了解几乎所有内容,这可能是不可取的。另一方面,System 中其他类的耦合程度没有区别。

2.

如果我打算使用设计 A,我实际上并没有看到拥有 CreateQuizController 的意义重大,因为基本上所有事情都可以通过引用 QuizCatalog 来完成。在我看来,它只是将其所有工作委托给 QuizCatalog,那么为什么首先要有它呢?

另外,使用Design A,我可能会认为QuestionFactory 是一个单例,而如果使用Design B,我可能只是让CreateQuizController 的构造函数接受QuestionFactory 的实例.


您对此有何看法?

谢谢

PS: 画完图后我才注意到 Quizz 有 2 个 z :( 我的错。

【问题讨论】:

  • 测验肯定只有一个“z”:P 虽然“测验”有两个。英语可能很奇怪......
  • 它在运行时是如何工作的?我们可以考虑如何使用这个库。也许序列图可以帮助你。

标签: c# java model-view-controller oop uml


【解决方案1】:

从命名上我觉得CreateQuizController 的职责太多了。我假设(再次从它的名字),它可以创建测验和控制测验。将其分为两个类,QuizFactoryQuizController,怎么样?

因此,如果我们需要一个新测验,我们要求QuizFactory 创建一个新测验,然后QuizFactory 将创建一个新测验,使用QuestionFactory 创建问题和可能的答案,我们将添加对(静态)QuizCatalog 的新测验。

如果我们想要运行一个测验,我们会从目录中选择一个测验,创建一个QuizController(带有这个测验),然后QuizController 将开始测验,呈现问题并保留分数。

QuizController 不需要知道这些问题,如果测验提供像 getNextQuestion()getPreviousQuestion() 这样的方法以及验证候选人答案的方法(这样控制器就会知道实际问题)就足够了仅)。

所以从QuizControllerQuizhas-a 关系就足够了。在我的设计中,QuizCatalog 将是(就像)一个单例,因此是静态的或由另一个顶级类拥有,比如一些 QuizManager

【讨论】:

  • 实际上的想法是 CreateQuizController 只会创建测验(以后不应该管理它们)。这个名字来源于它是一个控制器(在某种意义上它是“上层”),而不是因为它稍后会管理测验。
  • 所以我的问题是,我应该如何让(你的)QuizFactory 工作?它应该知道域中的所有对象并创建它们,还是应该将这种工作委托给测验目录?编辑:我看到你更喜欢第一个(通过工厂)。嗯
  • 现在我想起来了,我认为我们这里实际上拥有的是一种建造者模式,因为我要创建测验,我还必须创建所有问题,并且对于每个问题的问题,所有可能的答案。我说得通吗?
  • 听起来不错 - 只需查看维基百科 (en.wikipedia.org/wiki/Builder_pattern#Java) 上的比萨饼示例,它可能是您的 quiz creation 部分的匹配项或至少一个基础设计。引入 QuizBuilder 值得一试!
  • 我只是为测验实现一种注册表,只是基本的获取、添加和删除操作。也许一些簿记(最后一次使用,使用了多少次,平均分数,......)。但创建测验不是注册机构的责任。最多它可以拥有一个(一组)测验工厂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
相关资源
最近更新 更多