此次结对编程很是荣幸可以和编程大佬罗伟诚组队。我在群里面问了一下有没有人还没组队,而后他就回我了,问我要不要组队,我说要得,而后咱们就正式结对。肯定结对以后为了之后更好的沟通合做,咱们先是制定了编码规范,而后就开始写代码,罗伟诚对于编程很是积极,咱们三下五除二就把程序编好了,跟他合做也很是愉快。
1.命名规范:整体采用驼峰命名法,类名首字母大写,变量和方法名首字母小写,常量所有大写,禁止拼音命名。
2.布局:采用vs自动缩进,大括号不于代码同行,注释单独在一行,位于注释部分的上方。
3.接口:方法的形参和传输的参数命名相同,必要时在上方备注参数类型
4.代码规范:
适当使用空行,来增长代码的可读性
方法的命名,通常将其命名为动宾短语,一个方法只完成一个任务
经常使用缩进和换行,使代码层次清晰,明了
对泛型进行循坏时,尽可能foreach
缩进和间隔:缩进用TAB,不用 SPACES
注释需和代码对齐
避免写太长的方法。一个典型的方法代码在1~25行之间。html
PSP2.1 | Personal Software Process Stages | 估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
·Planning | ·计划 | 40 | 55 |
·Estimate | · 估计这个任务须要多少时间 | 90 | 90 |
·Development | ·开发 | 60 | 75 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 35 |
· Design Spec | · 生成设计文档 | 15 | 18 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 30 | 40 |
· Coding | · 具体编码 | 120 | 150 |
· Code Review | · 代码复审 | 40 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 50 | 70 |
·Reporting | ·报告 | 100 | 120 |
· Test Report | · 测试报告 | 50 | 55 |
· Size Measurement | · 计算工做量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 过后总结, 并提出过程改进计划 | 15 | 10 |
___ | 合计 | 685 | 823 |
-对于这种类型的编程我也是第一次接触,首先百度这种程序该怎么写。知道这种程序的写法后就开始想算法。首先肯定功能,在博客要求中功能已经列举的很详细通过咱们整理,主要要如下功能
1.统计文件字符
这个功能比较好实现,由于Windows自带的函数库就能够解决。这个功能的要求是统计全部字符,包括空格,换行,因此咱们只须要读取文件,把内容转化为字符串,而后再用CharactersNum()方法就能够统计全部的字符数
2.统计单词数
对于这个功能,咱们首先想到的是计算文本里面的空格数。可是题目要求:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。因此这里须要用到正则表达式进行限制。按行读取文本,存入集合中,再用正则表达式进行筛选。
3.统计行数
这个也简单,直接统计换行符便可
4.统计单词频率
在统计单词数的基础上,将肯定为单词的字符串存入一个集合中,而后再从第一个单词开始进行匹配,并计数。
5.写入文件
首先输入文件路径,而后用StreamWriter()建立一个对象,再用里面的write方法,就能够将内容写入文件。
6.筛选定长单词
在统计单词个数的基础上,将肯定为单词的字符串存入一个列表中,而后依次遍历每一个单词,再用string.len()能够获得每一个单词的长度,然筛选出指定长度的单词便可git
首先类的设计就两个,第一个数函数类,第二个方法类。主函数类调用方法,而方法类中包含了全部须要用到的方法。方法类就七个函数,其中有一个公共方法getDic 这个方法用于得到字典,存入字典中的是长度大于四且不以数
字开头的单词以及他们出现的次数,这个方法会返回一个Hashtable,方法getWordFre()方法将字典按照单词出现的次数进行排序,并返回一个动态数组。
其余的,能够直接调用,getWordFre这个方法利用返回的数组进行相应功能的实现。
流程图
github
部分测试代码
测试结果
测试文件
如图所示,结果符合预期。
单元测试2
测试文件
结果
测试文件
正则表达式
代码互审咱们进行得比较模糊,就是每一个人完成了一个功能模块,再交给另外一我的测试,审核,看看有没有错误,或者有没有更好的算法。
刚开始咱们都不知道用正则表达式,我也是经过百度才了解正则表达,而后咱们就改进了之前写的算法,大幅度缩短了代码量并且出错率低算法
性能分析如图所示
编程
性能分析是咱们完成代码以后一块儿作的,因此这张图是和罗伟诚同样的。
这里的代码改进主要有两点,第一点使用字典,第二点使用正则表达式。
刚开始写代码的时候,首先想到的使用数组,或者字符串类型封装的一
写方法。可是这样编写起来代码冗长,并且容易出错,最后咱们采用了
比较高效的正则表达式和字典。数组
1.获取字典
提取文本中的单词并放入列表中,同时统计出每一个词词频放到Hashtable中,最后返回一个Hashtable
2.计算单词频率
getWordFre(string pathName, ref Hashtable wordList)将传递过来的wordList进行按频率排序,并将Hashtable转换成动态数组并返回
函数
public void write(string outputPath, ref Hashtable wordList, int lines, int words, int characters, int wordsOutNumFla, int wordsOutNum, int m, string inputPath)
{
getFile Wordlist = new getFile();
ArrayList keysList = new ArrayList();
ArrayList keysList1 = new ArrayList();布局
keysList1 = Wordlist.getPhrase(inputPath, outputPath, ref wordList, m); keysList = Wordlist.getWordFre(outputPath, ref wordList); StreamWriter sw = new StreamWriter(outputPath); sw.WriteLine("characters:{0}", characters); sw.WriteLine("words:{0}", words); sw.WriteLine("lines:{0}", lines); if (wordsOutNumFla == 1) { wordsOutNum = wordsOutNum; } else wordsOutNum = 10; for (int i = 0; i < wordsOutNum; i++) { sw.WriteLine("<{0}>:{1}", keysList[i], wordList[keysList[i]]); } sw.WriteLine("如下是长度为{0}的词组:\n", m); foreach (string j in keysList1) { sw.WriteLine("<{0}>:{1}", j, 1); } sw.Flush(); sw.Close(); }
4.统计行数
按行读取,每读取一行加一,最后得出行数
5.统计单词数,读取文件,用正则表达式进行筛选
6.统计字符数,这个比较简单,按行读取文件,累加每行的长度便可
7.获取定长单词数量
性能
首先看到题目要求的时候就以为脑袋大,想了半个小时才把逻辑相同。而后在编写代码的时候也比较头疼,由于我是第一次接触这种命令行的程序。之前写的都先运行程序,而后再一个一个输入参数运行。经过罗伟诚的科普,我才知道,原来主函数的参数 args[]数组是用来存放吗命令的。我让罗伟诚写了一段,示范给我看一下,这才理解了。此次的结对编程,不只体验到了两个写代码的优越性,还让我学会了使用字典和正则表达式。最后感谢罗伟诚的合做和帮助。