软工第四次作业——结对编程

项目地址 https://github.com/Misizu-star/WordCount.git
结对伙伴 贾青虎
伙伴学号 201831061129
伙伴博客地址 https://www.cnblogs.com/wobuhuiqiao/

一、PSP表格

软工第四次作业——结对编程_第1张图片

二、模块设计与实现

1.代码结构:

程序由一个 wordsCount 类, main() 主函数和 Getop(string cmd) 获取命令参数函数构成。其中 wordCount 类成员中含 Char_num()Lines_num() 等函数。思维导图如下:
软工第四次作业——结对编程_第2张图片

2.关键函数实现:

  • int wordsCount::Char_num() :获取ascii数

    获取输入文件路径后,通过对文件内容逐个读取,并只对ASCII码进行计数。

  • int wordsCount::Lines_num() :获取文件行数

    使用 getline() 函数获取文件的每一行对行数进行计数。

  • void wordsCount::GetWords()、int wordsCount::Words_num() 、void wordsCount::Sort_words_rate()

    由于对单词时有额外的要求:单词计数,按照出现频率和字典排序,以小写输出。所以使用多个函数实现:
    • (1) void wordsCount::GetWords() :逐个读取文件字符,将所有符合要求的“单词”提取出来,转为小写形式后(使用 algorithm 头文件中的 transform() 函数 ),存放在一个 vector< string > 容器中。
    • (2) void wordsCount::Sort_words_rate() :对于统计词频首先想到的是用 pair 记录词频,排序则使用algorithm头文件下的 sort() 函数。于是乎为了方便统计词频,先排序,使相同的单词在一块儿,再统计词频,统计好的词频存放在 vector> 中,再对其词频进行排序。(sort()函数中第三个参数提供了自定义排序标准)
  • __main(int argc, char *argv[])__ :主函数

    main()函数主要接受用户从操作系统传入的参数,参数通过Getop()函数解析后执行不同的输出。

3.编程思想体现

  • Interface Design:

    对于接口的设计,我们将wordCount这个类中所有属性和成员函数的定义与实现分开

  • Information Hiding:

    信息隐藏,简单地说就是是否可见与是否可用。
    • 不可见不可用:
      我们将类的属性和成员定义放在wordCount.h的头文件中,实现部分放在wordCount.cpp中,使类中内容对外部而全然隐藏。
    • 可见不可用:
      通过使用privateprotect对类中成员和属性进行修饰。包含头文件后,即使能看到这些属性,却无法使用它们。

具体效果如图:
软工第四次作业——结对编程_第3张图片
软工第四次作业——结对编程_第4张图片

4.程序运行结果

软工第四次作业——结对编程_第5张图片
软工第四次作业——结对编程_第6张图片

三、代码复审

1.编码规范:

我与我的伙伴采用的是google的 c++ 编码规范。
中文版
英文版
google c++ 编码规范

2.复审过程:

复审过程中由于vs2017能够进行基本的规范检查,若编码不规范则会有各种提示。而且能够智能缩进,大大提高了我们的编码规范性。如图:

同时在复审中也发现我们对函数的命名比较随意,如出现“int num”这些指意不明的变量,以及对“驼峰命名法”意识不强。(以后会注意并在编码中逐步改进)

四、性能分析

Visual Studio 内置了非常棒的效能工具——性能探查器。点击 IDE 顶部菜单栏中的 分析 ,即可看到 性能探查器

软工第四次作业——结对编程_第7张图片

软工第四次作业——结对编程_第8张图片

从分析图中ShowWords_rate()函数的消耗占用了43%之多,这是由于此函数需要依赖类中的另外两个个函数,为了能够直接调用,在此函数中内嵌了其他函数的调用。

所以使用这一个函数实则是这三个函数的消耗总和。若把这三个函数拆开,三个函数总消耗减少不明显,但这样却破坏了封装性。

五、单元测试

单元测试采用“白盒测试”,分别对各个模块和函数进行测试。
由于某些函数修改了对象的状态,模拟对象真的...太困难了,所以只测试了Char_num(),int Lines_num(),int Words_num();这些函数中有调用未测试的函数,所以通过测试这些函数的正确性从而检验未测试函数的正确性。

开始测试时发现文件存在,但是文件总是打不开。多次试验后发现测试中的待打开的文件不能与代码放在一起,需要放在与后缀为“.exe”相同的路径下。
软工第四次作业——结对编程_第9张图片
软工第四次作业——结对编程_第10张图片
软工第四次作业——结对编程_第11张图片

  • 初步测试:

    软工第四次作业——结对编程_第12张图片

  • 代码修改后:

    软工第四次作业——结对编程_第13张图片

六、异常处理

1.抛出异常:

对异常这块了解不多,目前只考虑到以下几种可能会出现的异常:

  • 文件打开失败:
  • 用户未输入参数、参数个数错误、参数不包含“-i”和“-o”:
    软工第四次作业——结对编程_第14张图片
    软工第四次作业——结对编程_第15张图片
  • 检查“-n”和“-m”后面的参数是否为数字:
    在程序中使用了stoi()函数实现字符串转整型,若转换失败则会自动抛出异常。

2.捕获异常:

使用try-catch对异常进行捕获。
软工第四次作业——结对编程_第16张图片

3.测试结果:

错误输入:
软工第四次作业——结对编程_第17张图片
正确输入:
软工第四次作业——结对编程_第18张图片

七、结对过程

  • 照片:

    软工第四次作业——结对编程_第19张图片

  • 感受:

    这次结对编程在项目上,我学到了很多东西如:理解了 __int main(int argc, char *argv[])__ 中参数的含义,能对参数进行处理;对vectorpair的使用更加的熟练;了解并掌握了迭代器的基本用法;能够对常见的异常进行抛出和捕获处理。在结对上,这是我和贾青虎的第一次结对编程,还处在磨合期,无论是对于任务分工,还是个人编码习惯上配合得都不够好,对各种问题会出现了不同的看法。我们这次花了许多时间在知识的学习上,结对编码过程不连续。而且两人水平不想当,某些能力上不能互补,所以这次结对编程的效率没有做到“1+1>2”。

你可能感兴趣的:(软工第四次作业——结对编程)