1. 博客开头
作业要求地址 | https://www.cnblogs.com/harry240/p/11524113.html |
---|---|
Github地址 | https://github.com/ccfuncy/WordCount |
结对伙伴博客 | https://www.cnblogs.com/sparrowchengyu/ |
2. 描述结对的过程
3. 计算模块接口的设计与实现过程
a. 解题思路
首先,经我们讨论对题目要求统计各个指标都想出了对应的解决方案,都可以通过对string的操作获取,在判断单词时可以采用正则去判断是否匹配,比较难一点的应该就是排序这里,这里我们可以在统计单词次数的时候采用字典存贮,然后通过C# 字典自带的orderby排序,它支持多级排序,刚好符合要求。然后就是代码封装,将实现的类封装成类库即可。其次时命令行,我们可以采用commandlineparser 开源库来完成命令解析。最后gui只需要调用封装好的类库即可。
b.设计实现过程
观察所有题目,发现自需要两个类即可,一个类负责解析文件或者输入的字符串,具体函数如下:
它们之间也如上,没有任何关系。
代码流程如下:
重要函数的流程图:
对于实现,我主要负责指令和解析文件,指令的代码如下
[Option('i', "InputFile", MetaValue = "FILE", Required = true, HelpText = "输入数据文件")]
public string InputFile { get; set; }
[Option('o', "OutFile", MetaValue = "FILE", Required = true, HelpText = "输出数据文件")]
public string OutputFile { get; set; }
[Option('m',"WordsLength",MetaValue ="INT",Required =false, HelpText ="输入词组长度")]
public int WordsLength { get; set; }
[Option('n', "WordNumber", MetaValue = "INT", Required = false, HelpText = "输入需要显示的单词数量")]
public int WordNumber { get; set; }
然后就是解析文件了:
public wordCount(string arrLine,int numLine)
{
this.arrLine = new StringBuilder(arrLine);
this.numLine = numLine;
char[] sep = { ' ', ',', '.', ',' };
foreach (string i in arrLine.ToString().ToLower().Split(sep))
{
if (i.Length >= 4 && Regex.IsMatch(i, regex))
{
wordList.Add(i.ToLower());
}
}
wordList.ForEach(x =>
{
if (wordDic.ContainsKey(x))
{
wordDic[x] += 1;
}
else
{
wordDic[x] = 1;
}
});
}
至此,我就写完了基础功能这一块。然后后面就是生成dll了。
c. 代码规范及代码互审
-
左右花括号要独自一行,括号内容为空时不用2.if/for/while/do等关键字后面与左括号之间需要加空格:if (x == 1)
-
方法名和左括号之间不能有空格
-
for语句中的表达式之间要加一个空格
-
运算符左右需要加空格:a = b * c
-
要求代码行下一行相对于上一行缩进4个空格
-
适当增加空行,增强代码的可读性
-
注释应当增加代码的可读性,但注释也要保持简洁,过多显得繁琐
-
每行代码或注释不应超过屏幕宽度,超过要换行,换行后的代码要缩进4个空格
-
将注释放在单独的行上,而不是将其放在每行代码的末尾。且对于不同地方的注释有不同要求 对于属性及方法注释 例: ///
/// 获取行数
///
///
行数 public int getLineNumber()
多行代码注释 /*
多行注释
多行注释
*/
-
命名规则:所有命名空间、类、方法、接口、属性、参数和变量等命名规则——我们采用的是驼峰命名法(小驼峰法):混合使用大小写字母,即除第一个单词之外,其单词首字母大写,譬如方法名:wordCount
代码规范
认真审阅了一下代码,发现了几个问题
-
个别变量命名存在二义性
-
代码复用性不是很高
-
缩进控制不是很好
-
注释
计算模块接口部分的性能改进
接口性能如下,通过观察,我们可以得知我们的代码存在复用性不太好,存在双次读取文件,耗用内存过高,我们可以将复用的代码提取出来,减小内存消耗。
优化代码如下:
public wordCount(string arrLine,int numLine)
{
this.arrLine = new StringBuilder(arrLine);
this.numLine = numLine;
char[] sep = { ' ', ',', '.', ',' };
foreach (string i in arrLine.ToString().ToLower().Split(sep))
{
if (i.Length >= 4 && Regex.IsMatch(i, regex))
{
wordList.Add(i.ToLower());
}
}
wordList.ForEach(x =>
{
if (wordDic.ContainsKey(x))
{
wordDic[x] += 1;
}
else
{
wordDic[x] = 1;
}
});
}
计算模块部分单元测试展示
单元测试如下:(所有都在我这,代码在我这汇合)
测试代码如下(10个文件测试见我伙伴博客):
结对过程
异常处理如下:
string path = fileName.Text;
string strWord = richTextBox1.Text;
if(path.Length<2 && strWord.Length < 2 )
{
MessageBox.Show("请至少选择一个txt文件或者输入长度大于2的字符","提示");
return;
}
if(textBox3.Text.Length < 3)
{
MessageBox.Show("无输出路径", "提示");
return;
}
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 25 |
· Estimate | · 估计这个任务需要多少时间 | 840 | 1200 |
Development | 开发 | 710 | 950 |
· Analysis | · 需求分析 (包括学习新技术) | 40 | 60 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 40 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
· Design | · 具体设计 | 30 | 40 |
· Coding | · 具体编码 | 400 | 600 |
· Code Review | · 代码复审 | 60 | 40 |
· Test | · 测试(自我测试,修改代码,提交修改) | 90 | 100 |
Reporting | 报告 | 100 | 90 |
· Test Report | · 测试报告 | 40 | 50 |
· Size Measurement | · 计算工作量 | 30 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 810 | 1040 |
附加:如下
总结