结对编程队友使用的是Java语言。
主函数内有用户登陆以及模型选择和出题数量的功能代码。
有3个出题函数,分别用于实现小学出题,初中出题,高中出题。
接下来是对代码的分析,先讲缺点,再讲优点,互相提高。
①:代码的可移植性差。
这里对于路径的控制是直接在代码里输入的,而不是自动寻路或者是人工在控制台输入。如下
private static String path = "G:\\java_practice\\Auto_question\\";
那么对于这样的情况,如果是在一个没有G盘的电脑上运行,那么就会出现问题。
而且在这里没有人工的提示,一开始使用的时候就会出现无法运行的情况,得自行在源代码里修改才能运行,这样的话,不仅使用效果差,并且代码安全性,也就是可封装性不高。
②:冗余代码多,在三个出题函数里面,有大段的重复代码。不利于提高程序的内聚性,诸如创建文件,添加换行,可以直接提取出一个新的函数。而添加括号等可以也成为一个新的函数。
这样避免了一个函数内的代码过多。目前的函数最长的有大约80行,期望通过结对编程以后可以降低函数长度,达到最长函数在40行以内。
1 public static void Output_to_primary(File f,int num_exc) { 2 3 FileWriter fw = null; 4 5 //创建字符输出流类对象和已存在的文件相关联,若文件不存在,则创建; 6 try { 7 if(!f.exists()) { 8 f.createNewFile(); 9 } 10 fw = new FileWriter(f); 11 12 for(int i=1;i<=num_exc;i++) { 13 fw.write(i+"、"); 14 Random r = new Random(); 15 //操作数的数量 16 int num_opr = r.nextInt(4)+2; 17 //括号的有无,加减乘除操作符,括号的数量,操作数大小 18 int flag_bracket = 0,opt=0,num_bracket=0,opt_num=0; 19 for(int j=1;j) { 20 if(j!=1) { 21 flag_bracket = r.nextInt(2); 22 if(flag_bracket == 1) { 23 fw.write("("); 24 num_bracket++; 25 } 26 } 27 opt_num = r.nextInt(100)+1; 28 fw.write(String.valueOf(opt_num)); 29 opt = r.nextInt(4); 30 fw.write(operator_type[opt]); 31 } 32 33 opt_num = r.nextInt(100)+1; 34 fw.write(String.valueOf(opt_num)); 35 for(int j=0;j ) { 36 fw.write(")"); 37 } 38 //Windows下的换行,Linux下的换行为\n; 39 fw.write("\r\n"); 40 fw.flush(); 41 } 42 43 }catch(IOException e) { 44 e.printStackTrace(); 45 }finally { 46 if(fw != null){ 47 try { 48 fw.close(); 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } 52 } 53 } 54 } 55 //生成初中的题目 56 public static void Output_to_middle(File f,int num_exc) { 57 FileWriter fw = null; 58 59 //创建字符输出流类对象和已存在的文件相关联,若文件不存在,则创建; 60 try { 61 if(!f.exists()) { 62 f.createNewFile(); 63 } 64 fw = new FileWriter(f); 65 66 int flag_squ,flag_sqrt; 67 for(int i=1;i<=num_exc;i++) { 68 fw.write(i+"、"); 69 Random r = new Random(); 70 //操作数的数量 71 int num_opr = r.nextInt(4)+2; 72 //依次为括号的有无,加减乘除操作符,括号的数量,操作数大小,平方标志,开方标志 73 int flag_bracket = 0,opt=0,num_bracket=0,opt_num=0; 74 flag_squ=0; 75 flag_sqrt=0; 76 for(int j=1;j ) { 77 78 flag_sqrt = r.nextInt(4); 79 if(flag_sqrt == 3) { 80 fw.write("√"); 81 } 82 if(j!=1) { 83 flag_bracket = r.nextInt(2); 84 if(flag_bracket == 1) { 85 fw.write("("); 86 num_bracket++; 87 } 88 } 89 90 opt_num = r.nextInt(100)+1; 91 fw.write(String.valueOf(opt_num)); 92 flag_squ = r.nextInt(6); 93 if(flag_squ == 5) { 94 fw.write("^2"); 95 } 96 opt = r.nextInt(4); 97 fw.write(operator_type[opt]); 98 } 99 opt_num = r.nextInt(100)+1; 100 fw.write(String.valueOf(opt_num)); 101 for(int j=0;j ) { 102 fw.write(")"); 103 flag_squ = r.nextInt(2); 104 if(flag_squ == 1) { 105 fw.write("^2"); 106 } 107 } 108 //Windows下的换行,Linux下的换行为\n; 109 fw.write("\r\n"); 110 fw.flush(); 111 } 112 113 }catch(IOException e) { 114 e.printStackTrace(); 115 }finally { 116 if(fw != null){ 117 try { 118 fw.close(); 119 } catch (IOException e) { 120 e.printStackTrace(); 121 } 122 } 123 } 124 125 } 126 //生成高中的题目 127 public static void Output_to_high(File f,int num_exc) { 128 FileWriter fw = null; 129 130 //创建字符输出流类对象和已存在的文件相关联,若文件不存在,则创建; 131 try { 132 if(!f.exists()) { 133 f.createNewFile(); 134 } 135 fw = new FileWriter(f); 136 137 int flag_squ,flag_sqrt,flag_trigo; 138 for(int i=1;i<=num_exc;i++) { 139 fw.write(i+"、"); 140 Random r = new Random(); 141 //操作数的数量 142 int num_opr = r.nextInt(4)+2; 143 //依次为括号的有无,加减乘除操作符,括号的数量,操作数大小,平方标志,开方标志,三角标志 144 int flag_bracket = 0,opt=0,num_bracket=0,opt_num=0; 145 flag_squ=0; 146 flag_sqrt=0; 147 flag_trigo=0; 148 for(int j=1;j ) { 149 150 flag_sqrt = r.nextInt(8); 151 if(flag_sqrt == 7) { 152 fw.write("√"); 153 } 154 if(j!=1) { 155 flag_bracket = r.nextInt(2); 156 if(flag_bracket == 1) { 157 fw.write("("); 158 num_bracket++; 159 } 160 } 161 162 flag_trigo = r.nextInt(5); 163 if(flag_trigo==4) { 164 fw.write(trigo[r.nextInt(3)]); 165 } 166 opt_num = r.nextInt(100)+1; 167 fw.write(String.valueOf(opt_num)); 168 flag_squ = r.nextInt(6); 169 if(flag_squ == 5) { 170 fw.write("^2"); 171 } 172 opt = r.nextInt(4); 173 fw.write(operator_type[opt]); 174 } 175 opt_num = r.nextInt(100)+1; 176 fw.write(String.valueOf(opt_num)); 177 for(int j=0;j ) { 178 fw.write(")"); 179 flag_squ = r.nextInt(2); 180 if(flag_squ == 1) { 181 fw.write("^2"); 182 } 183 } 184 //Windows下的换行,Linux下的换行为\n; 185 fw.write("\r\n"); 186 fw.flush(); 187 } 188 189 }catch(IOException e) { 190 e.printStackTrace(); 191 }finally { 192 if(fw != null){ 193 try { 194 fw.close(); 195 } catch (IOException e) { 196 e.printStackTrace(); 197 } 198 } 199 } 200 201 }
③:程序的持续运行性没有考虑到。该程序运行了一次,打印了一次试卷后就结束了。对用户的体验不好。一个用户应该要有自己选择是否退出的权力,不然对于同一个用户,想打印10张试卷,要登陆十次,这就太麻烦了。
④:没有采用缓冲存储BufferedWriter。程序的性能不高。
⑤:没有实现查重功能,不能对一张试卷上是否有相同题目进行查重。
⑥:平方的输出是^2,而不是日常数学中使用的 “ ² ” 。所以对于用户来说是不友好的。作为一张试卷是不合格的。这里面设计到的内容是编码格式,我们一般的Java的编码格式是GBK格式,而GBK格式是存不进 “ ² ” 符号的,所以需要把自己的格式转化为UFT-8,这样才能存入 “ ² ” 。
⑦:代码的注释不够详细,只有一些比较概念性的注释,比如这个函数的功能是什么。 对于里面实现的细节注释少,并且函数体太长,冗长的函数体里面注释太少,对于程序维护者,观看者来说太难受了。
⑧:终于讲到优点来了,代码的格式比较标准,变量的命名几乎都是用的英文缩写,所以变量的含义便于人的理解。(小声bb一下,期待有一天中文拼音可以成为主流。毕竟英文缩写对于英语不好的人来说,很难受)。