【发布时间】: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 是抽象类,QuestionA、QuestionB 等是具体类)。每个Question 都有一组PossibleAnswers。
Design A 和Design B 在关联方面的区别在于,首先我认为CreateQuizController 将简单地将其必须的每项任务委托给QuizCatalog。如果QuizCatalog 需要做某事,它将把它可能需要的一切都委托给层次结构。这实际上很好,因为它似乎减少了耦合。
Design B,另一方面,遵循不同的理念。在Design A 中看到的关联仍然存在(因为QuizCatalog 仍然有Quizzes,QuestionPossibleAnswers 等)但现在我已经让CreateQuizController 基本上可以访问各种对象在它可能需要在此过程中创建的域中(我已经用d 发出了这种关联的信号)。这个想法是,不是要求QuizCatalog 创建一个Quiz,CreateQuizController 将自己创建一个Quiz(如果它需要为Quiz 创建问题,它会自己创建一个,同样发生在Question 的PossibleAnwsers 等)。
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