一、GitHub项目地址
https://github.com/Yuzeduan/WC
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 50 | 55 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
· Development | · 开发 | 960 | 784 |
· Analysis | · 需求分析 | 50 | 60 |
· Design Spec | · 生成设计文档 | 30 | 43 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 | 20 | 20 |
· Design | · 具体设计 | 150 | 50 |
· Coding | · 具体编码 | 400 | 300 |
· Code Review | · 代码复审 | 60 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 180 |
· Reporting | · 报告 | 120 | 120 |
· Test Report | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 2010 | 2159 |
三、解题思路
- 理解基础功能,基础功能是计算文件的行数,字符数等,因此,这些基本功能应该是封装成工具类进行调用,然后外界只需要确定查询的文件,读入便可进行计算。
- 理解进阶功能,进阶功能无非就是修改了参数,因此,我们只需要在第一步的基础上,在判断的条件中增加两个参数,便可以做到递归查询文件还有代码计算的输出,此处递归查询文件,可以复用基础功能的逻辑,所以可以将基础功能抽成单独的方法进行调用。
- 理解高级功能,高级功能是进行界面展示,而之前的功能是进行命令行展示,于是我们可以理解成是一种问题的两种方案,所以,需要在中间加入一层逻辑判断,判断参数,构建出不同的解决方案,而外界只需要进行传入参数调用即可,不需要理会具体的实现,此处应该设计成,方案类继承统一的父类抽象类,在以后扩展解决方案的时候,只需修改中间逻辑层的少部分代码即可实现。
- 程序还应该对一些不合理的输入进行提示,输入有误。
四、设计实现过程
- MAIN类:程序的入口处,只是简单的调用逻辑层的方法,传入参数即可,接下来的工具交给逻辑层进行处理。
- service层:抽象出一个通用的方案抽象类,创建两个实例类继承它,一个是命令行操作,一个是界面操作。创建一个获取对应方案解决类的Manager管理类,MAIN类传入参数,其进行判断,使用什么方案,例如,命令行,那就返回命令行实例类,进行命令行调用解决。在对应的方案类中,判断不同参数,调用底层工具类的方法,获取对应的值
- 底层工具实现类:进行文件的读取,文件的行数,单词等的计算,这个工具跟项目业务无关,因此可以抽成util类。
- 如果是界面展示,则需要一个界面的类,此类由界面方案解决类进行创建,其调用工具类获取到信息之后,进行填充View类进行展示
五、程序结果
1. 基础功能
2. 进阶功能
支持文件通配符,进行文件夹的递归查询子文件
3. 高级功能
选择文件
4. 异常情况
5. 测试文件
六、总结
编写这个个人项目,经历了一个开发的流程,从设计,预算,开发,测试的过程中,学习到了很多关于软件工程的思想,其实实现功能并不难,而将该模块设计好,将所有情况考虑完善才是难的。在开发的过程中,要提到的是,在使用命令行的时候,因为是在编译器直接运行,所以就选择了编译器集成的命令行传参,没有用命令行进行操作,相信这个影响不大。尽管实现的是一个小功能,但还是想把所有方面都想清楚,从设计,搭建框架入手,将小功能实现,遵循开闭原则,做到易扩展,程序有更好的健壮性。