第三次作业
一、项目地址
结对伙伴:刘易 博客地址:https://www.cnblogs.com/Lukasly/p/10630422.html
Github地址:https://github.com/Astone1213/WordCount
二、结对过程
1、在拿到本次作业后,本人对于这个项目并没有什么思路。并且对于结对编程这种新方法也是第一次了解,所以在网上查询资料后,本人就主动向同学发出了邀请。在结对完成后我们也很快对各自的
任务进行了分派。虽然每个人的任务不大相同,但我们在完成各自的任务时并不是各自埋头苦干。当遇到难题时,我们常常一起讨论解决。我们希望能运用一个team的力量。发挥出1+1>2的功效。非摆
拍照片如下:
2、psp表
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
20 | 25 |
· Estimate |
· 估计这个任务需要多少时间 |
20 | 25 |
Development |
开发 |
870 | 880 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 | 50 |
· Design Spec |
· 生成设计文档 |
20 | 30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 | 30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 | 30 |
· Design |
· 具体设计 |
100 | 90 |
· Coding |
· 具体编码 |
500 | 450 |
· Code Review |
· 代码复审 |
100 | 120 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
50 | 60 |
Reporting |
报告 |
80 | 110 |
· Test Report |
· 测试报告 |
30 | 40 |
· Size Measurement |
· 计算工作量 |
20 | 20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 50 |
合计 |
970 | 1060 |
三、构思
在和队友划分任务之后,对于自己负责的部分,即词频统计和排序进行了构思,一开始我思考的是用结构体来完成,但是后来查阅了一下书本,和网上的一些案列,我看到了一个自己不常用的类:字典。因为字典本身key值与value的关系很适合本次作业的开发,并且,在一开始之前,我就选择了分模块进行,这样能使得代码看着更舒适,且易懂。
四、具体实现过程(自己负责部分)
1、第一个类Writetext三、计算模块接口的设计与实现过程
使用c#字典 Dictionary 把文本文档中的内容写入字典中,并判断词频,具体实现方式是新建一共字典实例,通过正则表达式把文本中的单词写入一个String [] 。
2、第二个类 Cipin
调用Writetext,获得字典数据,并对每个数据出现的频率进行统计,并写入文本。
3、第三个类Max_cipin
调用Writetext,获得字典数据,负责统计每个单词出现的次数且次数为前十的,其核心还是通过字典key值与value值一一对应的关系。
4、新增类cizu
统计长度为n的词组,具体实现过程是,将文本传入一个string [] 变量中,通过循环嵌套,把词组输出,但是在具体实施过程中遇到了很多问题,比如怎么把非单词去掉,又学习了Split的更多运用,
这一个类的开发是开发过程中遇到困难最多的,最后因为时间关系,依旧有一个问题没有解决,就是例如,要求输出两个词组但是,有时还是会输出超过,还有一个问题就是,如果循环到最后,只剩下
一个单词了,不够一个词组,又该如何解决,这些问题因为时间关系,未能完成。
五、<1>简易C#代码规范
1、 类型(类、结构、委托、接口)、字段、属性、方法、事件的命名
优先考虑使用英文(尽量使用英文),如果实在没有合适的英文进行描述,可以使用拼音,使用中文是不符合要求的。
2、不使用缩写
所有类型、字段、属性、方法、事件尽量不使用缩写,包括大家熟知的缩写,例如msg。
3、不使用单个字母的变量
不使用单个字母的变量, 像 i、m、n,使用index等来替换,用于循环迭代的变量除外。
4、 注释
类型、属性、事件、方法、方法参数,根据需要添加注释。如果类型、属性、事件、方法、方法参数的名称已经是自解释了,不需要加注释;否则需要添加注释。
5、类型名称和源文件名称一致
6、不在代码中使用具体的路径和驱动器名。 使用相对路径,并使路径可复用
7、一个方法只完成一个任务。不要把多个任务组合到一个方法中,即使那些任务非常小
8、如果if语句块的内容只有一行,可以不加花括号,并且最好和if语句位于同一行
9、返回bool类型的方法、属性的命名
如果方法返回的类型是bool类型,则其前缀为Is,例如:IsHidden。
如果某个属性的类型为bool类型,则其前缀为Can,例如:CanHidden。
10、不要“捕捉了异常却什么也不做“。如果隐藏了一个异常,你将永远不知道异常到底发生了没有
<2>代码复审
虽然本人和pattern早早就制定好了我们的代码规范,但是由于在之前并没有规范自己。所以在日常编码中我们还是很轻易就被自己曾经的一些个人习惯带走,这导致我们在代码复审的时候发现出现了很多我们之前定制好的规则被我们打破的情况。比如在给函数和类命名时,我们只能将自己熟悉的函数名规范正确,但在进行函数构造的时候我们往往只能用拼音首字母来命名,这就造成了虽然自己非常了解代码意思但队友并不了解的情况。再加上在每个类和函数里注释不清晰和分段不明显我们在看对方的代码时必须不断的询问和修改,这花费了我们不少时间。
六、单元测试
对部分类进行了单元测试,在测试过程中,因为对字符的了解不够。列如换行符算两个字符等等这些问题,一开始,在对期望的设定过程中出现了严重的问题。(注:最后上传的代码,因为太急,所以好像测试的函数有一点点问题,不过我以在自己电脑上修改后测试,没有问题)
七、效能分析
通过vs2017效能探测器对代码进行了简单的效能分析。
八、部分核心代码
1、Writetext 类
using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; using System.IO; namespace Cipincompute { public class Writetext //从文本写入字典序 { public Dictionary<string, int> Writeword(string text) { Dictionary<string, int> frequencies; frequencies = new Dictionary<string, int>(); string[] words = Regex.Split(text, @"\W+"); foreach (string word in words) { if (frequencies.ContainsKey(word)) { frequencies[word]++; } else { frequencies[word] = 1; } } return frequencies; } } }
2、未能完善的 cizu 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; using System.IO; using Cipincompute; namespace Cipincompute { class cizu //词组统计 新增 { string[] temp1 = null; string txt; int num; int num2; bool fin = true; char[] kh=new char[3]; public cizu(string t1,int n) { txt = t1; num = n; num2 = n; } public static bool IsLetter(string str) { string pattern = @"^[A-Za-z]+$"; Match match = Regex.Match(str, pattern); return match.Success; }//判断字符串是否为英文 public void cizuPrint() { kh[0] = ' '; kh[1]='\n'; kh[2] = '\r'; using (StreamReader sr = new StreamReader(txt, true)) { string text1 = sr.ReadToEnd(); text1 = text1.ToLower(); temp1 = text1.Split(kh); for (int i = 0; i < temp1.Length; i++) { for (int j = i; j < num; j++) { //if (num - j >= 2) //{ // num--; //} if (IsLetter(temp1[j])) { Console.Write(temp1[j]); Console.Write(' '); fin = true; } else { fin = false; break; } } if (num <temp1.Length) { num++; } if (temp1.Length - num <= num2 ) { break; } if (fin) { Console.WriteLine(":" + num2); } } } } } }
九、作业感受
整体来说感觉这次的作业对自己和自己的队友都一定的难度,首先第一个难度在于如何完成整个代码,第二个难度在于,自己和队友都是第一次进行团队开发,结对编程,所以有很多细节没有做好,有些地方讨论不及时。但是这次作业也让自己有了很多收获,明白了一个团队应该是什么样子,怎么样才能使得1+1>>>>>2。还有就是,自己的编程能力从这次作业中就可以发现,还需要加大训练,自己的开发效率不高,时间安排不合理,等等一系列问题,都使得自己这次作业,在自己的任务里未能好好完成,影响了队友的效率。这次作业以后,自己一定会多多训练自己的编程能力,争取在下次团队项目中,不拖后腿,完完整整的完成自己负责的部分。