结对编程
一、博客开头
二、描述结对过程
三、分工及计划开发安排
四、解题思路描述
首先分析项目的功能要求,可以发现主要要攻克的难点如下:
1)控制台指令的分解
解决方法:我们对main函数的入口进行操作,对字符串组类型的args()进行for嵌套循环匹配命令符,从而实现控制台命令分解的效果。
2)文件的读取与存储
解决方法:要解决读取文件的问题,查阅资料后我们使用StreamReader来完成txt文件的读取。在这个过程中我们同时发现ReadLine()能完成逐行的读取,因此使用一个while循环就能直接把有效行数统计出来。
3)统计文件的字符数、统计文件的单词总数、统计文件的有效行数、统计文件中各单词的出现次数等基本功能开发
解决方法:统计文件的字符数,经查阅我们发现使用 Regex.Matches(text, @"\w").Count;能计算出英文和数字的字符数,由于一个文件(如英文文章)里可能还有别的标点符号,因此类似的使用这个函数也将其他的标点符号匹配上进行Count计算,最后相加求出字符总数。
而对于统计文件的单词总数,由于题目给的约束条件比较多,使用正则表达式能很好的解决这个问题,我们写出了符合题目要求的表达式来表示单词,从而通过叠加来求出单词总数。
然后,统计文件中各单词的出现次数,这个问题我们分了两步来解决,首先要将文本内容进行分割,凡是遇到标点符号和空格、回车的地方,就进行中断,从而切割出一个一个单词,经查阅,使用Split和Trim能完成分割操作。分割之后根据正则表达式将符合条件的单词加入List集合中,使用ContainsKey统计所有单词及其词频。
最后就是将频率最高的单词优先输出,对于这样的排序问题,也是查了很久的资料发现Dictionary能完成对次数降序的操作,而且还能按字典顺序进行排序,因此结合着数组的使用,完成了排序的功能。
4)词组的统计、自定义输出等扩展功能的开发
解决方法:两个拓展功能只需要在基础功能的类里修改接口传参即可实现。
五、实现过程
针对以上功能需求分析设计脚本结构如下:
基础功能流程图如下:
扩展功能流程图如下:
六、具体代码
展示部分具体代码:
//统计行数
public int lineCount(string path)
{
int line = 0;
string text;
StreamReader sR = new StreamReader(path, Encoding.UTF8);
while ((text = sR.ReadLine()) != null)
{
line++;
}
sR.Close();
Console.WriteLine("基础功能");
mycount2.storeTest("基础功能",opath);
Console.WriteLine("行数:" + line);
mycount2.storeTest("行数:" + line,opath);
return line;
}
//统计字符总数
public int charCount(string path)
{
int chars = 0;
string text;
StreamReader sR = new StreamReader(path, Encoding.UTF8);
while ((text = sR.ReadLine()) != null)
{
chars += Regex.Matches(text, @"\w").Count;//匹配字母,数字,_
chars += Regex.Matches(text, @"\s").Count;//匹配空格,水平制表符
chars += Regex.Matches(text, @"\n").Count;//匹配换行符
chars += Regex.Matches(text, @"\?").Count;//匹配?
chars += Regex.Matches(text, @"\,").Count;//匹配逗号
chars += Regex.Matches(text, @"\.").Count;//匹配.
chars += Regex.Matches(text, @"\!").Count;//匹配!
chars += Regex.Matches(text, @"\-").Count;//匹配-
chars += Regex.Matches(text, @"\(").Count;//匹配(
chars += Regex.Matches(text, @"\)").Count;//匹配)
}
sR.Close();
Console.WriteLine("字符总数:" + chars);
mycount2.storeTest("字符总数:" + chars, opath);
return chars;
}
//统计单词总数
public int wordCount(string path)
{
int words = 0;
string wordtype = @"[a-zA-Z]{4,}[a-zA-Z0-9]*";
string text;
StreamReader sR = new StreamReader(path, Encoding.UTF8);
while ((text = sR.ReadLine()) != null)
{
words += Regex.Matches(text, wordtype).Count;
}
sR.Close();
Console.WriteLine("单词总数:" + words);
mycount2.storeTest("单词总数:" + words, opath);
return words;
}
七、单元测试与性能分析
测试部分我们用《茶花女》前四章节作为待处理文本,分别测试基础功能与拓展功能,结果如下:
系统性能如下:
八、总结与收获
在本次结对编程中两个人的任务分配并不是对等的,由于时间原因,我完成了大约三成的部分(两个拓展功能与命令的分解),另一个同学完成了其他的百分之70,在某种意义上讲,结对编程只是分担了独立完成的重负,并未起到1+1>2的情况。希望随着默契度和技术的增长,结对编程的效果更加突出。