【HNU个人项目互评】--java

发布时间 2023-09-20 12:48:43作者: A_susan

湖南大学软件工程个人项目互评

评测者:李姝萱
项目作者:张乐盈

 

一.基本信息:

  1.被评队友满足了个人项目要求的所有需求
    1.1.登录:只有规定的账户可以登陆,其他的输入不会因为异常抛出强制终止程序

 输入不满足格式要求,不会越界异常

错误账户不能登陆

登陆成功,清晰提示

    1.2.生成题目:小学包括+-*/();中学每一道题都包含平方或者开平方根;高中每一道题都含有三角函数,且题目经过了查重处理

    1.3.设置题目的数量以及各题目的操作数大小都符合要求

          

生成的小初高对应的题目

    1.4.登录之后可以随时切换出题的状态,且不会扔出异常

状态随心切换,没有异常终止程序

    1.5.输入合法数字可以正常出题,-1可以退出登录,非法的其他信息会输出引导语句

通过各种测试

    1.6.生成的文件可以正常输出,而且命名按照题目要求形式,“年-月-日-时-分-秒.txt”

时间完全一致

2.根据Google编写java代码规范,队友的代码严格遵守规范,在变量,方法等的命名上,以及水平,垂直空白,缩进,javadoc等方面都严格按照标准

 

二.优点评价分析:

1.虽然题目的用户数量比较少,但是张同学仍然采用的是读取文件的形式,而不是直接加入客户的信息,这样做的好处是使得对用户的读取操作更具有拓展性,因为如果用户数量比较多,或者需要加入更多的用户,如果直接在程序端进行添加会显得代码比较臃肿,而且从安全性来说文件也更好。

public void getUserList() {
  ArrayList<String> uList = new ArrayList<>();
  uList = sysFileAssistant.readFromFile();
  for (int i = 0; i < uList.size(); i++) {
    String[] result = uList.get(i).split("\s");
    User u1 = new User(result[0], result[1], result[2]);
    userList.add(u1);
  }
}

得到用户

2.队友的另一个优点就是她的模块划分比较合理,逻辑清晰,代码的可读性也比较好,可以看到张同学在编写代码之前做了一定且充分的构思。

各模块划分清晰

3.队友在生成表达式的地方对出用到了如下的判断表达

random.nextInt(0,(oNum - pos + 1) + usedNum) == 0

这个表达本来处理的是初中高中的平方,开平方,以及三角函数的问题,但是他在处理这些必须处理的问题的同时解决掉了另一个需求,那就是对于初中生每道题至少出现一次平方或者开根号,对于高中生至少出现一次三角函数。

首先给出各个符号的含义:oNum表示的是操作数的数目,pos表示当前处理的操作数的位,usedNum表示已经处理上平方或者开平方的次数。
因为这里如果usedNum出现的次数为0(前面所有数字都没有规定符号)的话,这个随机数就只能生成随机数0了,这样子就必须执行为0的操作,加上必要的平方或者开根号了。而且从出发点来说他又可以随机设置这里到底添加不添加平方之类的符号,所以我觉得这里处理比较巧妙,值得思考学习。

具体生成模块如下(以中学示例):

中学模块解决至少一个中学类数学符号方法

 


总体来说,张同学在生成题目功能模块做得很好,生成的题目类型全面,随机性也很强。

 

三.缺点及改进建议:

1.张同学的一个缺点就是他必须要提前设置好所有的用户的文件夹来保存他们出的题目,但是这里要考虑如果脱离题目,用户数量比较大的情况下,我们就需手动创建很多文件夹,而且有些用户即使存在但是从来也不出题,这样子也会占据资源。
所以我给出的建议是可以在代码中进行文件夹的创建,如果该文件夹不存在,则自动创建,如果存在,就跳过创建文件夹。这样子就可以解决掉上面的资源占用和人力开销的问题。

类似如下:

private static void createAccountFolder(String folderPath) {
  File folder = new File(folderPath);
  if (!folder.exists()) {
     folder.mkdir();
  }
}

 

2.另一个建议就是张同学编写的关于切换出题模式部分的需求时,进行的操作是修改老师的type属性,通过查看张同学关于用户的类的代码,发现有账号,密码和类型3个属性,我个人觉得这里老师虽然可以切换不同模式出题,但是老师的身份应该保持不变,也就是在用户类中再加入一个字段“出题类型”这样子修改的时候应该针对的是老师的出题类型字段,这样后续如果需要拓展,需求增加,将老师类型和出题类型界分开,三个字段就可能需要修改了,所以我从程序的可拓展性建议四个字段,但是就本题来说这么做是完全没关系的。

切换类型

3.对于生成文件的格式,张同学处理的方式如下:

String fileName =
        dateTime.getYear() + "-" + dateTime.getMonthValue() + "-" + dateTime.getDayOfMonth() + "-"
            + dateTime.getHour() + "-" + dateTime.getMinute() + "-" + dateTime.getSecond()
            + ".txt";

这样子显得代码比较冗长,其实可以采用下面的方法来优化:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
String dateStr = dateFormat.format(new Date());
return dateStr + ".txt";

 

四.我的收获和思考:

1.因为张同学出题逻辑严密以及题目类型多样全面,就不可避免时间复杂度比较高,对于生成大量的题目的需求来说就不太友好了,效率会有所损耗。
虽然这可以通过一些其他的数据结构来化简时间复杂度,但是这样子就没有办法做到张同学出题全面严谨的优点,比如我使用了linkedhashset数据结构,在去重上时间复杂度较低,但是随之而来的问题是我的出题逻辑没有张同学严谨全面,所以我觉得在实际这一点要根据具体的需求来分析到底采用哪种办法。

2.通过审阅队友的代码,我既发现了一些自己的问题,也学习了队友的一些做得很好的地方以及比较好的方法,比如可以直接调用File.separator来得到文件的分隔符,在我的代码里面直接用的是针对Windows的操作系统的分隔符,但是File.separator的好处是可以保证代码在不同平台上的兼容性,而不需要手动编写特定于操作系统的文件路径分隔符。
用法举例:

String filePath = "C:" + File.separator + "Users" + File.separator + "Username" + File.separator + "Documents" + File.separator + "file.txt";

 

总之,通过本次互评让我们彼此认识到自己的不足,也互相学习了对方的可取之处,受益匪浅。❤