构建之法第四次作业
一、
这个作业属于哪个课程 | 系统分析与设计 |
---|---|
这个作业要求在哪里 | 系统分析与设计第四次作业地址 |
Github项目地址 | WordCount |
队友作业地址 | 何鑫懿 |
二、PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 740 | 1650 |
Analysis | 需求分析 (包括学习新技术) | 50 | 30 |
Design Spec | 生成设计文档 | 30 | 50 |
Design Review | 设计复审 (和同事审核设计文档) | 30 | 50 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 5 |
Design | 具体设计 | 60 | 100 |
Coding | 具体编码 | 500 | 885 |
Code Review | 代码复审 | 30 | 50 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 500 |
Reporting | 报告 | 90 | 60 |
Test Report | 测试报告 | 50 | 50 |
Size Measurement | 计算工作量 | 20 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 20 |
无 | 合计 | 860 | 1765 |
三、思路与接口设计
在查看项目需求时,发现项目主要有以下几个功能组成:
1、字符和单词数统计
2、统计单词出现频率
3、词组统计
4、参数自定义输入输出
因此我们考虑编写一个主项目(根据命令行参数输出指定内容)和三个库(dll)分别处理:文件中的字符和行数统计、统计单词数和单词出现频率、统计字符组。
本次项目中主要的算法在于从文件或字符串中获取指定的内容和排序,我们的主要思路是通过将文件读入一行后用正则表达式对符合要求的单词进行提取并小写化,然后将单词储存在List中,再将统计单词的出现的个数然后通过SortedList储存排序后的单词及单词频率。
对应的库和函数如图所示:
其他的功能,如-m -n等指令直接写在主项目的一个独立的类中,三个库及指令操作类既可以在本项目中使用,也可以添加到其他项目中使用,提高了代码的可复用性。
四、代码复审过程
在代码复审过程中,我们严格的遵守了代码复审的几项原则:编码规范、按照设计编码、尽量提高程序性能、交流和处理出现的异常、进行编码的单元测试。在代码复审过程中,一直都是我担任“领航员”的角色,设计接口解决主要问题和控制项目进度,引领队友进行项目,因为以前一起小组合作过,在命令和函数调用上还是比较熟悉,同时在相互交流中提高了整体程序代码的性能。而问题就是我对一些集合的使用不太熟导致算法性能不太理想,而队友也是在VS和C#的使用上不太熟练,减缓了编码的进度。特别是在快要结束时测试出使用SortedList好像并不是一个很好的选择,在排序过程中过于复杂。
五、接口性能改进
针对排序算法,我们最后对其进行了修改,之前我们是将单词按顺序直接先排序储存,发现自己写的算法效率很低,因此我将排序这部分放在了输出的代码里,通过SortedList的自动根据key进行排序的特性先将其安字符排序好,再根据-n值决定循环输出前n大的值,这样直接解决了相同值时再按照key字母排序问题,大大节省了时间。
修改后:
六、单元测试
对单元测试分为三大部分:
- 统计功能
- 命令参数控制
- 错误输入测试
针对两大部分设计了6个测试函数单独测试三个库的接口功能,4个测试正确输入参数的情况,4个测试错误输入命令行的执行情况。
七、异常处理
异常处理主要有两部分:文件io流异常、用户输入参数导致异常
针对异常的捕获的通知,设置了List集合来储存错误信息
参数数目不对:
但参数输入不符合要求时,通过正则表达式进行验证,然后将信息储存,通过printError和writeErrorTOFile函数将报错信息打印到控制台同时储存到error.txt文件中。
八、 结对感受
这次通过这个两人合作完成的项目对结对编程的优缺点有了比较清晰的认识,首先优点还是挺多的,双人分工既减少了单人编程的任务量,又没有多个人之间那么难于交流和沟通,同时以一个人为主另一个为辅的情况下可以相互监督,促进项目的进展又可以相互取经获得别人好的idea和编程思路,让双方都有很好的进步。缺点的话,我个人认为如果当一个人休息一个人编程时项目进度并不会很快,同时可能会出现代码设计没有沟通好的问题,而两个人都有空的且有敲代码的心情的情况还是比较少的,因此结对编程在作息相同的情况下实施还是很好很实用的。而在如果在公司的话则有很多问题,比如工作量问题,如何计算两个人的工作量和工资,同时只用两个人编程的项目我认为还是比较少的。