一、地址链接
github地址:https://github.com/Foreverux/WordCount
伙伴作业地址:https://www.cnblogs.com/JQloveJX/p/10659417.html
第二、结对过程
图片:
人员学号: 蒋201731062117,张201731062119
三、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 800 | 950 |
Development | 开发 | 750 | 600 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 80 |
· Design Spec | · 生成设计文档 | 30 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 60 | 50 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 20 | 20 |
· Coding | · 具体编码 | 200 | 220 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 50 | 40 |
Reporting | 报告 | 10 | 20 |
· Test Report | · 测试报告 | 10 | 10 |
· Size Measurement | · 计算工作量 | 30 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 800 | 950 |
四、设计思路
首先分析题意,可以分为五个类分别设计:
一、读取用户指定的txt文件。
二、统计TXT文件中字符个数(不包括中文字符,即ASCII值中)
三、统计txt中的有效行数(空格,制表符,回车符为空白字符)
四、统计总共的单词出现个数与频率最高的10个并统计频数
五、将输出信息保存到output.txt文件内
首先将读取文件的每一数据都保存到一个字符串中,然后其余三个功能基于此调用。
共创立5个类,分别设立接口,每个功能分别调用第一个读取类read()。
五、代码设计实现过程及代码复审
首先设计read()方法,返回保存的txt的字符串,然后分别设计CountCharacters()记录字符的总数,ValidLine()记录有效行数,Isword()判断是否符合单词,
CountWords()记录单词的总个数,TopTenWords()记录频率最高的十个单词及频数。最后二人整合设计接口主函数new调用。
eg、以public bool Isword(string str)判断是否单词,之后统计单词个数,以字符串数组保存读写的字符串,其中以空白字符分割,并且书写ICountWords()统计总共单词数,以客户需求输出前topn频率的单词。
代码复审:
代码复审过程,我们互相发现了各自的问题,例如个别地方没有遵守变量命名规则,函数命名规则等。好的是大部分地方都很好,换行,缩进等都做得很好。 代码合并后,发现问题:在有输入的时候,很多语句都写在了类里面,实际调用很麻烦,所以之后就又改进了代码。
六、代码规范
讨论得出的代码规范:
(1)缩进:因为都是用的VS2017,所以我们统一使用TAB键,更方便,也可以统一整齐。
(2)断行与空白的{ }行:保证每行一句代码,‘ { ’ ‘ } ’独占一行,便于确定括号的完整对照性。
(3)大小写问题:所有单词的第一个字母都大写,如果是组合单词,第二个单词首字母大写,如:MaxNumber
(4)注释:每个函数,类都要注释,并且注释放在函数头。
注释统一用中文书写,更方便伙伴阅读理解,并且中文与字符的视觉差较大,不会产生视觉疲劳。
参考代码规范链接:http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
七、程序改进
主要有两点改进。
其一:在类里的方法有多次在另一个类调用的情况,我们考虑了执行的次数与界面的观赏性,将部分语句修改移动到主函数执行一次,避免了重复执行。
其二:起初在字典序头疼了很久,使用了多个for循环与if语句,后来查到了C#中有专门提供的Dictionary函数,大大方便了程序的可行性。
效能分析改进
八、单元测试
筛选的部分测试代码以及测试成功的记录
九、代码说明
部分重要代码实现如下:
//统计TXT文件中字符个数(不包括中文字符) public class CountCharacters : ICountCharacters { public int Countcharacters(string str) { ValidLine validLine = new ValidLine(); int i, count, line; count = 0; line = 0; for (i = 0; i < str.Length; i++) { if (str[i] >= 0 && str[i] <= 127) { if (str[i] == '\n') { line++; } count++; } } count = count - line; return count; } }
//三、统计txt中的有效行数 public class ValidLine { public int ValidLine1(string path) { int count = 0; string[] contents = File.ReadAllLines(path); for (int i = 0; i < contents.Length; i++) { count++; if (contents[i].Equals(string.Empty)) { count--; continue; } } return count; } }
十、心得感受
老师教授了心得与理论经验,我们通过实践操作,沟通交流,心得分享互相学习了很多,对单元测试的独立性,可重复性有了更深入的认识。
在此次结对编程中,我们尤其锻炼了操作能力,理论与实践的结合。
我们也体验了工作中的氛围与方式,知道了交流的重要性以及交流的时间成本。
总体来说,此次作业严格分步操作,分别完成部分任务,最后综合检测。质量上提高了很多,但时间上并没有太大变化。
希望能在之后的合作中建立默契,建立准则,相互熟悉,完成项目。