一、Github地址:https://github.com/dzg01/WC
二、PSP表格
PSP2.1 |
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 45 |
Estimate | 估计这个任务需要多少时间 | 30 | 25 |
Development | 开发 | 800 | 720 |
Analysis | 需求分析 | 60 | 50 |
Design Spec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 30 | 20 |
Coding Standard | 代码规范 | 30 | 25 |
Design | 具体设计 | 100 | 70 |
Coding | 具体编码 | 800 | 660 |
Code Review | 代码复审 | 40 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 270 |
Reporting | 报告 | 100 | 120 |
Test Report | 测试报告 | 60 | 90 |
Size Measurement | 计算工作量 | 30 | 45 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 2260 | 2250 |
三、解题思路
1.基本功能。在对需求分析完毕后,我了解到该项目就是传递参数对选定的文件进行统计功能。由于基本的统计字符数,行数,单词数功能在以前做JAVA课设时有涉及到,这一部分功能的实现很快就能想好。通过循环读取文件的每一行内容进行统计,字符数为每一行的长度相加,每一次循环行数加一,直至文件读完。
2.扩展功能。扩展功能是对行数,注释行,代码行进行统计,比较难的是判断注释行的逻辑。注释行分为单行注释//和多行注释/* */,通过一个flag标记就可以判断当前是否注释行。空白行在源文件中除了空字符还有单个字符“{、}、;”,还需要判断是否在注释行里面,其余的情况则都是代码行。
3.递归处理。通过递归处理目录下符合条件的文件,在编码过程中,为了方便我将后缀为.cpp的源代码设为符合条件的文件。这个功能的实现主要是先要获取目录的文件,将符合条件的文件加入到arrayList数组中,然后再遍历所有的文件,判断是否为文件夹,如果是则进行递归,若不是则调用写好的各个功能模块。
4.高级功能。高级功能比较简单,通过图形界面选取文件并显示出文件的统计信息。使用window builder很快就可以做好界面,这里我只实现了选取单个符合条件的文件并显示,界面做得相对简陋。
5.程序在命令行中运行,应该打印出相关使用信息,让用户输入正确的格式,程序要对一些不合理的输入进行提示,捕获异常。
四、设计实现过程
代码分为五个模块:基本统计功能countWC类、扩展功能extendWC类、递归处理processWC类、图形界面showWC类、功能调用workWC类
1.workWC类:主类,程序的入口,获取用户在命令行输入的参数,根据用户输入的内容,调用各个模块。
2.countWC类:基本统计类,参数传给BasicCount函数实现基本统计功能。
3.extendWC类:拓展类,参数传给ExtendCount函数实现拓展功能。
4.processWC类:递归处理符合条件的文件和文件夹,用户输入数组作为参数传给AllCount函数实现递归。
5.showWC类:图形界面类,显示出所选取的文件的各种信息。
五、测试结果
测试文件:空文件、只有一个字符的文件、只有一个单词的文件、只有一行的文件、一个典型的源文件、源文件夹
以下采用手工测试:
1.测试空文件
2.测试一个字符文件,单行文件
3.测试一个单词文件
4.测试代码文件
贴出部分文件内容
5.测试递归处理
贴出文件部分内容(选取本地的代码文件)
部分测试结果
6.测试图形界面
验证后得出处理结果与实际相符!
代码覆盖率
使用eclipse中的EclEmma插件得出覆盖率,还有改善空间。
六、个人总结
完成这次的个人项目,收获还是相当大,又有一次实践的机会来提升自己的编程能力,还能在做项目的过程学习软件工程的知识。其实还有相当多的改善空间,比如测试 ,这次用的是手工测试,改进的话可以用JUnit来编写测试程序。还有缺少用户帮助信息,没有给用户提供一个用户手册,因为是手工测试,在进行测试时输入的都是正确的格式,但考虑到实际应用中难免有各种输入,改进的话可以处理这些错误的输入,提示用户该怎样输入。这次编码过程比预计的要快,但其实很多逻辑一开始测试的时候都有各种各样的bug,处理这些也是费了不少功夫。总的来说,受益匪浅。