第四次作业--结对编程

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. 代码规范及代码互审

  1. 左右花括号要独自一行,括号内容为空时不用2.if/for/while/do等关键字后面与左括号之间需要加空格:if (x == 1)

  2. 方法名和左括号之间不能有空格

  3. for语句中的表达式之间要加一个空格

  4. 运算符左右需要加空格:a = b * c

  5. 要求代码行下一行相对于上一行缩进4个空格

  6. 适当增加空行,增强代码的可读性

  7. 注释应当增加代码的可读性,但注释也要保持简洁,过多显得繁琐

  8. 每行代码或注释不应超过屏幕宽度,超过要换行,换行后的代码要缩进4个空格

  9. 将注释放在单独的行上,而不是将其放在每行代码的末尾。且对于不同地方的注释有不同要求 对于属性及方法注释 例: /// <summary>

    /// 获取行数

    /// </summary>

    /// <returns>行数</returns>

    public int getLineNumber()

    单行代码注释 //单行注释

    多行代码注释 /*

    多行注释

    多行注释

    */

  10. 命名规则:所有命名空间、类、方法、接口、属性、参数和变量等命名规则——我们采用的是驼峰命名法(小驼峰法):混合使用大小写字母,即除第一个单词之外,其单词首字母大写,譬如方法名:wordCount

代码规范

认真审阅了一下代码,发现了几个问题

  1. 个别变量命名存在二义性

  2. 代码复用性不是很高

  3. 缩进控制不是很好

  4. 注释

计算模块接口部分的性能改进

接口性能如下,通过观察,我们可以得知我们的代码存在复用性不太好,存在双次读取文件,耗用内存过高,我们可以将复用的代码提取出来,减小内存消耗。

 

 

 

 

优化代码如下:

 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.1Personal 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

附加:如下

 

 

 

总结

其实这次收获还是挺多的,毕竟才开始接触写这些东西,还好和另一位成员的编码能力相似,并没有出现很严重的反差,在这次编程中的确学到了很多没有接触过的语法和知识,比如lamba语法和装饰器这些知识,让我受益匪浅,非常感谢老师能提供这次机会,让我发现了编程的乐趣。

 

 

posted @ 2019-10-12 10:45  ccfuncy  阅读(173)  评论(1编辑  收藏  举报