请教初学DDD和四色原型设计的困惑

以前做系统都一直是使用面向数据库设计,做过挺多系统, 都是使用J2EE的。
经过最近这几个月在Jdon学习,DDD的书也看了一半。 实体、值对象、服务。也有初步理解。对DDD提出的领域建模驱动设计的方法很认同,毕竟在这几年的开发过程一直忍受使用java开发面向数据库设计系统带来的痛苦。

刚好又有新的项目,这次我决定一定要在该项目实践DDD,建立一个基于面向对象设计的系统。不过凡事开头难,从以前开始就数据库建模,转变到想使用UML建立模型的确有点困难。在开始设计碰到很多困惑。在这里提出,大家给点意见。

新的项目是一个考试系统。目前开始对题库管理模块建摸。需求如下。

题库管理是维护考试系统题目, 题目分单选题,多选题,判断题。 题目是按科目分类的。功能就是CRUD。

建立模型如下:


Question :题目
题目有多个子类。
SingleSelectQuestion:单选题。
MultiSelectQuestion:多选题
JudgeSelectQuestion:判断题。

QuestSpec是抽象问题的标准,符合这个标准才可以保存到数据库。比如单选题目只能有一个标准答案。
QuestionService是服务类,提供操作题目的服务。

每个题目属于一个考试科目ExamSubject , 考试科目属于某一个考试Exam
建模的时候,我使用四色呀原型标识类。

建立完这个模型后,总觉得缺少什么东西。模型看起来了协调。但是一时很难想出。觉得应该每把Dao类画出来。



使用四色原型标识时, 找不到role原型。 ExamSubject 和 Eaxm 应该是 PPT.

"发完主题后,不能修改的?是bug的吗?,回贴就可以修改."

在这个模型中,有一点设计起来感觉很有问题. 那就是 QuestSpec (题目标准类) 该类是为了来判断题目的内容是否符合标准. 比如单选题(SingleSelectQuestion)只能有一个答案. 多选题(MultiSelectQuestion)可以有多个答案. 是否需要这样抽象出来值得考虑一下.那是否将标准判断加入到每个对象里面.

是否去掉QuestSpec ,然后在SingleSelectQuestion加多一个isValite()方法,判断是否符合单选题的要求.
[该贴被BinnyJ于2009-01-09 11:23修改过]

学习DDD也挺困难的...学习过程出现的问题 ,没有人能一起讨论..

还是 面向数据库设计 比较容易.

学习就是个困难的过程,其中只有不停的探索,而且很多时候都不能得到帮助,只能依靠自己。我也有过这样的感受。但是继续努力吧,只要坚持就会有很大的收获的。

你的帖子看了几次,但是我不了解4色图。

你这个图貌似UML,但是又不能按照UML去解读。

谢谢IceQi回帖..

我这是UML的类图..也就是模型啊...居然看不明白..看来这个模型很难进行交流.呵呵.看来我还需努力啊.

我琢磨几天,发现这个模型还是太简单,涉及到一些隐藏对象没标识出来,比如,"题目(Question)"对象应该是由"选项(SelectOption)"对象组成的.QuestSpec应该是属于"题目(Question)"对象自身的控制.

思考过程是非常寂寞和痛苦的,项目程序员对DDD一无所知,公司里其他项目组都是用PB做的.无人可以进行交流,部门经理也不关心领域,OOD,OOP等..

继续坚持.......
[该贴被BinnyJ于2009-01-14 23:50修改过]

如果你画的是UML那么,呵呵,对UML的理解还需要加强呀。这个图还不足以向别人提供足够的说明。

你的这个问题域也许没有你想的那么复杂,还没有习惯这样的思考方式。

我觉得没有必要建立QuestSpec。“符合这个标准才可以保存到数据库”属于validation logic,应该放在Question里。

我觉得你应该在Question加一个answer属性,用来保存“问题的可选项(SelectOption)”,然后在具体的Question(SingleSelectQuestion:单选题,MultiSelectQuestion:多选题,JudgeSelectQuestion:判断题)中加入对answer属性的validation logic。

BTW,to BinnyJ: 你用的哪个uml modeling tool?

<论坛没引用功能的?>

--to : dearshor
对,我也是这么想的.每个子类有自己的validation logic, 比如单项目选择题,类自己本身应该具有判断答案是否符合要求.至于答案放是否放在父类Question中,我的设计是放在子类,因为不同类型答案不一样.
不过设计中也有很多地方在思考,比如 Question包含 答案(Answer) 对象, 答案(Answer)与问题的可选项(SelectOption)关联.形成一个循环结构,看图.


类图是第一次化,没细化对象的属性和方法,正在细化中.

做过几个"大型"的J2EE系统,都从来没使用过UML, 我一直都是先PowerDesigner建立数据库表. 使用UML画类图非常不习惯.所以画出来比较难看懂.

使用工具是:Visual Paradigm for UML



简单一些的话,answer属性可以直接放在Question中,类型为Collection<SelectOption>。

从长远来看(考虑可扩展性),你目前的设计也是可取的。

BTW,你的uml图我不觉得“比较难看懂”。 :-)
Visual Paradigm for UML 你用了感觉咋样?Google了一下,看到貌似有community版的,找时间我也体验一下。
[该贴被dearshor于2009-01-16 21:07修改过]

to dearshor .
一些设计的细节,有时候同一种效果有多种设计方式, 但是很难确定哪种为最佳,因为这方面经验比较少,我现在先把整个模型建立处理,然后再迭代细化几次.到时候再贴出来和你讨论讨论 :)


Visual Paradigm for UM很好用,主要是启动速度块,界面看起来也很不错 .准备使用UML之前使用过几软件,就这个感觉最好. 而且还是中国(香港)人开发的.

一些功能比较符合我的思维,比如一功能,我觉得软件大概会再那里,找一下,果然和想的差不多.呵呵.
用了几天,越来越顺手...比 Rose 好太多了.

不知楼主是否能够看到我的留言。我也是个新手,看了你的贴后吧自己的想法说一下,不知是否正确,想一同讨论下。
我认为Role可以抽象出一个操作员角色包含ManagerQuestion();方法; MI我同意的你CRUD的那些操作。PPT我认为是一个User的实例,此user充当操作员的角色。Description里面是这样的一个结构 Exam---> ExamSubject ---> Question(SingleSelectQuestion、MultiSelectQuestion、JudgeSelectQuestion) 不知这样设计是否恰当。希望一起探讨