软件工程----WordCount

Posted priatehat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程----WordCount相关的知识,希望对你有一定的参考价值。

Github 项目链接

一.项目简介

能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有 wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

二.完成情况

基本功能:

  • [x] -c <文件名> ,统计文件字符数。
  • [x] -w <文件名> ,统计文件单词数。
  • [x] -l <文件名> ,统计文件行数数。

扩展功能

  • [x] -s <文件路径+类型(?任意)> ,递归符合条件的文件。
  • [x] -a <文件名> ,统计文件代码行,空白行,注释行。

说明:以上命令可叠加使用,即 -c -w -l <文件名> ,统计文件的字符数,单词数和行数。

三.实现思路

WordCount 实现思路如下:

  • 1.获取输入,解析输入的命令和文件路径。
  • 2.检查命令的输入是否正确,文件路径路径是否符合要求。
  • 3.针对不同的命令对文件进行不同的处理。
    • (1).字符数,获取每行的字符数,叠加。
    • (2).单词数,去除特殊字符,统计剩余的字符串组的数量。
    • (3).行数,读取每一个行数据,并统计。
    • (4).查找文件,递归对文件夹进行处理,查找符合条件的文件,支持 ? 匹配任意文件。
    • (5).代码数,注释,空白行数,每次读取时进行判断并统计。
  • 4 .显示,并清除数据。

四.设计流程

设计的流程图:
技术分享图片

代码分包:

技术分享图片

五.代码说明

程序入口,获取输入,并进行解析,若为无输入则退出程序。

public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        String m;
        while (!TextUtil.isEmpty(m = s.nextLine())) {
            String arr[] = m.split("\s+");
            parseCommand(arr);

        }


    }

先检查输入是否正确,若正确则根据时候需要递归文件做不同的处理。

    /**
     * 解析并执行输入的命令
     *
     * @param str 输入
     */
    private static void parseCommand(String str[]) {
        String lastInput = str[str.length - 1];
        if (!checkInput(str)) {
            ListUtil.clear(sCommandList,sArgs);
            return;
        }

        if (sArgs.contains(CommandType.SEARCH_COUNT)) {
            executeWithDir(lastInput);
        } else {
            executeWithFile(lastInput);
        }
        ListUtil.clear(sCommandList,sArgs);

    }

判断输入的命令是否为和合法的命令,并初始化命令处理。

    /**
     * 检查输入是否为正确的输入
     *
     * @param str 输入
     * @return 返回结果
     */
    private static boolean checkInput(String[] str) {
        String args;
        boolean isCorrect = true;
        for (int i = 0; i < str.length; i++) {
            args = str[i];
            if (args.equals(CommandType.CHAR_COUNT) && !sArgs.contains(args)) {
                sCommandList.add(new CharCommand());
                sArgs.add(args);
            } else if (args.equals(CommandType.WORD_COUNT) && !sArgs.contains(args)) {
                sCommandList.add(new WordCommand());
                sArgs.add(args);
            } else if (args.equals(CommandType.LINE_COUNT) && !sArgs.contains(args)) {
                sCommandList.add(new LineCommand());
                sArgs.add(args);
            } else if (args.equals(CommandType.ALL_COUNT) && !sArgs.contains(args)) {
                sCommandList.add(new AllCommand());
                sArgs.add(args);
            } else if (args.equals(CommandType.SEARCH_COUNT) && !sArgs.contains(args)) {
                sArgs.add(args);
            } else if (i == str.length - 1) {
                isCorrect = checkFile(args);
            } else {
                showErrorMsg(args);
                isCorrect = false;
            }

        }


        return isCorrect;
    }

对文件进行检查,分为文件和递归的文件夹。

    /**
     * 检查文件输入是否正确
     *
     * @param args 输入
     * @return 返回结果
     */
    private static boolean checkFile(String args) {

        if (sArgs.contains(CommandType.SEARCH_COUNT)) {
            return checkCommandDir(args);
        } else {
            return checkCommandFile(args);
        }

    }

提示正确的输入。

    /**
     * 显示提示
     */
    private static void showErrorMsg(String s) {
        System.out.println(s + " 不是内部命令!");
        System.out.println("用法:");
        System.out.println("-c <文件名> ,统计文件字符数。");
        System.out.println("-w <文件名> ,统计文件单词数。");
        System.out.println("-l <文件名> ,统计文件行数数。");
        System.out.println("-s <文件路径+类型(?任意)> ,递归符合条件的文件。");
        System.out.println("-a <文件名> ,统计文件代码行,空白行,注释行。");

    }

检查 文件的输入是否正确,以及文件是否存在。

    /**
     * 检查文件输入是否正确
     *
     * @param filePath 输入文件名
     * @return 返回结果
     */
    private static boolean checkCommandFile(String filePath) {
        File file = new File(filePath);
        if (!file.isFile()) {
            System.out.println(filePath + " 不是一个完整或者正确的文件名!");
            return false;
        } else if (!file.exists()) {
            System.out.println(filePath + " 文件不存在!");
            return false;
        }
        return true;
    }

检查文件夹的输入是否正确,文件夹是否存在。

    /**
     * 检查文件夹输入是否正确
     *
     * @param dirPath 输入路径和文件通配符
     * @return 返回结果
     */
    private static boolean checkCommandDir(String dirPath) {
        if (!dirPath.contains("*")) {
            System.out.println(dirPath+"不是一个合法输入!");
            System.out.println("-s <文件路径+类型(?任意)> ,递归符合条件的文件。");
            return false;
        }
        String fileDir = dirPath.substring(0, dirPath.indexOf("*") - 1); // 文件所在文件夹
        File dir = new File(fileDir);
        if (!dir.isDirectory()) {
            System.out.println(fileDir + " 不是一个完整或者正确的文件夹名!");
            return false;
        } else if (!dir.exists()) {
            System.out.println(fileDir + " 文件夹不存在!");
            return false;
        }
        return true;
    }

对文件夹递归得到的所有符合条件的文件进行处理。

    /**
     * 处理文件夹
     *
     * @param input 输入
     */
    private static void executeWithDir(String input) {
        ArrayList<String> list = new SearchCommand().execute(input);
        for (String s : list) {
            System.out.println(s);
            for (Command c : sCommandList) {
                c.execute(s);
            }

        }
    }

对单一的文件进行处理。

    /**
     * 处理文件
     *
     * @param input 输入
     */
    private static void executeWithFile(String input) {
        for (Command c : sCommandList) {
            c.execute(input);
        }
    }

六.测试

空白文件

技术分享图片
技术分享图片

只有一个字符的文件

技术分享图片
技术分享图片

只有一行的文件

技术分享图片
技术分享图片

递归文件调用

技术分享图片

七.项目总结

1.时间统计

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 60
· Estimate · 估计这个任务需要多少时间 180 240
Development 开发 150 180
· Analysis · 需求分析 (包括学习新技术) 15 15
· Design Spec · 生成设计文档 10 10
· Design Review · 设计复审 (和同事审核设计文档) 10 15
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 18 15
· Coding · 具体编码 120 150
· Code Review · 代码复审 30 35
· Test · 测试(自我测试,修改代码,提交修改) 10 10
Reporting 报告 15 20
· Test Report · 测试报告 10 20
· Size Measurement · 计算工作量 15 15
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 12 30
合计 635 825

2.项目总结

Word Count 的难点在于对输入进行判断和对不同的命令的处理的过程,需要理清不同命令参数和最后的文件的路径的输入的关系,在设计之前根据开发 的进度不断扩展,由于将命令处理抽象出来,因而后面的功能的添加较为方便。但是一开始项目的框架流程没有设计好,再添加了检查方法后对流程该较大,因此在开发之前就要设计好整体项目的架构。





以上是关于软件工程----WordCount的主要内容,如果未能解决你的问题,请参考以下文章

软件工程----WordCount

WordCount

软件质量与测试——WordCount编码实现及测试

软件工程:java实现wordcount基本功能

软件质量与测试第4周小组作业:WordCount优化

WordCount-软件测试初体验