第二次结对编程总结
编程作业要求:要求
github地址:github
2. PSP表格(单位:h)
Planning | Estimate | 0.1 |
Development | Analysis | 0.5 |
Design Spec | 0.5 | |
Design Review | 0.1 | |
Coding Standard | 0.1 | |
Design | 1 | |
Coding | 12 | |
Code Review | 2 | |
Test | 5 | |
Report | Test Report | 1 |
Size Measurement | 0.1 | |
Postmortem | 0.5 | |
Process Improvement Plan | 0.1 |
3. [接口]
一开始的需求只是对于不同参数做不同处理和仅有的参数组合,所以我们采用的方式是对于每一种参数写一个函数。后来需求变更为参数组合,有必选和可选参数,就更改了接口设计。为实现Information Hiding,采用成员私有并用公有方法访问的方式。为实现Loose Coupling,将不同参数以独立函数实现并用bool量控制可选参数,防止需要在不同功能中多次实现可选功能。接口设计为用-d -s处理出待处理字符串,对-c -f -p -q单独实现四个函数,接受相同的输入(待处理字符串),得到相同的输出(频率表),之后根据-n对统一的输出进行处理。
4. [类]
两个类,一个argparse类用于分析命令行以后打包每个参数及其值。另一个Freq类用于记录字母频率和稳定排序。算法中最关键的部分应该是PhraseCount中匹配每个单词的部分。由于正则库函数实现太慢,所以自己实现了特殊化的正则匹配,为了把逻辑写对画出状态机。
5. UML
6. 我们采用的结对过程为为一人主要负责程序编码,另一人主要负责代码复审和单元测试编写,以pair programming的形式。至于优缺点,我觉得我对C++的库和新特性比较熟悉,对bug的处理比较熟悉,对性能分析工具比较熟悉。缺点是编码速度不够快。对于parterner,我觉得优点在于能很敏锐的发现我编程中的隐藏bug,编码能力挺强,擅长编写单元测试,对新工具的学习和熟悉能力很强,很有耐心也挺可爱的。缺点是写C++的时候容易写成python的语法<_<?
7. 我们的guideline是画出函数的功能模块图,画出输入输出的流程图。我们要求在代码规范方面遵守Information Hiding,Loose Coupling的要求。
7. 我们采取的分析工具是VS Performance Inspector. 对热点函数进行优化。比如发现库函数isalpha和isalnum的鲁棒性很差(会接受乱码字符即非ascii字符的输入而造成崩溃),性能也不够,就自己内联实现了一个。发现正则库查找速度太慢,就自己写了一个专门的函数进行匹配。但是有些库函数的性能还是挺高的,比如boost::algorithm::join, 我们用这个将vector中的string联成一个phrase。还对一些数据结构进行了优化减小复杂度,比如采用基于桶的数据结构进行查找和统计操作。事实上这个结果还可以继续优化,比如m_search实际就是一个状态机,我们还可以对统计调用频率,根据huffman树对分支进行优化。
8. 我们采取的单元测试编写工具是VS自带的单元测试。然后对于每个push的版本作一次回归测试。我们可能没有做到单元测试代码覆盖率100%,但是和助教给的示例程序的输出可以对任何参数保持输出一致。
9. 我们最后的性能是对于105M的文件,在没有-v选项时PhraseCount的时间为5s左右(包括1.5s文件读入时间),有-v选项时时间为9s。对pride-and-prejudice.txt没-v大概0.00091s,有-v0.11s左右。