软工网络16个人作业2——WordCount
1.博客地址:
https://gitee.com/piraat/PersonalProject-Java
2.PSP表格
PSP2.1 | 个人开发流程 | 预估耗费时间(分钟) | 实际耗费时间(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 23 |
· Estimate | 明确需求和其他相关因素,估计每个阶段的时间成本 | 15 | 23 |
Development | 开发 | 315 | 349 |
· Analysis | 需求分析 (包括学习新技术) | 30 | 37 |
· Design Spec | 生成设计文档 | 15 | 14 |
· Design Review | 设计复审 | 15 | 6 |
· Coding Standard | 代码规范 | 15 | 13 |
· Design | 具体设计 | 60 | 37 |
· Coding | 具体编码 | 100 | 67 |
· Code Review | 代码复审 | 20 | 12 |
· Test | 测试(自我测试,修改代码,提交修改) | 60 | 163 |
Reporting | 报告 | 45 | 45 |
· | 测试报告 | 15 | 21 |
· | 计算工作量 | 15 | 10 |
· | 并提出过程改进计划 | 15 | 14 |
3.计算模块接口的设计与实现
需求分析
解题思路描述:
- 首先,分析wordcount项目的基本要求,我们需要将文本文件读入。
- 然后进行字符数、行数、单词数等统计,因为此处规定了单词标准,所以我们此处可以用正则表达式进行匹配。
- 最后,考虑将统计好的数据输出。
资料查询:
正则表达式:我们用到了正则表达式。虽然在学习JAVA时初步了解过正则表达式,但因为长时间不用还需要温习一下。菜鸟教程——正则表达式,我想到可以用\b在单词前方标记边界,而后是四个必须的英文字母,即四个[a-zA-Z],跟着可有可无的数字或字母[A-Za-z0-9]*,最后以\b标记边界。
代码组织
-
WordCount类: 此类是核心类,用来统计字符数、行数等数目。方法如下:
- countChar方法:统计字符数
- countLines方法:统计行数
- countWords方法:统计单词数
-
File类: 此类的作用在于处理文件相关的内容,例如从文件读取,输入到文件中等操作:
- readFile方法:读取文件
- WriteFile方法:写入文件
-
Main类: 调用前两类,进行功能整合
算法的 关键之处 就在于用正则表达式匹配相应的词,再用find循环将group字符串对象放入hashmap中
我认为我的代码并没有什么 独到之处,运用正则表达式,让我重新温习了一下上学期学习印象不深的内容算是这段编程我比较满意的地方,新了解了包括matcher类的find()方法、group方法是本次实验的我的一大收获。
核心代码:
4.模块改进
第一次用jprofiler,在设置了IDE Integrations和perspective后,我没有发现profile as中的java application
因为jprofiler在进程结束后直接结束了,所以我在main方法里加入了一个Thread.sleep来观察,这样就不知道进程的时间了,不知道这么用是不是正确的,以下是结果:
我通过jprofiler了解到char[]占用的内存极多,然而不知道如何改进。
修改:
测试一个4.84mb文件
应用jprofile9:
5/6.单元测试与异常处理
- 首先是文件读取,处理未输入文件名或文件不存在的情况
- 随后是t1 正常 t2 空 t7 空格制表回车符
- 最后是测试统计单词
- 覆盖率
7.实验后记
完成实验后,我已将PSP实际应用时间记录到了上面的表格中。
回顾此次实验,通过PSP记录了自己的时间分配以后,我的确能发现许多问题。在具体编码阶段的偷懒能造成debug时候的巨大麻烦。当然,这不是我第一次领悟到这一点。然而将时间记录下来直观看起来,我花了将近三倍时间用于debug。有些错误是因为我当时的不上心或是不太清醒,例如将map的sort方法写入了for循环里;有些是基础不扎实,例如我忘记了bufferedreader的readline不会返回\n\r,这导致在统计字符要求包括\n\r时造成了巨大误差,我又添加上了另一个readfilebystream方法。这都是我以后编程要注意的地方。
另一个不完美的地方是jprofile的使用方法我还是一头雾水。一是到现在我还没有解决license问题用着试用版,我在官方网站上下载了10.1.3后试过了许多license都不行,要么是在start center时提示license invalid,要么是干脆在安装时提示invalid key。二是,按照网络上的知道,用profile as→ 1 java application来监听运行的java程序,然而我的profile as 后没有选项,不知道是不是我的用法错误。
总的来说,此次实验有许多可以改进的地方。