我得到了一个测试应用程序的用例。用例只用于创建新的测验。我很难决定哪种设计更好:
(一)
alt text http://dl.dropbox.com/u/6187267/shooterpics/diagram1.jpg
(二)
alt text http://dl.dropbox.com/u/6187267/shooterpics/diagram2.jpg
虽然这看起来像一个域模型,但实际上它是一个类图(我懒得把方法/属性放在图中:).
这一切背后的想法是我有一个QuizCatalogQuizzes的。每个Quiz都有一组Questions,必须通过QuestionFactory创建(aQuestion是一个抽象类,而QuestionAQuestionB等是具体类)。每个Question都有一组PossibleAnswers
Design ADesign B之间关联的区别在于,首先我认为CreateQuizController只会委派它必须执行的每一项任务。如果QuizCatalog需要执行某些操作,它将委派层次结构中可能需要的所有内容。这实际上很好,因为它似乎减少了耦合。
另一方面,遵循的是另一种不同的理念。在QuizCatalog中所看到的关联仍然存在(作为Design B仍然有 Zes、Design A > cc> s等),但现在我已经使QuizCatalog基本上可以访问该过程中可能需要创建的域中的每一种对象(我已经发出了与Quiz的那种关联)。我们的想法是,Question不会要求PossibleAnswer创建一个CreateQuizController,而是自己创建一个d(如果它需要为QuizCatalog创建问题,它将自己创建一个Quiz,同样的情况也会发生在CreateQuizControllerQuiz上,等等)。
关于Quiz,有两件事让我烦恼:
一。
如果我需要创建临时对象,这些对象在被放入“系统”之前需要填充(例如,aQuestion实际上只是在它被填充了所有想要的PossibleAnwser之后才被添加到Design A),按照这种设计,我将不得不将它们保存在Quiz之外的某个位置。
例如,当我第一次创建一个QuizCatalog时,我可能需要将它保存在Question下,而不实际将它添加到系统其他部分可以访问的当前测验集合中。我觉得这种行为有点尴尬。我发现最好将这些类型的临时对象保存在Controller中,好像发生了什么错误,然后“系统”就保持原来的状态,没有相关的问题。
问题是,这使得Quiz必须知道几乎所有的事情,这可能是不可取的。另一方面,QuizCatalog中其他类的耦合程度没有区别。
2.
如果我要使用design a,我实际上不认为createquizcontroller有什么意义,因为基本上只要引用quizcatalog就可以完成所有事情。在我看来,它只是把所有的工作都交给了奎兹卡塔洛,那么为什么它首先要这样做呢?
另外,使用Controller,我可能会认为Controller是一个单例,而如果使用System,我可能会让Design A的构造函数接受QuestionFactory的实例。
你对此有什么看法?
谢谢
附言:只有在画了图表之后,我才注意到测验有两个z:(我的错)。

最佳答案

我认为从命名的角度来看,CreateQuizController有太多的责任。我假设(从它的名字来看),它可以创建小测验和控制小测验。把它分成两类,aQuizFactory和aQuizController怎么样?
因此,如果我们需要一个新的测试,我们要求QuizFactory创建一个新的测试,然后QuizFactory将创建一个新的测试,使用QuestionFactory创建问题和可能的答案,然后我们将新的测试添加到(静态的)QuizCatalog
如果我们想进行测验,我们将从目录中选择一个测验,创建一个QuizController(使用这个测验),然后QuizController将开始测验,提出问题并保留分数。
QuizController不需要知道问题,如果测验提供了getNextQuestion()getPreviousQuestion()这样的方法和验证候选人答案的方法就足够了(这样控制员只知道实际问题)。
所以从QuizControllerQuiz的has-a关系就足够了。在我的设计中,QuizCatalog将是(类似于)一个单体,因此是静态的,或者由另一个顶级类拥有,比如一些QuizManager

07-26 05:43