第三次作业结对编程
一、作业相关地址
本次作业链接 | 作业链接 |
Github项目地址 | 项目地址 |
编程伙伴地址 | 伙伴博客 |
二、结对过程
本人和结对伙伴是室友,自然就组在了一起,各自对于编程都不是很熟悉,通过边学边做的方式完成这次项目。
下面是我们正在讨论项目问题是的一张照片:
三、PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
50 | 30 |
· Estimate |
· 估计这个任务需要多少时间 |
50 | 30 |
Development |
开发 |
600 | 560 |
· Analysis |
· 需求分析 (包括学习新技术) |
40 | 60 |
· Design Spec |
· 生成设计文档 |
30 | 30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
40 | 30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
40 | 20 |
· Design |
· 具体设计 |
50 | 60 |
· Coding |
· 具体编码 |
300 | 300 |
· Code Review |
· 代码复审 |
50 | 30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
50 | 30 |
Reporting |
报告 |
150 | 100 |
· Test Report |
· 测试报告 |
50 | 50 |
· Size Measurement |
· 计算工作量 |
50 | 30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
50 | 20 |
合计 |
800 | 690 |
四、解题思路
刚开始看完这次的编程项目后,感觉很困难,很复杂,因为自己以前也没有和别人一起做项目的经验,所以一时间不知道怎么做。
在看完项目要求后,总算对本次项目所要求的完成的程序有了初步的认识。这次作业的要求就是做一个wordcount,其中包含功能,也可以有自己扩展的功能。
那么就想着用参数来实现项目基本功能。
五、设计实现过程
通过了解,我计划用参数读入的方式来实现项目的基本功能。
首先在这个项目设计一个主函数和一个WordCount类。
WordCount类的属性包含sFilename(文件名)、sParameter(参数)、iChar(字符数)、iWord(单词数)、iLine(总行数)。
方法有三个,Operator(判断输入参数命令是否合法),Count(统计字符数、单词数、总行数、单词出现次数)、Display(最终结果打印)。
主函数调用WordCount类的三个方法。
六、代码规范及互审问题
代码规范就类如C#编码约定所说,尽量让代码看起来简单明了。
- 大括号单独占一行,首尾大括号要对齐
- 使用的字段,尽量以i开头,做到统一
- 避免使用数字来代替字符
- 单行代码不易过多
- 避免在同一项目中的不同命名空间下定义名称相同的类或接口
- 不使用意义相同,仅在大小写上有区别的命名
互审过程中双方把对方的代码不清楚,定义模糊的地方指出,以及将不必要的、繁杂的代码进行了删除和修改。
七、性能改进及测试
- 性能工具
不太明白性能分析,花了大概半个小时去把代码中多余的、不规范的地方修改了。
以下随便测试的一个性能向导图,以及执行单个工作最多的函数,不大懂,还得继续学习:
- 单元测试
- 断点测试
八、项目关键代码
设计的主函数,用来调用类方法。
以及对于输入命令在主函数中用split()函数将输入的命令符隔开,并将最后一个命令赋值给文件名变量,至于split()函数的使用可以参考下这个网址:split函数链接。
static void Main(string[] args) { WordCount word = new WordCount(); string message = ""; while (message != "exit") { message = Console.ReadLine(); string[] MessageSplit = message.Split(' '); int MLength = MessageSplit.Length; string[] sParameter = new string[MLength - 1]; for (int i = 0; i < MLength - 1; i++) { sParameter[i] = MessageSplit[i]; } string sFilename = MessageSplit[MLength - 1]; word.Operator(sParameter, sFilename); word.Count(sFilename); word.Display(); } }
设计的WordCount类的属性:
private string sFilename; //文件名 private string[] sParameter; //参数 private int iChar; //字符数 private int iWord; //单词数 private int iLine; //总行数
统计字符数、单词数、总行数。
这个地方用到了正则表达式,需要的话可以看看这个教程,简单易懂:正则表达式教程:
FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader sr = new StreamReader(fs); fs.Position = 0; iChar = (int)fs.Length; string streamToString = sr.ReadToEnd(); iLine = streamToString.Split('\n').Length; streamToString = Regex.Replace(streamToString, "[^\u4e00-\u9fa5a-zA-z0-9.].*?", " "); streamToString = Regex.Replace(streamToString, "\\s{2,}", " "); iWord = streamToString.Split(' ', ',').Length; sr.Close();
最后是打印成output.txt文本以及输出:
public void Display() { StreamWriter f = new StreamWriter(@"output.txt", false); foreach (string a in sParameter) { if (a == "-c") f.WriteLine("characters:{0}", iChar); if (a == "-w") f.WriteLine("words:{0}", iWord); if (a == "-l") f.WriteLine("lines:{0}", iLine); } f.Close(); Console.ReadKey(); }
运行效果图如下:
总的来说实现了基本功能,关于统计文本中出现的单词次数以及显示出每个单词的使用次数这块在学。
九、项目经历及感受
这次项目深刻的感受到了和其他同学之间的差距,通过这次项目学习到了很多,但也发现了许多不足,平时下来要多敲敲代码,复习一下之前学习的接口封装等知识。
当然在这一次项目中能看出1+1是大于2的,所以在以后的编程过程中,还是要有一个能参与的项目小组,这样工作效率也会大大提升的。
同时在这一次的项目中,又接触了github这个好东西,有了上一次作业的经历,这一次在使用github的时候流畅多了。