结对编程——队友个人项目分析

以下是张君逸同学对郭晓哲同学个人项目的代码分析:

  • 综合概述:

    郭晓哲同学对于个人项目的需求分析非常的清晰,基本完成了所有的基本需求,而且实现后基本没有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--;       
          }  
        }

 

  • 优点:

    简单实用,注释清晰,理解起来很快。逻辑很缜密,考虑到了基本需求的所有可能性,完整地处理了所有的特判情况,这一点很值得我学习,我做的时候就有许多的特判没有处理好。他的代码缩进处理的很不错,代码块很整齐,感官上还不错。

  • 缺点

    缺点也比较明显,虽然完成了基本需求,但是完成的很僵硬,程序的数据结构和算法逻辑没有什么技巧性,造成了代码非常的繁琐,并且缺乏拓展性,没有后续的可开发性。

    另一点是代码规范的注释问题,虽然每个函数都给了注释,但是注释解释的不是很清楚,函数之间的关系也没有说清楚,还有很多关键变量也没有做出一些注释解释,导致了一些阅读障碍。

posted @ 2021-09-28 22:26  逸无双  阅读(60)  评论(0)    收藏  举报