WC个人项目(JAVA)
一、github地址
https://github.com/Mexinz/WC/tree/master
二、PSP表格
Planning | 计划 | 30 | 46 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 46 |
Development | 开发 | 1100 | 1177 |
· Analysis | · 需求分析 | 30 | 30 |
· Design Spec | · 生成设计文档 | 30 | 45 |
· Design Review | · 设计复审 | 30 | 40 |
· Coding Standard | · 代码规范 | 20 | 20 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 720 | 752 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 200 |
Reporting | 报告 | 90 | 85 |
· Test Report | · 测试报告 | 30 | 35 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 35 |
合计 | 1220 | 1308 |
三、解题思路
文件IO操作
这是一个处理文本的程序,需要用到Java的IO流和正则表达式,IO流分为字节流和字符流,我用到了FileInputStream和BufferedReader两个输入流(该程序不涉及写操作不需要输出流),因为解析的是代码文件,其中都是字符,所以用BufferedReader字符流进行操作会更加简单便捷
设计模式
输入不同的参数需要对文件进行不同的解析,而这些文件解析对象都是相似的,因此使用简单工厂模式,当以后有改变时,修改工厂类方法即可。并且文件解析对象没有实例变量,在全局中每种文件解析对象也只需要一个,因此也使用了单例模式,减少内存的占用。
结果的封装
无论是处理成功的结果还是处理失败的结果,为了便于上层统一处理,成功和失败的结果对象实现了一个统一的接口。将具体实现和业务逻辑分离开,增加程序的可扩展性。
错误类型
因为用户总会有奇怪的输入,因此会出现不同的错误,为了程序的可读性和可维护性,将错误定义成枚举类
通配符?和*
在递归处理中,将通配符转换成相应的正则表达式进行匹配。将上层的目录部分截取出来获取该目录下的所有文件,再通过正则表达式进行匹配筛选出正确的文件。
图形界面
使用idea中的GUI Former拉出一个简单的界面,添加listener到按钮上,再将处理后的结果呈现在textArea上。
测试
以前对待测试没有特别认真,就是简单用Junit测一下,这次上网查了下如何检测测试分支覆盖率,发现idea自带的插件结合Junit就可以,十分方便快捷。
四、设计实现过程
代码组成:
运行流程:
五、测试运行
测试文件包括空文件、只有一个{的文件、只有一对{}的文件、单个字符、一个单词、一对{}括住一个单词、一行代码、正常的java源代码、正常的源代码txt文件
测试非递归功能
/**
* 非递归
*/
@Test
public void testSingle() {
Counter counter;
for (String url : Constants.testFiles1) {
for (String param : Constants.testParams) {
counter = CounterFactory.getCounter(param);
if (counter == null) {
System.out.println(ErrorEnum.WRONG_PARAM);
} else {
counter.analyseFile(url).showResult();
}
}
}
}空文件:
单个字符:
单个单词:
单独一行:
正常的源代码文件:
参数错误:
文件不存在:
测试递归功能
/**
* 递归
*/
@Test
public void testRecursion() {
RecursionCounter recursionCounter;
List<Result> resultList;
for (String url : Constants.testFiles2) {
for (String param : Constants.testParams) {
recursionCounter = new RecursionCounter(CounterFactory.getCounter(param));
resultList = recursionCounter.getResultList(url);
for (Result result : resultList) {
result.showResult();
}
}
}
}路径下有多个文件:
配合通配符(url为 testFiles/?ord*.java):
图形化界面:
经检查,运行结果均与预期结果一致
测试分支覆盖率:
六、项目总结
本次WC项目使用Java编程,Maven作项目依赖管理,Junit框架作测试,idea自带插件作测试分支覆盖率检测插件。在项目的开发过程中,我意识到一个好的项目架构对于后期开发的重要性。前期的准备,需求分析,项目框架的搭建,都比真正写业务代码重要的多。在前期多运用面向对象的方法去写出可维护性和可拓展性高的代码,意义更为重大。