代码审查——第二次个人编程作业

博客班级 <2018软件工程2班>
作业要求 <第二次个人编程作业:代码互改>
作业目标 <与同学彼此之间,互相提出issue并改进代码,并学习、借鉴别人的好的想法>
作业源代码 <我的码云仓库>
学号 <211806327>

我的Issues模板:

我的PR模板:

我的commit提交信息:




我成功的PR:

我的自提自改:

  • 1、命令行输出问题
  • 2、分类优化问题

让我看看你的代码:

1、黄志辉同学(带下划线的同学名字,点击进入该同学的码云仓库):

  • 1、创建该函数时,此题中Jsoup.parse()方法没有必要放入第三个函数,会显得很冗长、臃肿。
    Document smalldoc = Jsoup.parse(small, "UTF-8"," https://www.mosoteach.cn/web/index.php?c=interaction&m=index&clazz_course_id=CD7AE281-4AF8-11EA-9C7F-98039B1848C6");
  • 除去后就显得更美观
    Document file = Jsoup.parse(new File("small.html"),"UTF-8");

  • 2、仓库中缺少了要求中的“.gitignore”文件;
  • 添加后,再写入“*.class”就可以在上传时过滤掉,运行时所产生的,不需要的".class"文件。

  • 3、仓库未开源
  • 未开源就无法让别人进行fork、pull request操作,失去了进步的机会。

2、廖鸿志同学

  • 和我一样,未对自身正则表达式进行优化
  • 可以对分类好后的div块用“(\d+) 经验”这一正则表达式使用match方法,再对group进行while循环,最后再类型转换,获得经验

3、王浪浪同学

  • 获取经验时使用的正则表达式“\w* 经验”可以替换成"\d* 经验"
    且可以换成用Double.parseDouble(matcher.group(1))来替代将获取内容的“经验”转换为null,再转化为int类型获取经验。
  • 修改后能使代码更加简洁、高效。

4、林天淞同学

  • 1、仓库未开源,且缺少了要求中的“.gitignore”文件;
  • 在“.gitignore”文件中写入“*.class”就可以在上传时过滤掉,运行时所产生的,不需要的".class"文件,开源后也可以让更多人来帮忙修改,进行fork,pull request。

  • 2、变量名命名没有很规范,虽然是驼峰命名法,但有的却在开头就大写了。
  • 养成好的编程习惯会对我们有很大帮助。

5、谢道彤同学

  • 对“课前自测”通过"data-type=QUIZ"来获取时,其实也会将“课堂提问”的经验值计算入其中。
  • 可以通过contains()方法再进行一次筛选来获得“课前自测”准确的经验值。

容我再改一改:

1、林俊威同学对我提出了将两句正则表达式合并的优化意见,这也正是我之前所遗忘的优化点。

  • 修改前:以下为我的原代码,思路为,分别获取“正常经验”和“互评经验”,要运行两次,且赋值了多个变量,较为繁琐
private static double getSc(Element row) {
      Elements eleText = row.getElementsMatchingText("^\d+ 经验$");
      Elements eleText1 = row.getElementsMatchingText("^互评 \d+ 经验$");
      double each=0;
      String score = eleText1.text();
      Pattern number = Pattern.compile("(\d+)");
      Matcher matcher = number.matcher(score);
      if (matcher.find()) {
            each=Double.parseDouble(matcher.group(1));
      }
      score = eleText.text();
      number = Pattern.compile("(\d+)");
      matcher = number.matcher(score);
      if (matcher.find()) {
         return Double.parseDouble(matcher.group(1))+each;
      }
      return 0;
}
  • 修改后:本来我是想着手该同学的意见进行修改的,于是我再次对着html文件源码,却有了更好的想法,
    在看到正常经验为“(数字) 经验”,互评则为“互评 (数字) 经验”,我恍然大悟,其实不需要去在意“互评”这两个字
    去掉后,那么两种经验在html的存储方式都为“(数字) 经验”,即“(\d+) 经验”,而我只要使用的是while,而不是if,
    那么有“互评”时,经验值就会累加入sc,没有“互评”时,sc的累加值为0,大幅度地美化、优化了我的代码。
private static double getSc(Element row) {
      double sc = 0;
      String score = row.text();
      Pattern number = Pattern.compile("(\d+) 经验");
      Matcher matcher = number.matcher(score);
      while (matcher.find()) {
            sc += Double.parseDouble(matcher.group(1));
}

2、助教在替我解决上次作业中存在的疑惑时,还不忘顺带提醒了我未实现cmd运行的作业目标。

在助教的热情、耐心帮助下,我成功完成了修改。

String pathSm =Score.class.getResource(args[0]).getPath();
String pathAl =Score.class.getResource(args[1]).getPath();
String pathTo =Score.class.getResource("total.properties").getPath();		
Document file = Jsoup.parse(new File(pathSm),"UTF-8");
Document file1 = Jsoup.parse(new File(pathAl),"UTF-8");
Elements exps = file.getElementsByClass("interaction-row");
exps.addAll(file1.getElementsByClass("interaction-row"));

3、分类问题的优化。

  • 修改前:以下为我的源代码,在助教解决了我上次作业中的疑惑后,我才发现因为自己的错误,让自己的
    分类方法绕了很大的远路,相当于吃剥好的橘子,我之前吃,是把橘子上的白色脉络剥掉才吃——多此一举,
    而实际情况是可以直接吃的。
//通过data-appraise-type="TEACHER"(只有老师评)
//来筛选出"编程题"、"附加题"
//再通过是否包含"编程"、"附加",来分辨两者
Elements proPlus = exps.select("[data-appraise-type=TEACHER]");
for(Element p:proPlus) {
      String type = p.text();
      if(type.contains("编程")) {
            proSc += getSc(p);
      }
      else if(type.contains("附加")) {
            plusSc += getSc(p);
      }      
}		
//通过data-type="QUIZ"(问答题)
//来筛选出"自测"和"课堂提问"
//再通过是否包含"自测"来分辨两者
Elements seExam = exps.select("[data-type=QUIZ]");
for(Element s:seExam) {
      String type = s.text();
      if(type.contains("自测")) {
      seExSc += getSc(s);
      }
}		
//通过data-appraise-type="APPRAISER"(助教、老师评)、data-appraise-type="EACH_OTHER"(互评)
//来筛选出"课堂完成部分"、"小测"
//再通过是否包含"完成"、"小测",来分辨两者
Elements baExam1 = exps.select("[data-appraise-type=APPRAISER]");
for(Element b1:baExam1) {
      String type = b1.text();
      if(type.contains("完成")) {
            baseSc += getSc(b1);
      }
      else if(type.contains("小测")) {
            examSc += getSc(b1);
      }
}
Elements baExam2 = exps.select("[data-appraise-type=EACH_OTHER]");
for(Element b2:baExam2) {
      String type = b2.text();
      if(type.contains("完成")) {
            baseSc += getSc(b2);
      }
      else if(type.contains("小测")) {
            examSc += getSc(b2);
      }
}
  • 修改后:
for(Element p:exps) {
      String type = p.text();
      if(type.contains("编程题")) {
            proSc += getSc(p);
      }
      else if(type.contains("附加题")) {
            plusSc += getSc(p);
      }
      else if(type.contains("课前自测")) {
            seExSc += getSc(p);
      }
      else if(type.contains("课堂完成")) {
            baseSc += getSc(p);	
      }
      else if(type.contains("课堂小测")) {
            examSc += getSc(p);
      }
}

让我再看一看:

  • 黄志辉同学采纳了我的意见并确实对我指出问题的地方进行了改进。
  • 林天淞同学采纳了我的意见并确实对我指出问题的地方进行了改进。
  • 谢道彤同学采纳了我的意见并确实对我指出问题的地方进行了改进。
  • 王浪浪同学采纳了我的意见并确实对我指出问题的地方进行了改进。
  • 廖鸿志同学采纳了我的意见并采用了我尝试进行修改提交的PR:

作业小结:

当我访问他人仓库,学习别人代码的时候,总能看见那些让人眼前一亮、神乎奇迹、叹为观止的处理方式,让我在惊叹之中,又能学习、收获到了很多
一千个读者眼中就会有一千个哈姆雷特,同一个问题,不同人就会有不同方法,如果我不断去了解别人的想法的话,那么自己的想法就能越来越靠近自
己心中的完美,我想这就是这次作业老师想要告诉我们的吧——在借鉴中不断学习,不断接收自己没有的新思想来强化自己。

原文地址:https://www.cnblogs.com/211806327linjiasen/p/13697868.html