前2个星期,一直在做一个考试系统的开发,主要是帮助一个单位的人力资源对他们员工的内部培训和考核,考试系统就是完成考核的目的,主要功能是在题库中选题然后出卷子,在线答题完成后交卷、判卷、评分等。目前这个考试系统要进行原型设计,就是在技术上进行实现,尽快给客户使用和反馈,实施迭代开发。开发人员就我一个,NND既然是原型那我就扛了!
这个系列的文章主要是对我解决这个问题的一个回忆和总结。
刚开始接到这个任务时觉得有点麻烦,主要是题型和卷子的关系那块,对象树有点复杂,题目信息肯定是一个基类了,从题库中调出,然后组合成一个试卷,在考试过程开始时表现出来,在考试结束时收集成为一个答卷,在后台要判卷,得到分数什么的。
考虑到每个考试不仅生成的考卷要持久化,答卷也要持久化,我想这东西有这么多的外键,搞在数据库里太麻烦了,于是直接用XML作为持久化吧。看下面的类图如果是用数据库该有多少个关联表呢,如果用表还要处理继承的问题,好痛苦的!
上面的类设计已经大概说明了这个系统的实现难点:它是多层嵌套的。关系是:试卷1:N题型1:N题目,有3层1对多的情况,而且题目那块是分不同的类型,其中有组合的类型。很无奈,我想一次保存这么多信息,就只能这么设计了。该如何程序表达和数据提交。用“鹾”办法可以很容易实现吧,但我想尽量优雅的实现这个,我在这方面追求的太高,因此BOSS总批评我!
这种设计有2个比较明显的实现难点:
1、多层对象结构在asp.net页面上该如何表达,表达之后如何实现资料的收集
2、多层对象的持久化保存,是否能完整的还原和生成答卷
这种设计的优点:
1、避免了多层对象在数据库中持久化的表达,避免了最麻烦、复杂的问题,特别是它还会从“问卷”转化为“答卷”
2、方便变更,如果要增加或调整字段,影响面比较小,只用修改类就可以,比数据库方便,特别是部署到生产环境之后