一、github地址
http://github.com/jingshanccc/software-engineering
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 860 | 740 |
· Analysis | · 需求分析 | 30 | 50 |
· Design Spec | · 生成设计文档 | 40 | 50 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 | 10 | 10 |
· Design | · 具体设计 | 70 | 50 |
· Coding | · 具体编码 | 600 | 500 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 50 | 30 |
Reporting | 报告 | 120 | 120 |
· Test Report | · 测试报告 | 60 | 50 |
· Size Measurement | · 计算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 40 |
合计 | 1040 | 890 |
三、解题思路
1. 看到题目的要求,其实难点不在项目功能的实现,毕竟之前Java课程已经有类似的程序设计,基本的计算字符数、单词数和行数的功能已实现过,重点应该在熟悉个人软件开发流程(PSP)以及对软件的测试。
2. 动手编程之前,阅读了《构建之法》的前三章,按照PSP的步骤确实对整个项目的开发起了较大的积极作用。从用户角度出发,结合需要实现的功能,按照一个用户的操作步骤开始,设计了检查输入、判断输入、具体处理等过程(听起来一点都不Java)。对于这种类型(流程清晰、问题明显)的项目开发总是很自然地用上了分析过程的方法。
3. 实际上实现功能的时候确实还遇到了一些难题。像对绝对路径和相对路径的支持、递归的具体实现、注释行的正确计算,都算的上是项目的难点。
四、设计实现过程
1. 检查输入:设计此校验的原因是本项目的特殊性,依赖用户输入进行处理和反馈,确保输入正确后才进行具体的处理,避免由于错误输入产生不可控的结果导致用户体验极差。根据题目要求,分析所有允许的输入情况,对用户输入进行检查。
2. 具体处理:对文件的操作封装在getCount函数中,用于获取字符数或行数等,通过判断输入参数类型调用baseFuntions()获取getCount()的处理结果,递归功能的实现通过getFileByType()获取所有符合条件的文件再调用baseFuntions()获得结果。由于处理结果的返回需要支持控制台输出和图形界面的展示,为了降低代码的复杂度,设计时将基本功能的实现封装成函数,并将处理结果直接打印到控制台,图形界面展示时,只需接管控制台输出流,即可得到处理结果完成展示。
3. 各函数之间的关系:
五、测试
1.单元测试:针对单个功能
@Test public void baseFunctions() { System.out.println("baseFunctions方法测试"); String path = System.getProperty("user.dir")+ File.separator+"resources/files/test.java"; Listparams = Arrays.asList("-c","-l","-w","-a"); for (String s : params){ WC.baseFunctions(s,path); //测试了getCount方法 } } @Test public void checkParams() { System.out.println("checkParams方法测试"); List commands = Arrays.asList("-d x.txt","-a 1.txt","-s -a *.txt","-c .java","-s *.txt","-x -x -x"); for (String command:commands){ if (WC.checkParams(command.split(" "))){ System.out.println(command+"是正确的命令"); }else { System.out.println(command); } } } @Test public void getFileByType() { System.out.println("getFileByType方法测试"); String path = System.getProperty("user.dir")+ File.separator+"*.java"; String dir = path.substring(0, path.lastIndexOf(File.separator)); //路径 String type = path.substring(path.lastIndexOf(".")); //类型 File file = new File(dir); List results = new ArrayList (); WC.getFileByType(file,type,results); System.out.println("所有"+type+"文件:"); for (File f:results) System.out.println(f.getAbsolutePath()); } @Test public void improvePath(){ System.out.println("improvePath方法测试"); String[] paths = new String[]{"x.txt","C:\\Users\\ASUS\\Desktop\\helloworld.c"}; for (String path:paths){ //String oldPath = path; System.out.println("输入路径:"+path); path = WC.improvePath(path); System.out.println("处理后路径:"+path); //Assert.assertEquals(oldPath,path); } }
测试结果:
2.系列测试:测试系统功能
a. 基础功能 b.扩展功能
c.图形界面
六、总结
本次项目最大的收获就是感受了个人软件开发流程(PSP)以及复习了Java文件操作、单元测试等,另外第一次接触到了代码覆盖率。