一、小组GitHub地址
二、PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
30 |
30 |
· Estimate |
· 估计这个任务需要多少时间 |
20 |
20 |
Development |
开发 |
480 |
480 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 |
30 |
· Design Spec |
· 生成设计文档 |
30 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
30 |
· Design |
· 具体设计 |
30 |
30 |
· Coding |
· 具体编码 |
240 |
240 |
· Code Review |
· 代码复审 |
30 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
180 |
240 |
Reporting |
报告 |
90 |
90 |
· Test Report |
· 测试报告 |
60 |
60 |
· Size Measurement |
· 计算工作量 |
30 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
三、模块编写和测试
这次的小组作业我负责的是UI和util类。
3.1 UI设计
功能:实现一个方便交互的UI。
实现:这个就比较简单,这里采用了文件选择器,可以很方便的制作一个UI界面。
1 package com.ui; 2 import java.io.File; 3 import javax.swing.JFileChooser; 4 5 /** 6 * ui界面模块类 7 * @author wangyuzhe 8 * 9 */ 10 public class WordSelector { 11 /** 12 * 文件选择器 13 */ 14 JFileChooser jfc = new JFileChooser(); 15 16 /** 17 * 设置界面ui 18 */ 19 public WordSelector() { 20 jfc.setCurrentDirectory(new File("c:\\")); 21 22 } 23 /** 24 * @return 使用ui界面选择的文件 25 */ 26 public File select() { 27 jfc.setFileSelectionMode(0); 28 int state = jfc.showOpenDialog(null); 29 if (state == 1) { 30 return null; 31 } else { 32 return jfc.getSelectedFile(); 33 } 34 } 35 }
3.2 util设计
功能:生成随机的文件供测试使用
实现:这里是对于指定的文件(如果不存在会自动新建)和给定一个文件大小进行操作,下面的代码中文件大小设置成了1KB,然后产生的随机文件。文件内的所有字符均是符合作业要求的字符,即英文大小写字母、数字和常用字符。
1 package com.util; 2 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileWriter; 6 import java.io.IOException; 7 import java.util.Random; 8 9 /** 10 * 工具类 11 * @author wangyuzhe 12 * 13 */ 14 public class Utils { 15 16 private Utils() { 17 } 18 19 /** 20 * 随机数类 21 */ 22 private static Random random = new Random(); 23 /** 24 * 合法字符集合 25 */ 26 private static String str = "abcddefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!" 27 + "#%^&*_…()[]+=-:'\"|<>,./? \n\t\r0123456789"; 28 29 /** 30 * @param fn 文件名 31 * @param sz 文件的大小 单位字节 32 */ 33 public static void randomFile(String fn, int sz) { 34 File f = new File(fn); 35 StringBuilder sb = new StringBuilder(sz * 2 / 3); 36 BufferedWriter writer = null; 37 try { 38 writer = new BufferedWriter(new FileWriter(f)); 39 char c = 0; 40 int len = str.length(); 41 for (int i = 0; i < sz; ++i) { 42 c = str.charAt(random.nextInt(len)); 43 sb.append(c); 44 } 45 writer.write(sb.toString()); 46 } catch (IOException e) { 47 e.printStackTrace(); 48 } finally { 49 try { 50 writer.close(); 51 } catch (IOException e) { 52 e.printStackTrace(); 53 } 54 } 55 } 56 57 /** 58 * 测试生成随机文件 59 * @param args 命令参数 60 */ 61 public static void main(String[] args) { 62 String fn="1.txt"; 63 int sz=1024*1;// 1k 64 randomFile(fn,sz); 65 } 66 }
四、测试设计过程
需要实现的目标:UI类:可以正确的与用户交互即可。
util类:正确运行,且运行时间不应过长;
生成的文件中,所包含的字符应是属于3.2中str字符串中的某一个字符,即要满足作业的要求;
同时要保证生成的文件内容是随机的,这样用于测试其他的模块可以保证实验结果的随机性与正确性。
本模块需要测试的内容并不是很多。
对于UI界面,文件选择器的使用十分方便;
对于工具类,在该方法可以正确运行的情况下,我们只需要通过判断生成的文件的内容就可以得出结果。
五、开发规范说明
开发规范采用的是《阿里巴巴Java开发手册终极版v1.3.0.pdf》
选定的开发规范:
常量定义
1. 【强制】不允许任何魔法值(即未经定义的常量)直接出现在代码中。
2. 【强制】long 或者 Long 初始赋值时,使用大写的 L,不能是小写的 l,小写容易跟数字 1 混 淆,造成误解。
3. 【推荐】不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。 说明:大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。
代码格式
1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果 是非空代码块则:
1) 左大括号前不换行。
2) 左大括号后换行。
3) 右大括号前换行。
4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
2. 【强制】 左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格。
3. 【强制】if/for/while/switch/do 等保留字与括号之间都必须加空格。
4. 【强制】任何二目、三目运算符的左右两边都需要加一个空格。
5. 【强制】采用 4 个空格缩进,禁止使用 tab 字符。
6. 【强制】注释的双斜线与注释内容之间有且仅有一个空格。
7. 【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
OOP 规约
1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可。
2. 【强制】所有的覆写方法,必须加@Override 注解。
3. 【强制】不能使用过时的类或方法。
4. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
5. 【推荐】循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。
6. 【推荐】类成员与方法访问控制从严:
1) 如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。
2) 工具类不允许有 public 或 default 构造方法。
3) 类非 static 成员变量并且与子类共享,必须是 protected。
4) 类非 static 成员变量并且仅在本类使用,必须是 private。
5) 类 static 成员变量如果仅在本类使用,必须是 private。
6) 若是 static 成员变量,必须考虑是否为 final。
7) 类成员方法只供类内部调用,必须是 private。
8) 类成员方法只对继承类公开,那么限制为 protected。
集合处理
1. 【推荐】集合初始化时,指定集合初始值大小。
2. 【推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。
六、交叉代码评审
对于17056同学的代码评审:
以我的水平的来说的话,他的代码都是很优秀的那种,非常值得我去学习。如果真要说问题的话,正如他自己所说:为了测试,他的类全是public那种。
七、作业小结
由于是小组作业,每个人都有具体的分工,也都完成了自己的任务,各得其所,也是很棒的。
在每个成员遇到困难的时候也可以寻求队友的帮助,也是一种非常好的团队体验。
八、小组贡献率
17056:0.46
17051:0.18
17042:0.17
17063:0.19