WC项目(Java)

 

一、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. 各函数之间的关系:

 

 WC项目(Java)_第1张图片

 

 

 

 五、测试

  1.单元测试:针对单个功能

    @Test
     public void baseFunctions() {
        System.out.println("baseFunctions方法测试");
        String path = System.getProperty("user.dir")+ File.separator+"resources/files/test.java";
        List params = 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);
        }
    }

 

    测试结果:

WC项目(Java)_第2张图片WC项目(Java)_第3张图片

 

   2.系列测试:测试系统功能

    a. 基础功能          b.扩展功能

WC项目(Java)_第4张图片WC项目(Java)_第5张图片

  c.图形界面

 WC项目(Java)_第6张图片WC项目(Java)_第7张图片

六、总结

   本次项目最大的收获就是感受了个人软件开发流程(PSP)以及复习了Java文件操作、单元测试等,另外第一次接触到了代码覆盖率。

 

你可能感兴趣的:(WC项目(Java))