个人项目互评

发布时间 2023-09-20 00:06:04作者: 琐桥

在此次个人项目编程中,我和搭档万宇龙都是使用Java语言来进行编程。在分析对方的代码时,发现了许多具有创新性的想法,我从搭档的代码实现中学到了许多知识。以下就对搭档的个人项目进行分析。

一、项目要求

1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;

2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;

3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);

4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;

5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;

二、代码总体分析

1.框架

 搭档将项目拆分为好几个层次,分层进行代码编写,结构清晰。

2.创新性思路分析

(1)小万同学用结点存储操作数和运算符,用二叉树存储整个试题。在生成树后,用递归的方法遍历整颗树,就可以得到试题的答案。

 

 CalNode类中计算答案的函数,运用到了递归的算法,遍历整颗二叉树。

public double calculate() {
    if (element instanceof Num num) {
      return num.getValue();
    }
    if (element instanceof Operator operator) {
      if (operator instanceof Binary binary) {
        return binary.apply(left.calculate(), right.calculate());
      }
      if (operator instanceof Unary unary) {
        return unary.apply(left.calculate());
      }
    }
    return 0;
  }

CalTree类中,则实现了生成整棵计算树和判断试题是否合理的函数,功能十分强大,在此不再赘述核心代码。

(2)他也将运算符拆分开,分为一元运算符和二元运算符两个包,重写不同的apply(即计算)、symbol(即符号)等函数来实现不同的运算。提高了项目的可拓展性,也实现了类间的解耦,后续如果需要再增加运算符将会非常方便,也不会对其他运算符造成影响。

 (3)在生成试卷及答案文档时,从相对路径将其输出到项目下的resources文件夹中,这样无需切换到文件夹页面就能在IDEA中看到txt的内容,方便测试。

private static final String PATH = "src/main/resources/";
  private static final String EXERCISE_PATH;
  private static String path;
  private static Set<String> exsercises = new HashSet<>();

  static {
    EXERCISE_PATH = PATH + "exercise/";
    File dir = new File(EXERCISE_PATH);
    dir.mkdir();
  }

 IDEA中所见如上图

3.运行过程

在只输入一个字符串时,系统不会自动报错。且连续输入三个字符串时,有可能会出现错误。建议用nextLine()读取一行内容,再以空格分割。

 其他功能运作正常,且自动生成答案文档这一功能十分强悍,为后续的结对编程奠定了基础。

 

三、优缺点分析

以下为优点部分:

1.项目框架具有条理。搭档将项目拆分成controller、views、test等层,结构清晰,为结对项目时的功能增加奠定了基础。

2.在储存题目时,创新性地使用了树结构来存储操作符和操作数。通过运用数据结构与算法的知识,搭档在个人项目这一步就实现了试卷答案的计算,并且把答案保存在txt文档中,更加贴合现实生活中的要求。

3.搭档使用树节点来存储运算符或操作数。如果是叶子结点,则判断其为操作数,随机生成1-100的数存储在叶子结点中。在小学题目时,题目树有二分之一的概率生长出左右子结点,即没有操作数为1的情况。在生成初中和高中题目时,不生成子节点、只有左子节点、生成左右子节点的概率均为1/3,综合考虑到了单操作数的情况(比如sin30等),功能十分强大。且利用叶子结点的数量来反应生成的操作数数量,防止树无止境地生成下去。

4.在生成题目时,搭档还考虑到了题目不合理的情况,比如出现tan90和除0的情况,这点是我没有考虑到的。并且在给题目增添括号时,还综合考虑了运算符优先级的问题,在当前运算符优先级较低时才会添加括号,使生成的题目更加合理。

5.可拓展性强,实现了类与类之间的解耦。搭档将操作符分为一元和二元两个数据包,将加减乘除等运算符拆分为一个个class类,每个类之间互不影响。如果后期需要加入新的运算符,直接在包中添加新的class即可。方便后期的维护和升级。

6.书写符合谷歌规范,包和类的命名都让人一目了然。注释清晰,javadoc的撰写浅显易懂。方便他人阅读。

以下为缺点部分:

1.在运行程序时没有提示输入账号密码的格式,影响到了用户的体验感。

2.查重操作不够完备,有可能会出现新出的题目重复,导致生成的文档中少题的现象。

3.在登录时有一些小bug。

但总体来说瑕不掩瑜,仍是一个非常出色的个人项目。