结对编程——队友个人项目分析
以下是张君逸同学对郭晓哲同学个人项目的代码分析:
- 综合概述:
郭晓哲同学对于个人项目的需求分析非常的清晰,基本完成了所有的基本需求,而且实现后基本没有bug问题。
郭晓哲同学只设计了一个老师类,整体都是依托这个类来设计了诸多函数以实现功能,主要的功能界面跳转是使用switch结构和函数跳转来实现的。
- 技术分析:
- 查重
查重是使用读取用户文件夹生成过的试卷txt,然后再用一个临时的字符串不断地保存题目进行比对,这一点比我的查重逻辑上更好,但是其实有更好的数据结构可以使用,这样的遍历的比较方法造成复杂度很高。
如下就是查重部分的代码。
for (String f:files) { try { FileReader fr = new FileReader(".\\" + teacherName + "\\" + f); BufferedReader br = new BufferedReader(fr); String str; String tempString; while ((str = br.readLine()) != null) { if(str.length() > 3) { // 由于题目格式为1、 所以截掉前三个字符进行比较,以免序号不同影响查重 tempString = str.substring(3); } else { tempString = str; } if(tempString.equals(question.substring(3))) { flagFind = false; break; } } br.close(); fr.close(); } catch (IOException e) { e.printStackTrace(); }
-
- 登录
登录的方法郭晓哲实现的比较笨,是直接使用switch结构直接赋值实现的,根据输入直接给变量赋值,造成了程序的局限性很强。
如下就是登录部分的代码。
switch(chooseFlag) { case 1: teacherName = "张三1"; break; case 2: teacherName = "张三2"; break; case 3: teacherName = "张三3"; break; case 4: teacherName = "李四1"; break; case 5: teacherName = "李四2"; break; case 6: teacherName = "李四3"; break; case 7: teacherName = "王五1"; break; case 8: teacherName = "王五2"; break; case 9: teacherName = "王五3"; break; default: }
-
- 数学题目的生成
随机生成的大量题目,考虑到了所有的情况,逻辑比较缜密。
实现的比较笨重,通过字符串的添加来不断往一个空字符串中加符号或者数字,这一步骤使用获得随机数的方式来操作,使得得到的题目是随机的,可以覆盖大部分情况和需求情形。
/* * 出一道高中题目 */ if(changeFlag == 3) { int operatorCount = rand.nextInt(4) + 1; int digit = 0; if(operatorCount == 1) { // 如果仅有一个操作符,那么必须为sin cos tan int operator = rand.nextInt(3) + 8; question = question + chooseOperator(operator); digit = rand.nextInt(100) + 1; question = question + digit; } else { int leftBracketNumber = 0; int operator = rand.nextInt(11) + 0; // 在第一个操作数之前先生成一个符号,是括号则根据条件判断是否写入 if(operator == 4) { question = question + chooseOperator(operator); leftBracketNumber++; } operator = rand.nextInt(11) + 0; if(operator <= 10 && operator >= 7) { question = question + chooseOperator(operator); } digit = rand.nextInt(100) + 1; // 生成第一个操作数 question = question + digit; operator = rand.nextInt(11) + 0; if(operator == 6) { question = question + chooseOperator(operator); } operator = rand.nextInt(11) + 0; if(operator == 5 && leftBracketNumber != 0) { question = question + chooseOperator(operator); leftBracketNumber--; } int flagPlace = rand.nextInt(operatorCount) + 0; // 选择sin cos tan的位置 int flagOperator = rand.nextInt(3) + 8; // 选择sin cos tan for(int j = 0; j < operatorCount; j++) { operator = rand.nextInt(4) + 0; // 随机生成+ - * / question = question + chooseOperator(operator); operator = rand.nextInt(11) + 0; if(operator == 4) { question = question + chooseOperator(operator); leftBracketNumber++; } if(j == flagPlace) { // sin cos tan 的位置 question = question + chooseOperator(flagOperator); } if(j != flagPlace) { operator = rand.nextInt(11) + 0; if(operator <= 10 && operator >= 7) { question = question + chooseOperator(operator); } } digit = rand.nextInt(100) + 1; // 随机生成操作数[1,100] question = question + digit; operator = rand.nextInt(11) + 0; if(operator == 6) { // 生成了平方则写入 question = question + chooseOperator(operator); } operator = rand.nextInt(11) + 0; if(operator == 5 && leftBracketNumber != 0) { question = question + chooseOperator(operator); leftBracketNumber--; } }
- 优点:
简单实用,注释清晰,理解起来很快。逻辑很缜密,考虑到了基本需求的所有可能性,完整地处理了所有的特判情况,这一点很值得我学习,我做的时候就有许多的特判没有处理好。他的代码缩进处理的很不错,代码块很整齐,感官上还不错。
- 缺点
缺点也比较明显,虽然完成了基本需求,但是完成的很僵硬,程序的数据结构和算法逻辑没有什么技巧性,造成了代码非常的繁琐,并且缺乏拓展性,没有后续的可开发性。
另一点是代码规范的注释问题,虽然每个函数都给了注释,但是注释解释的不是很清楚,函数之间的关系也没有说清楚,还有很多关键变量也没有做出一些注释解释,导致了一些阅读障碍。

浙公网安备 33010602011771号