一、前言
首先,在这里特别感谢我的结对编程伙伴,分析他的代码时发现他在算法上和设计思路上都与我有很大的不同,让我有很多启发和收获。其次我来对队友的的个人项目分析点评,学习长处,取长补短,也希望能为项目的进一步改进提供一些思路。
题目需求
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)出题测试:
限制了出题数量范围,并且错误输入后可以继续输入。但是存在小bug,需要改进。
(3)试卷生成:
小学试卷:
初中试卷:
高中试卷:
运算符、操作数和括号均符合规范。难度设定也符合要求。
二、代码分析
1)代码框架:
User类:用于封装用户信息,同时将小学 初中 高中 改为user的子类 方便后面实现不同接口,也利用继承接口实现多态,实现使用不同接口实现生成难度不同的试卷。
1 interface getProblem {
2
3 String getProblem();
4 }
5
6 @Override
7 public String getProblem() {
8 String[] symbol = new String[]{"+", "-", "*", "/", "^2", "√", "sin", "cos", "tan"};//设置字符串数组保存符号
9 Random r = new Random();//产生随机数种子
10 String problem = new String();//创建字符串来保存结果
11 while (true) {
12 problem = "";
13 int length = 0;//表示式子的长度
14 int bracket = r.nextInt(3);//表示括号个数,随机化0.1.2
15 int left = 0;//表示左括号多余的个数
16 int gap = 0;//表示左右括号之间的跨度
17 while (true) {
18 if (r.nextInt(2) == 0 && bracket > 0) {//1/2的几率在数前加入左括号
19 problem += "(";//式子加入左括号
20 bracket--;//括号次数
21 left++;//差值加一
22 gap = 0;//初始化跨度
23 }
24 int num = r.nextInt(100) + 1;//加入0-100随机化数
25 problem += String.valueOf(num);//把数加入式子
26 gap++;//跨度加一
27 if (r.nextInt(2) == 0 && left > 0 && gap >= 2) {//1/2的几率且满足差值大于0且跨度大于2时加入右括号
28 // if(left>0&&gap>=2){
29 problem += ")";
30 left--;
31 }
32 if (length >= 2 && bracket <= 0 && left <= 0) {//长度大于2且括号个数为0且差值为0生成结束
33 break;
34 }
35 problem += symbol[r.nextInt(4)];//式子中再加入符号
36 length++;//长度加一
37 }
38 if (length < 5 && gap < 3) {//过滤掉长度大于5且差值过大的式子
39 break;
40 }
41 }
42 problem += "=";
43 return problem;
44 }
45 }
- 以上为队友的接口代码以及重写函数。
3、注释详尽,益于读者理解: 队友在各个代码块都有进行注释,这是一个良好的习惯。增强了可读性,使人一目了然。变量和方法的命名也符合Google的Java编码规范,易于理解。
4、试卷生成函数写的比较好,采用了BufferedWriter类缓冲流进行题目的填充,并且采用了相对路径生成文件。而且文件夹是先生成小学、初中和高中,最后在用户文件夹存储到对应年级的文件夹下,这样查询更加清晰便利。
缺点:
1、在输入错误的用户名或密码后没有错误提示,也不能再次进行输入,直接结束进程。
2、在生成题目时输入错误的数量或者切换身份时输入错误后得连着按两次enter后才有错误提示。一次输入错误后再次正确输入也会提示错误。
3、题目生成函数较为复杂,其中涉及到了表达式生成,符号处理,而且方法内部鲜有注释,对于方法实现的流程理解会有所不便;条件判断过多:在生成数学题目的时候,因为要对当前操作数进行多种情况的判断因此需要进行非常多的条件判断,这就让人有一定的困难去理解代码,希望可以进行改进。
4、局部变量命名不是很规范,所以阅读代码的过程中要经常查看注释去理解变量的定义,因此建议使用驼峰命名法进行命名,且使用相对完整的英文去对变量进行命名。
三、总结
总而言之,队友的代码写的还可以,就是有一些小问题,我也从他的代码中得到了很多启发和收获,和其他人合作,能让你观察到其他人的思考过程;你还可以看到他们写代码的方式;你能学会他们使用的工具。我们会在接下来的结对编程项目中扬长避短!