项目 | 内容 |
---|---|
做业所属课程 | 2019软件工程_罗杰 |
做业要求连接 | 结对项目做业 |
课程目标: | 进行结对编程实践 |
该做业的帮助 | 实践结对编程,熟悉双人软工开发流程 |
队友的结对项目总结 | 连接 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
- Estimate | - 估计这个任务须要多少时间 | 60 | |
Development | 开发 | ||
- Analysis | - 需求分析(包括学习新技术) | 240 | |
- Design Spec | - 生成设计文档 | 90 | |
- Design Review | - 设计复审 (和同事审核设计文档) | 90 | |
- Coding Standard | - 代码规范 (为目前的开发制定合适的规范) | 30 | |
- Design | - 具体设计 | 300 | |
- Coding | - 具体编码 | 500 | |
- Code Review | - 代码复审 | 300 | |
- Test | - 测试(自我测试,修改代码,提交修改) | 300 | |
Reporting | 报告 | ||
- Test Report | - 测试报告 | 120 | |
- Size Measurement | - 计算工做量 | 30 | |
- Postmortem & Process Improvement Plan | - 过后总结, 并提出过程改进计划 | 30 | |
合计 | 2090 |
看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明大家在结对编程中是如何利用这些方法对接口进行设计的html
计算模块是项目核心,计算功能封装在gen_chain_cpp函数接口中,重点在于从接受命令的外模块获取命令和单词,调用gen_chain_cpp函数计算出最长路径。
算法思路简介:根据函数获取的单词表,从中取得有效单词加入有效单词表中,建单词表的同时为每一个单词创建后继表,计算入度,最终创建邻接链表。以后计算路径,对因而否有环的两种状况,首先会对单词进行拓扑排序,若能顺利进行拓扑排序,则是否有参数-r都采用动态规划算法;若不能顺利完成拓扑排序,则说明有单词环存在,此时检查是否有-r参数存在,没有则返回异常信息,有则采用深度优先算法逐个节点进行搜索。
算法关键及独到之处:在节点数据结构中同时存储了单词长度,所以计算时可根据-c和-w参数自由选择路径计算方式。在计算无环路径时,有无首字母要求的算法存在差别:如有首字母要求,则动态规划计算的起点只会选择符合首字母要求的单词,没有首字母要求时则是会选择入度为0的点做为起点进行计算。而对于有无肯定尾字母的状况,根据动态规划算法的结果,每个节点均会存储以该节点为结尾的最长链的路径和长度,所以只需在获取结果时选择符合尾字母要求的点,选出最长路径输出,无尾字母要求则直接从中选出最长路径输出。c++
计算模块接口部分的性能改进。 记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展现一张性能分析图(由VS 2015/2017的性能分析工具自动生成),并展现你程序中消耗最大的函数
在完成程序的基本功能后,咱们采用了一些数据对程序进行测试,在少许单词的数据下测试,咱们修复了程序的一些逻辑问题,在可以正确运行小文本数据以后,咱们利用一些大文本数据对程序进行测试,测试结果比较使人失望:因为数据结构的设计问题,程序出现了爆内存的问题。以后咱们经过对数据结构进行重构优化,修复了这一问题,如下是一部分性能测试截图:
以上能够看出耗时最多的时进行动态规划计算时的函数,咱们的动态规划计算性能还有提高空间。git
如下是带有-r参数且图中有环的状况,能够看出searchpath做为深度优先递归函数被频繁调用:
因为采起暴力枚举的方法来进行有环路径的搜索,运行速度较慢,性能仍须要改进。github
Design by Contract,即契约式编程。咱们在声明函数时对函数输入输出是有所设计、指望的,将这一指望明确写出称为contract。算法
这一行为的好处是每一个人在契约范围内对本身的代码负责,有问题时能够迅速找到负责人。编程
在本次做业中,咱们共同开发整个项目,所以并无严格按照契约式编程的方式来完成程序,更多的进行口头沟通,提升效率。c#
如下是单元测试覆盖率截图:
为了对计算模块所能遇到的各类状况进行测试,咱们采用了大量测试样例对程序进行测试,如下仅展现部分单元测试代码:
安全
根据可能出现的状况,咱们对如下9种异常状况作了处理:
一、出现除了"-r -c -w -t -h"之外的关键字,如"-x"
单元测试用例:
数据结构
二、-c -w同时出现
单元测试用例:
框架
三、同一种参数重复出现,如 -t a -t a 或 -w -w
单元测试用例:
四、-c和-w参数缺失
单元测试用例:
五、-h 后面缺乏字符
单元测试用例:
六、-t 后面缺乏字符
单元测试用例:
七、命令中出现多余字符
单元测试用例:
八、文件打开失败
九、缺乏-r参数的状况下文本有环,该状况由计算模块经过拓扑排序后得出文本是否存在单词环,返回信息给界面模块进行异常处理
界面咱们仅采用简单的命令行方式处理:
如下是命令行界面:
界面模块的对接就是界面模块从命令行获取所需数据,以后调用计算模块方法对计算模块进行调用,计算模块返回处理结果信息后,界面模块做出反馈。
结对编程优缺点
我和搭档的优缺点
本人 | 搭档 | |
---|---|---|
优势1 | 熟悉c#,较熟悉vs2017 | 调试能力强 |
优势2 | 较熟悉框架、接口设计 | 对题目需求理解较细致 |
优势3 | 待人友善,乐于沟通 | 待人友善,乐于沟通 |
优势4 | 能提出一些新的设计想法 | 能快速响应需求(设计)中的变化 |
缺点 | debug时不细致,容易进入思惟惯性找不到问题 | 对vs较不熟悉 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
- Estimate | - 估计这个任务须要多少时间 | 60 | 60 |
Development | 开发 | ||
- Analysis | - 需求分析(包括学习新技术) | 240 | 400 |
- Design Spec | - 生成设计文档 | 90 | 90 |
- Design Review | - 设计复审 (和同事审核设计文档) | 90 | 60 |
- Coding Standard | - 代码规范 (为目前的开发制定合适的规范) | 30 | 10 |
- Design | - 具体设计 | 300 | 300 |
- Coding | - 具体编码 | 500 | 720 |
- Code Review | - 代码复审 | 300 | 300 |
- Test | - 测试(自我测试,修改代码,提交修改) | 300 | 240 |
Reporting | 报告 | ||
- Test Report | - 测试报告 | 120 | 120 |
- Size Measurement | - 计算工做量 | 30 | 30 |
- Postmortem & Process Improvement Plan | - 过后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 2090 | 2360 |