DDD的一次小实践,在线学习。
用户学习用例场景
1、系统显示课程列表。
2、用户选择其中一个课程查看内容。
3、用户决定学习该课程。
4、系统根据用户之前的学习该课程记录,决定用户学习哪一个章节,并显示给用户看。
5、用户学完该章节之后,系统列出对应的测试题。
6、用户回答测试题,系统判断是否正确。
7、系统根据课程设置的规则,判断是否有效学习,如果有效则记录用户学习时间和章节,如果不是有效学习则提醒用户如何有效学习。
8、用例结束。
局部图1
局部图2
说明:软件模型关注重点是用户学习交互过程,没有包括课程、章节、测试等对象的创建,修改,删除等内容,因为这部分就目前业务需求来说,除了CURD,没有涉及的领域知识。
聚合根:课程、节点、学习记录。
困惑点:课程是否该包涵节点Id。思前想后,我这里包涵了节点Id,虽然课程和节点都是聚合根,这样一个聚合根对象拥有一群另外一聚合根对象Id似乎很别扭。我这么做可以找到领域内的解释,就像学生之于班级,班级名册只要记录学生名称,而不要学生本人。
难点:聚合根对应的仓库如何优雅的处理聚合的实体和值对象状态的改变,直白的说就是如何处理聚合实体和值对象的CRUD,特别是有些值对象的删除和修改。比如章节的仓库如何处理小测试实体的新增和修改等操作。似乎除了引入事件,还真没有其他优雅的方法。当然,我用php的魔法方法实现AOP,也可以比较好的处理这类通用的垂直操作。
[该贴被showerxp于2013-08-09 17:46修改过]
[该贴被showerxp于2013-08-09 17:47修改过]
[该贴被showerxp于2013-08-09 17:49修改过]
[该贴被showerxp于2013-08-09 17:49修改过]