wordcount第四周小组作业

时间:2022-12-20 08:06:47

一、小组GitHub地址

 https://github.com/muzhailong/wcPro.git 

二、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界面,文件选择器的使用十分方便;

对于工具类,在该方法可以正确运行的情况下,我们只需要通过判断生成的文件的内容就可以得出结果。

wordcount第四周小组作业

五、开发规范说明

 开发规范采用的是《阿里巴巴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