判 分的逻辑被我理的透透的,所以想写篇文章跟大家分享一下~我们的项目到现在,整个系统算是跑起来了,小有成果的感觉,开森~~~在最近这段时间,感觉收获最大的就是
象 中的那么easy。1、计算机一级与考试系统的区别
我对计算机一级的理解,停留在大一考一级那会,感觉挺简单的啊~But,现在要开始研究它才发现,真的不是想
刚接触这个项目的时候,我们是从框架开始的,要求很简单,调通了就行了。然后针对晓婵完善后的原型图写了
需求文档,自我感觉还是蛮简单嘛~但是在老师验收我们原型的时候,一句话点醒了我们。我们ITOO已经有了考试系
统了,做计算机一级的目的在哪里?现在界面什么的都不是重点,找到计算机一级与考试系统的区别——操作题!
后边一想,真的是这样的,我们前期研究半天框架,原型什么的,如果主要功能没有实现的话,那就是一个空
壳。所以后来转战操作题:Windows,IE,outlook,word,Excel,PPT。
2、判分逻辑
在整合系统的时候,发现判分这块内容的逻辑性真的是比较复杂。敲代码的时候差不多需要代码走查好几遍才能
大致明白判分的逻辑,而且因为这一个判分,我和芬芬差点打起来,相信以后再想起这段,我们能大笑半天。
废话少说,看如何判分!
先介绍一下我的职责,我负责的是Excel部分,所以我的数据库就两张表:ExcelEntity,Excel_Record_01。
ExcelEntity里边放的是试题信息,重要的几个字段是:QuestionTypeID,Fration,PaperType,QuestionContent,
CorrectAnswer。而Excel_Record_01是考生的答题记录表,里边重要字段有:StudentID,PaperType,
QuestionContent,CorrectAnswer,ExamAnswer,Fration。
再简单介绍一下判分流程,在考生答题结束之后,点击交卷时,我们就统计考生的答题信息,从ExcelEntity里读
取试题信息,然后获取考生答题记录,更新到考生答题记录表Excel_Record_01里。
其实很简单对不对?
但是在判分的过程中我遇到个问题,就是本来ExcelEntity里试卷题目一共14个题,但是一判分,
Excel_Record_01表里有88条记录。看到这个数目,俺就兴奋了,这是咋回事,又有机会进步了???开始一点点理
这条判分线。
我在U层抽象了7个类出来,就简单的说说这三种,讲讲判分流程:
考生交卷——>判断类加载试题信息,根据QuestionTypeID关键字,进行判断,该题是查找类,图表类还是文件
夹类?——>三个类根据题型的不同进行判分——>更新到数据库。
整个判分流程就是这样的,然后我在代码里,一共加了两种循环。第一种循环在判断里,第二种循环在具体的判
分类里。两种循环调用的都是ExcelEntity表,所以两种循环都需要循环14次。
我说到这里,大家有没有明白为什么我的答题记录里会有88条记录了吗?
本来正常的正确的判分逻辑应该是:
但是因为两次循环都是相同的,然后真实的就变成了这样:
这样的结果就是:我的查找类数据一共7条,这样的话光是7*7就已经是49条数据库,更别说还有其他的几种类。
所以这个循环是导致问题的根本原因。那么问题来了,这个循环到底应该怎么进行?数据库里一共14条记录,但是我
更新抽象的方法类,我只需要循环8次就行了,那么怎么进行?
3、在抽象的基础上抽象
我和芬芬为什么差点打起来,就是在讨论这个问题应该怎么解决。
芬芬的想法:
一:去掉U层判断类中的循环!还是一样的数据库表ExcelEntity,从里边查询出数据,找到QuestionTypeID这个
字段,然后将这个字段中的所有结果与“查找”这个字符串进行比较,如果是“查询”就进行查询工作,否则的话进行下
一次比较。(注意:整个过程中没有用到循环)
二:在D层加8个查询方法,然后在U层一个个调用。
注:这两个想法中,有一个我认为逻辑是有点问题的,但是我到现在也没有跟她讲清楚,如果大家看出了
端倪,请找我们两个一起商讨商讨。
基于芬芬的想法上,我的想法是:在数据库里再加一个表:ExcelQuestionTypeEntity。将ExcelEntity中出现过的
所有的类型都写在ExcelQuestionTypeEntity表里,然后对类型进行编号,在ExcelEntity里用QuestionTypeID就可以
了。
然后在第一个判断类里,查询ExcelQuestionTypeEntity的所有数据,然后针对查询到的类型开始循环,第二个循
环条件不变。第一个循环代码如下:
#region 根据题型关键字,判断判分方式
/// <summary>
/// 判断是什么类型的题
/// </summary>
/// <param name="excelinfo"></param>
public void SelectJudge(ExcelEntity excelinfo)
{
ExcelQuestionTypesEntity exceltype = new ExcelQuestionTypesEntity();
DataTable dt = excelquestionbll.QueryExcelQuestionType(exceltype);
int i;
for (i = 0; i < dt.Rows.Count; i++)
{
string questiontypeid = dt.Rows[i]["questionTypeID"].ToString().Trim();
//根据试题类型关键字判断
excelinfo.QuestionTypeID = questiontypeid;
switch (questiontypeid)
{
case "1"://查找
ExcelFindKeyWord excelfindkeyword = new ExcelFindKeyWord();
excelfindkeyword.FindKey(excelinfo);
break;
case "2"://文件夹查找
ExcelChazhao excelchazhao = new ExcelChazhao();
excelchazhao.Chaozhao(excelinfo);
break;
case "3"://工作表重命名
ExcelSheetName excelsheetname = new ExcelSheetName();
excelsheetname.SheetName(excelinfo);
break;
case "4"://图表类型
ExcelChartType excelcharttype = new ExcelChartType();
excelcharttype.ChartType(excelinfo);
break;
case "5"://图表标题
ExcelChartTitle excelcharttitle = new ExcelChartTitle();
excelcharttitle.ChartTitle(excelinfo);
break;
case "6"://图表颜色
ExcelChartColor excelchartcolor = new ExcelChartColor();
excelchartcolor.ChartColor(excelinfo);
break;
case "7"://图表位置
ExcelChartPosition excelchartposition = new ExcelChartPosition();
excelchartposition.ChartPosition(excelinfo);
break;
default:
break;
}
}
}
#endregion
然后这个循环就能按照预期效果进行1:1加上1:N的执行结果。
4、总结
这条线大概恼了我们1天的时间,但是跟芬芬的交流过程中,虽然差点掐吧,但是逻辑真的越来越清楚。而且还
找了十期连江伟给我们指导了一下,感觉收获还是蛮大的。所以一级项目做到现在为止,我真的体会到了它带给我的
一些潜在的东西,我真的能明显感觉出来自己的逻辑思维还是蛮强大的!
在这里,跟大家说句心里话:做项目,掐架在所难免,那是因为我们在头脑风暴,正处在风暴的中间位置。但是
我和芬芬还会是好朋友的,对吧?芬仔~哈哈~