关于使用控制器的问题

时间:2010-07-05 03:16:57

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

我获得了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

PossibleAnswersDesign A之间关联方面的差异在于,我首先考虑Design B只会将其所拥有的每项任务委托给CreateQuizController。如果QuizCatalog需要做某事,它将委托层次结构中可能需要的所有内容。这实际上很好,因为它似乎减少了耦合。

另一方面,

QuizCatalog遵循不同的哲学。在Design B中看到的关联仍然存在(因为Design A仍然有QuizCatalog zes,Quiz Question等等,但现在我已经{ {1}}基本上可以访问它可能需要在进程中创建的域中的每种对象(我已经用PossibleAnswer表示了那种关联)。我们的想法是,不是要求CreateQuizController创建dQuizCatalog会自行创建Quiz(如果需要为{{1}创建问题对于CreateQuizController的{​​{1}} s等,它本身就会发生同样的事情。

关于Quiz,有两件事让我烦恼:

1

如果我需要在“放入系统”之前创建需要填充的临时对象(例如,Quiz仅在Question填充后才会实际添加到PossibleAnwser想要Design A s),按照这个设计,我必须把它们放在Quiz以外的某个地方。

例如,当我第一次创建QuizCatalog时,我可能必须将其保存在Question下,而不将其实际添加到系统其余部分可访问的当前测验集合中。我发现这种行为有点尴尬。我发现将这些临时对象保存在Controller中更好,好像发生了任何错误,然后“系统”保持原样,没有任何问题。

问题在于它使Quiz必须知道几乎所有事情,这可能是不可取的。另一方面,QuizCatalog中其他类的耦合程度没有区别。

2

如果我要使用Design A,我实际上并没有看到拥有CreateQuizController的重点,因为基本上所有事情都可以通过引用QuizCatalog来完成。在我看来,它只是将所有工作委托给QuizCatalog,那为什么要把它放在首位呢?

另外,使用Controller,我可能会认为Controller是一个单身人士,而如果使用System我可能只有Design A的构造函数接受而是QuestionFactory的实例。


您对此有何看法?

由于

PS:只有在绘制图表后我才发现Quizz有2个z :(我的不好。

1 个答案:

答案 0 :(得分:1)

从我认为的命名来看,CreateQuizController的责任太多了。我假设(再次从它的名字),它可以创建测验和控制测验。如何将这个分为两个类,QuizFactoryQuizController

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

如果我们想运行测验,我们会从目录中选择一个测验,创建QuizController(使用此测验),QuizController将启动测验,提出问题并保持分数。

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

QuizControllerQuiz有一个关系就足够了。在我的设计中,QuizCatalog将是(像)单身,因此是静态的或由另一个顶级类拥有,就像某些QuizManager一样。