| 作业要求地址 | https://www.cnblogs.com/harry240/p/11524113.html |
| GitHub项目地址 | https://github.com/Untrara/WordCount |
| 合作同学地址 | https://www.cnblogs.com/cyh0813/p/11645041.html |
| 合作同学学号 | 201731031124 |
一、PSP表格
|
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
|
Planning |
计划 |
30 |
40 |
|
· Estimate |
· 估计这个任务需要多少时间 |
30 |
40 |
|
Development |
开发 |
1300 |
1250 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
90 |
80 |
|
· Design Spec |
· 生成设计文档 |
60 |
50 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
60 |
70 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
20 |
|
· Design |
· 具体设计 |
300 |
280 |
|
· Coding |
· 具体编码 |
350 |
300 |
|
· Code Review |
· 代码复审 |
120 |
130 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
300 |
320 |
|
Reporting |
报告 |
120 |
125 |
|
· Test Report |
· 测试报告 |
40 |
45 |
|
· Size Measurement |
· 计算工作量 |
20 |
20 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 |
60 |
|
|
合计 |
1450 |
1415 |
二、计算模块的设计与实现过程
1.分析题目要求后,有三个难点需要解决
1)命令行读入参数
2)提取符合规则的单词
3)统计单词出现次数,并需要按照字典序进行排列
分别采用args[n],正则,以及Dictionary对象解决上述难点,将其余功能分类进行编写
如上图所示,共设计了7个类,具体功能及对应类如下图所示:
2.关键函数
GetTen.cs:统计各个单词出现的次数,并按照数量的高低以及字典序进行排列,返回一个Dictionary的对象。
WordString.cs:利用正则表达式,帅选出符合规则的,正确的单词
3.如何体现“Design by Contract”、“Information Hiding”、 “Interface Design”、 “Loose Coupling”等原则?
Design By Contract(契约式设计):
按照某种规定对一些数据等作出约定,如果超出约定,程序将不再运行。一个契约设计,就是约束了某个方法调用的要求、以及返回的承诺。那么,设计在正确的输入下,能够得到正确的输出,否则程序将报错。
Information Hiding(信息隐藏)
在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
Interface Design(接口设计):
对接口的名字,功能,接口与接口间的继承关系进行设计;好的接口设计可以增强代码可读性,易用性,可更改性。
用规范的命名来设计接口的名字,对接口与接口之间的关系进行具体的设计,避免了接口的混乱。
Loose Coupling (松耦合)
软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。
通过增加接口,根据方法功能增加分类的方式实现松耦合
三、部分代码实现
1.统计字符串中所有字符总数
1 public class CountWord 2 { 3 /// <summary> 4 /// 统计字符串中所有字符总数 5 /// </summary> 6 /// <param name="text">要统计字符数的字符串</param> 7 /// <returns>字符总个数</returns> 8 public int charactersNum(string text) 9 { 10 int ch = 0; 11 //\S——匹配任何非空白字符(除了空格、换行、制表符等的任何字符) 12 //|——匹配二选一 13 ch = Regex.Matches(text, @"[\S| ]").Count; 14 return ch; 15 } 16 }