我获得了Quizz应用程序的用例。用例仅用于创建新测验。我无法确定哪种设计更好:
A)
alt text http://dl.dropbox.com/u/6187267/shooterpics/diagram1.jpg
b)中
alt text http://dl.dropbox.com/u/6187267/shooterpics/diagram2.jpg
虽然这可能看起来像一个域模型,但它实际上是一个类图(我懒得把方法/属性放在图中:()。
这一切背后的想法是我有QuizCatalog
Quiz
zes。每个Quiz
都有一组Question
s,必须通过QuestionFactory
创建(Question
是一个抽象类,QuestionA
,{{1等等是具体的类)。每个QuestionB
都有一组Question
。
PossibleAnswers
和Design A
之间关联方面的差异在于,我首先考虑Design B
只会将其所拥有的每项任务委托给CreateQuizController
。如果QuizCatalog
需要做某事,它将委托层次结构中可能需要的所有内容。这实际上很好,因为它似乎减少了耦合。
QuizCatalog
遵循不同的哲学。在Design B
中看到的关联仍然存在(因为Design A
仍然有QuizCatalog
zes,Quiz
Question
等等,但现在我已经{ {1}}基本上可以访问它可能需要在进程中创建的域中的每种对象(我已经用PossibleAnswer
表示了那种关联)。我们的想法是,不是要求CreateQuizController
创建d
,QuizCatalog
会自行创建Quiz
(如果需要为{{1}创建问题对于CreateQuizController
的{{1}} s等,它本身就会发生同样的事情。
Quiz
,有两件事让我烦恼:如果我需要在“放入系统”之前创建需要填充的临时对象(例如,Quiz
仅在Question
填充后才会实际添加到PossibleAnwser
想要Design A
s),按照这个设计,我必须把它们放在Quiz
以外的某个地方。
例如,当我第一次创建QuizCatalog
时,我可能必须将其保存在Question
下,而不将其实际添加到系统其余部分可访问的当前测验集合中。我发现这种行为有点尴尬。我发现将这些临时对象保存在Controller
中更好,好像发生了任何错误,然后“系统”保持原样,没有任何问题。
问题在于它使Quiz
必须知道几乎所有事情,这可能是不可取的。另一方面,QuizCatalog
中其他类的耦合程度没有区别。
如果我要使用Design A,我实际上并没有看到拥有CreateQuizController的重点,因为基本上所有事情都可以通过引用QuizCatalog来完成。在我看来,它只是将所有工作委托给QuizCatalog,那为什么要把它放在首位呢?
另外,使用Controller
,我可能会认为Controller
是一个单身人士,而如果使用System
我可能只有Design A
的构造函数接受而是QuestionFactory
的实例。
您对此有何看法?
由于
PS:只有在绘制图表后我才发现Quizz有2个z :(我的不好。
答案 0 :(得分:1)
从我认为的命名来看,CreateQuizController
的责任太多了。我假设(再次从它的名字),它可以创建测验和控制测验。如何将这个分为两个类,QuizFactory
和QuizController
?
因此,如果我们需要新的测验,我们会要求QuizFactory
创建一个新的测验,然后QuizFactory
会创建一个新的测验,使用QuestionFactory
创建问题和可能答案,我们会将新测验添加到(静态)QuizCatalog
。
如果我们想运行测验,我们会从目录中选择一个测验,创建QuizController
(使用此测验),QuizController
将启动测验,提出问题并保持分数。
QuizController
不需要知道问题,如果测验提供了getNextQuestion()
和getPreviousQuestion()
等方法以及验证候选人答案的方法就足够了(所以控制器只会知道实际问题。
从QuizController
到Quiz
的有一个关系就足够了。在我的设计中,QuizCatalog
将是(像)单身,因此是静态的或由另一个顶级类拥有,就像某些QuizManager
一样。