WordCountOptimized

本文介绍了一个单词计数模块的设计与实现,包括单元测试、代码规范、同行评审、性能优化等方面的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


基础任务


一、https://github.com/SuperScholar-Z/WordCountOptimized


二、PSP表格


1341770-20180408192037835-1946490809.png


三、单词计数模块的主要代码如下:

    public void Count() throws IOException //统计单词数
    {
        String line;   //读取的一行文本
        while ((line = input.readLine()) != null)
        {
            //单词分割
            ArrayList<String> wordST = new ArrayList<>();
            WordSplit.split(line, wordST);    //单词分割
            if(wordST == null)
                continue;
            for(String m_strWord : wordST) //提取出分割的单词
            {
                Word m_word = new Word(m_strWord);  //逐个单词读入
                int indexOfWord = wordArr.indexOf(m_word);    //单词在容器中的位置
                if (m_word.getStrWord().length() == 0)   //跳过空字符串
                    continue;
                if (indexOfWord == -1)   //单词第一次出现则放进容器
                    wordArr.add(m_word);
                else    //单词重复出现则计数器+1
                    wordArr.get(indexOfWord).incNum();
            }



   在这次小组的作业中,我负责的是单词计数的模块,实现起来并不难。
   首先会读取目标文件,然后调用单词分割模块,将分割好的单词放在数组里。
   然后就进行计数了,如果是一个新的单词,那么就将它加入容器,如果是已经计数过的单词,就将那个单词的数量加一。


四、单元测试设计


  本次测试主要采用白盒测试,并参考黑盒测试方法。其中,白盒测试主要为语句覆盖和条件覆盖。
   首先,这个模块并不难,主要的代码也不多,即使是语句覆盖,也不够二十个,因此,在考虑测试用例时会理所当然的想到排列组合。
  由于各组员所负责模块不同,测试时只测试本模块正确性,所以本次测试默认单词分割和输入输出模块正确,并在测试中去除了排序模块。
  所以,本模块从条件上划分:1、是否为空文件
        2、分割过后所读到的字符串是否为空字符串
        3、是否已经读到过(string已在容器中)
   因此按照条件和语句的划分,本次采用了20个用例。


1341770-20180407215632664-1788212370.png

五、单元测试结果
运行截图如下:


1341770-20180407201650248-1657773058.png


  对于此次测试来说,结果较为理想。
  此模块的内容不多,但是用例却有很多,因此测试的覆盖范围较广,但是却显得20个用例有些冗余了。


扩展任务


一、参考规范“现代软件工程讲义 3 代码规范与代码复审”


http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html


个人理解:代码规范分为代码风格规范和代码设计规范。
  代码风格规范:文字上的规定,我认为这个的最重要的目的是为了方便阅读,方便他人方便自己,方便代码重写重用。
   平时我自己做的比较好的有:缩进、行宽、括号、断行、分行等。
  而平时所做的不够好的地方就是命名和注释:
   命名:我自己一般是命名比较随意的ijk或者什么单词的甚至为拼音的命名,而这么做是不对的。
   现在比较常见为匈牙利命名法,在变量前加上前缀,可以一眼看出变量的类型和相应的语义。
   注释:我的注释要不然是忘了写,要不就是想起来然后写很多。
   但是,实际上应该将注释精简,并且将其中复杂的注释放在函数头。
   代码设计规范:宏观上各部分的通用原则。我认为这里很重要的我平时用的到但我处理的不够好的是异常处理。
   异常处理:我认为这个异常处理并不是像输入输出的时候一个简单的try和catch,而是代码的方方面面。
   比如说各种边界值之类,在对容器文件等操作前判断是否为空,各类值是否会溢出越界等等等等。


二、小组组员部分代码分析


  17105同学的部分代码(输出文件函数)

 private static void ResultOutput(ArrayList<Word> wordArr) throws IOException    //输出统计结果
    {
        File outputFile = new File("result.txt"); //打开存储文件
        BufferedWriter output = new BufferedWriter(new FileWriter(outputFile)); //输出缓冲区
        for(Word word : wordArr)    //将统计结果写入缓冲区
            output.write(word.getStrWord() + "\t" + word.getNum() + "\r\n");
        output.flush(); //把缓存区内容写入磁盘文件中
        output.close(); //关闭文件
    }

   我认为他的代码就是我们所有人的楷模,从风格到设计,都很符合规范:比如说缩进、空行、注释以及异常处理,还有文件的关闭收尾工作。


三、使用findbugs工具。


下载地址:http://findbugs.sourceforge.net/


四、对本次代码进行扫描,结果如下图:


1341770-20180407231859461-773024864.png


  没有出现bug
  但是有着编程方面的坏习惯,命名问题:Count函数开头应为小写字母;字符串比较应用.equal()方法
  还有一个问题是对于输出格式的问题,没有指定格式。
  解决方法:加一句FileOutputStream(outputFile),"UTF-8")));
    以指定文件的输出编码格式为"utf-8"。


五、小组讨论


  整个小组存在问题基本相同,没什么大问题,命名上有点小问题,注释非英文,其他的都还好,因为扩展任务的都是调试过的,没有设计问题。


高级任务


一、测试集选用了乔布斯传,具体参数信息如下:


1341770-20180408180656818-1745644855.png


二、优化前性能指标


1341770-20180408184546749-1053074441.png

  测试了十次结果分别为:
    程序运行时间:2315ms
    程序运行时间:2276ms
    程序运行时间:2277ms
    程序运行时间:2191ms
    程序运行时间:2200ms
    程序运行时间:2287ms
    程序运行时间:2389ms
    程序运行时间:2338ms
    程序运行时间:2294ms
    程序运行时间:2336ms
  平均运行时间:2290.3ms


三、同行评审


  本次评审所担任角色为:
    作者:钟芳郅、胡天池、黄一桐、刘弋。
    讲解员:钟芳郅、胡天池、黄一桐、刘弋。
    评审员:胡天池、刘弋。
    主持人:钟芳郅。
    记录员:黄一桐。
  评审过程:由主持人主持,各小组成员讲解自己所负责的模块的代码,评审员提出评审意见,记录员负责记录,最终讨论得出评审结论。
   评审意见和结论:本程序效率主要受核心功能即单词分割、统计计数、排序影响。


四、性能分析


  通过测试,我们发现制约程序性能指标的主要因素是单词分割、计数、排序方面,即和同行评审结果相似。


五、性能优化


  1、统计计数,由于要在数组中查找该单词是重复出现的单词还是新出现的单词,因此此时使用Map容器会比ArrayList容器更为快捷,因此Map容器基于二叉树,按值查找的效率较快。
  2、排序时使用较高效的算法,如归并排序,可以加快排序的效率。


优化后的性能指标如下图:
1341770-20180408233546946-1392718996.png


  此次优化十分理想,将类的ArrayList换成hashmap之后,程序的运行时间降低到了0.135左右。十次运行结果在0.126~0.142之间。


六、总结


  软件开发、软件测试、软件质量这三者是密不可分的。其中,软件开发属于前期工作,软件测试为后期工作,但是,在软件的开发过程中也会进行许许多多的测试,去保证程序的正确性,找出程序的错误,但是这个阶段测试的方法可能不太规范。而在软件测试阶段,我们需要以更缜密的思维,并使用规范科学的方法去设计测试用例,并使之保证无误。而在之后的静态测试,结果还算理想。我是第一次知道并且使用工具对代码进行测试,知道了还可以使用工具找出程序中的问题及规范性,再今后还是可以借鉴的。最后的性能测试则是另一重点,这与软件质量是息息相关的,一个好的程序离不开优化,对程序的优化可以使性能大大提升。


七、小组贡献率


  0.23

转载于:https://www.cnblogs.com/h-t-c/p/8734607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值