• 第三次作业


    1、

    结对使用的Github项目地址 https://github.com/Cherish599/WordCount.git
    作业地址  https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/2879
    结对伙伴的作业地址

    2、我这次结对编程是和我室友胡杨帅一起进行的。我主要负责代码的编写部分,他负责测试部分。

     PSP表格

    PSP2.1

    Personal Software Process Stages

    预估耗时(分钟)

    实际耗时(分钟)

    Planning

    计划

     20  22

    · Estimate

    · 估计这个任务需要多少时间

       

    Development

    开发

     270  320

    · Analysis

    · 需求分析 (包括学习新技术)

     20  20

    · Design Spec

    · 生成设计文档

       

    · Design Review

    · 设计复审 (和同事审核设计文档)

       

    · Coding Standard

    · 代码规范 (为目前的开发制定合适的规范)

     20  20

    · Design

    · 具体设计

       

    · Coding

    · 具体编码

     240  260

    · Code Review

    · 代码复审

     20  25

    · Test

    · 测试(自我测试,修改代码,提交修改)

     20  20

    Reporting

    报告

       

    · Test Report

    · 测试报告

     10  10

    · Size Measurement

    · 计算工作量

       

    · Postmortem & Process Improvement Plan

    · 事后总结, 并提出过程改进计划

     20  15
     

    合计

     400  432

    3、计算模块接口的设计与实现过程:

      首先,我们俩先对这个项目进行了分工。我主要负责代代码编写这一块。经过我们俩的讨论,我们俩列出了一个程序的整体框架。对于程序的基本功能部分,由于比较简单,实现起来也不复杂。就分别写了几个函数,然后在Main()函数中调用即可。如下图所示:

     对于解题思路:

      在CountChars()这个函数中,我们把整个文档遍历了一遍,然后筛选每个Ascii码字符,并统计总的字符个数;

      在Countlines()这个函数中,我们统计文章中的换行符,每统计一个,lines++;

      在CountWords()这个函数中,我们先去掉了文档中的所有的特殊符号,然后把所有的字符转换成了小写,这样就不用区分大小写的问题了,然后遍历以空格来分隔每个单词;最后看每个单词是否至少以4个英文字母开头,跟上字母数字符号,如果满足条件,words++;

      在CoutWords()这个函数中,因为要输出的是单词出现的频率,并且要输出前几个出现频率最高的单词和相应的频率,因为之前我做过相同功能的程序,上次做的就是用的字典类型,所以这次做这个功能有点经验。至于排序的问题,我之前是写了一个排序的方法,不过这次我了解到,原来C#的字典类型中有自带的排序的方法,这次就直接用了自带的方法。比上次实现好了很多。

    我们使用了著名的戏剧作品《哈姆雷特》英文版作为测试。运行结果如下:

      接下来就是作业的第二个要求,用一个接口来封装不同功能的函数:

     1 interface library
     2     {
     3         string ReadFile(string path);   //用于打开文件
     4         int CountChars(string text);    //用于统计文档中的字符个数
     5         int CountLines(string text);    //用于统计文档行数
     6         int CountWords(string Text);    //用于统计文档中单词的个数
     7         Dictionary<string, int> Countphrase(string text, int n);    //用于统计文档中的短语的频率
     8         Dictionary<string, int> CoutWords(string text, int n);      //用于统计文档中的单词的频率
     9         void WreteFile(string path);    //用于创建一个文件,将统计结果保存在文件中
    10 
    11     }

      在第二步的基础上,我们便开始了第三个要求的编码。第三个要求是在cmd命令行中传入参数,然后按照不同的参数,实现不同的功能。并且在第一步的基础上增加了词组统计和自定义输出两个新的功能。词组的统计其实是和单词的统计是差不多的,还是要用到字典类型。我在Countphrase()中新增了一个数组,用来记录每一定长度的词组,然后统计它出现的频率。至于自定义输出功能,是比较简单的文件操作,就不在详细说明了。

     

    同样选著名戏剧作品《哈姆雷特》英文版,运行结果如下:(由于文本较长,没有将所有的词组全部截屏)

    4、代码规范与代码复审过程 :

      当我写完代码给胡杨帅看的时候,他看了之后给我提了几个意见。第一个就是代码空的行数太多的问题,使得代码看起来不怎么美观;其次就是代码的命名有一些不妥,尤其体现在变量名的命名上面。就像这样:

    之后我对所有的代码进行了规范,严格按照邹欣老师书中的代码规范与代码复审的方法,把所有的代码都改了一遍。

     

    5、 测试运行通过:

    测试部分由胡杨帅完成

    单元测试:(这次我们俩测试了几个重要的函数,可以看到全部通过)

     

     性能测试:

     

      从上面的分析可以看到主程序和CoutWords()这个函数所消耗的CPU是最大的。这个也可以理解,一方面是因为CoutWords()这个函数是用来统计hamlet.txt中的所有单词的出现频率的,要不停的遍历整个文档,并且这个函数用到了字典类型。我暂时还没有想到更佳的优化方法。另一方面是因为hamlet.txt中有着数万个的单词,本身单词数量比较多。

    6、git提交部分:(有了以上一次的经验之后,对git的使用相对还是比较熟练了)

    这是对基础功能部分的提交:

     

    这是增加新功能的一部分的提交:

    7、总结:

      结对编程确实能够在一定程度上提高两个人编程的效率。提高了更好的设计质量,毕竟两个人考虑的要比一个人全面一点。不过由于是第一次结对编程,我们俩在配合的过程中还出现了一点问题,比如说沟通方面的问题,有时候会为了一个不一致的意见争论半天。总体来说,本次结对编程还是比较成功的,确实是1+1>2。

  • 相关阅读:
    ansible-乱
    linux-PXE-12
    linux-ntp-10
    linux-selinxu---性能 -8
    linux-系统启动流程-7
    linux-网络管理-6
    linux-文件系统-5
    linux-包管理器-4
    linux-shell脚本基础-2
    linux-history-ps1-1
  • 原文地址:https://www.cnblogs.com/cherish599/p/10651461.html
Copyright © 2020-2023  润新知