结对编程--第四次作业
一.Fork仓库的地址和伙伴的地址
github项目地址 | https://github.com/yatangtang/WordCount |
---|---|
结对伙伴作业地址 | https://www.cnblogs.com/sunnyyt/p/11639271.html |
结对伙伴学号 姓名 | 201731062505 颜依婷 |
二.psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1540 | 1750 |
Estimate | 估计这个任务需要多少时间 | 1540 | 1750 |
Development | 开发 | 450 | 540 |
Analysis | 需求分析 (包括学习新技术) | 40 | 60 |
Design Spec | · 生成设计文档 | 60 | 40 |
Design Review | · 设计复审 (和同事审核设计文档) | 50 | 60 |
Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 40 |
Design | · 具体设计 | 50 | 70 |
Coding | · 具体编码 | 480 | 550 |
Code Review | · 代码复审 | 50 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 130 |
Reporting | 报告 | 100 | 100 |
Test Report | · 测试报告 | 40 | 30 |
Size Measurement | · 计算工作量 | 40 | 50 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 1540 | 1750 |
三.项目代码设计包括测试代码部分设计
1.项目实现的基础功能:
- 统计文件的字符数:
- 只需要统计Ascii码,汉字不需考虑
- 空格,水平制表符,换行符,均算字符
- 英文字母:A-Z,a-z
- 字母数字符号:A-Z,a-z,0-9
- 分割符:空格,非字母数字符号
- 统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
- 统计文件的有效行数:任何包含非空白字符的行,都需要统计。
- 统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
- 按照字典序输出到文件txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
新增功能: - 词组统计:能统计文件夹中指定长度的词组的词频
- 自定义输出:能输出用户指定的前n多的单词与其数量
2.项目设计思路:
拿到题目后,我们有了大概的思路,但是逻辑关系不是很明确,所以我们也去看了相关的博客和c#有关的函数资料。
仔细梳理了作业要求后我们列出了几个所需的函数要求:
函数:1.统计字符 2.统计行数 3.统计单词 4.建立单词字典 5.字典中的单词排序 6.打开文件
两个类:一个主类,一个统计类。
我将主要函数的逻辑思路大致梳理如下:
逻辑思路:
先要成功打开文件才能实现功能
具体实现各个函数的功能
建立单词词典:用字典来存储单词,首先判断是否满足单词的条件(长度大于三,是否以数字开头),以数字开头的就直接pass掉。满足长度大于4的单词存入字典。
建立完成后,调用统计单词函数通过对字典value值的来统计单词数,并对单词进行排序
输出到文件。
因为要满足用户的自定义词组长度,所以我想到在默认情况下,词组长度应该为一,而因为要进行前十个的排序所以i默认的输出单词个数应该是10,经过查阅资料发现了用out重载的方法来进行实现。
3.项目流程图
4.代码规范,和队友共同规定项目的解题代码规范。
代码规范链接https://www.cnblogs.com/sunnyyt/p/11635711.html
四.代码解析部分
1.统计字符数方法
2.统计行数方法
3.统计单词数方法
最开始不知道应该怎么统计,也是查找资料和博客才学会了要用字典的方法来进行统计
参考链接https://www.cnblogs.com/gengaixue/p/4002244.html
参考链接https://www.cnblogs.com/wt-vip/p/5997094.html
4.频率次数排序方法
对于频率次数排序,我们采用了将字典转化成list的方法来统计。
5.写入文件方法
因为上次作业也涉及到了写入文件,所以这次就比较熟悉。
五.测试代码部分设计及展示。
因为接口不能进行单元测试,所以在将函数进行接口封装前对每个函数先进行了相应的测试,以保证封装后的正确性,每个函数的测试都通过了,然后将函数分别进行了接口封装。其中在测试的时候统计字符的函数出现了错误,后来发现是因为在统计时用的Ascll值没有包含空白符,换行符之类的符号,所以产生了遗漏。 统计行数的也出现了错误,总是比实际行数多,没有判断出空行的存在,于是就加上了一个判断,判断是否连续两次出现换行符。改进后如下。
接口封装:把统计字符,行数,排序等功能分离了出来,主函数一下就轻巧了很多,而且其他函数重用率也得到了提高,每个函数之间的依赖性也很低。提高了代码的复用率。
各个函数:
运行结果:
新增功能:
对于根据用户自定义输入词组长度:采用了out重载的方法,结果如下:
但在之前的函数中是根据字典来进行排序,所以在用户输入固定词组长度时,就会按照用户规定的词组长度来统计单词个数
代码复审:
我在进行代码复审的时候,发现有几个函数出现了一些问题:
1.统计字符数方法:
在统计字符的时候,最开始是用的File Stream的Read方法,通过判断返回结果是否返回-1来统计,结果输出的结果不对,后面再看代码,再分析,发现其实可以直接用Ascll码还更加的简单。考虑到后面的函数结构以及传参方便所以采用了这种方式。我们个又通过正则表达式来判断换行符,空格等字符来统计。
2.统计行数方法
统计行数的时候,因为是通过判断换行符的方法来判断行数,但我们之前得到的结果总是比真实的情况多,而且刚好是行数加上空白行的行数,队友她用的读取文件的方法ReadLIne也是一样的情况,一直想了很久这个问题。后来才发现原来文本在转换成字符串的时候,空行变成了换行符,这样的话就统计了两次, 于是就加上了一个判断,判断是否连续两次出现换行符。
六.项目性能分析报告
七.计算模块部分异常处理说明
当用户输入错误时给出提示:
八.结对的过程:
这也是我第一次接触到结对编程的概念,于是就近和室友组成了一对,第一次体会到了结对编程的好处,对于一个项目两个人无论是效率还是质量来说都比一个人好得多,对方能够看到你看不到的地方,而且我发现当遇到问题的时候,即使对方可能也不知道答案,但在你和她说的时候,自己的思路也会越来越清晰。同时代码的规范让大家都能够更加能够读懂对方的代码,也会更加有效率。1+1确实是大于2的,但我觉得在结对编程开始进行项目之前,应该先商量好代码规范,不然在之后整合代码的时候会出现很打的问题影响效率。