结对项目-最长单词链

项目 内容
做业所属课程 2019软件工程_罗杰
做业要求连接 结对项目做业
课程目标: 进行结对编程实践
该做业的帮助 实践结对编程,熟悉双人软工开发流程
队友的结对项目总结 连接

一、本次做业github项目地址

二、开发前PSP表格

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

  • 三个概念总结以下:
    • 1.Imformation hiding:模块内部的数据对外部调用者若不须要则不可访问,保证模块自身的安全性。
    • 2.Interface design:将软件根据功能组成划分为模块,各模块经过接口交互。如此能够将工做划分,经过模块的组合、拓展不断实现更强的总体功能,同时维持程序的稳定性和安全性。
    • 3.Losse coupling:模块之间切断没必要要的依赖,将本身的功能实现彻底在内部完成封装,只提供必要的外部接口,保证各模块交互时系统的健壮性。
  • 践行概念:
    • 1.信息隐藏:类内部数据和私有方法private,以public修饰方法时充分考虑必要性。
    • 2.接口设计:本次做业并不设计很复杂的类设计,但咱们也在并行开发前事先定义好接口,再进行实现,内部核心类的对外接口大多只有一个工做函数完成此类职能范围内的全部功能。
    • 3.松耦合:咱们的c++核心算法模块提供完整参数的gen_chain接口,c#错误处理模块接收命令行参数进行容错处理(由于一开始设计时理解为core模块无需处理命令行参数异常,从而将此模块独立),两者做为总体提供给外部做业要求的API接口。

四、计算模块接口的设计

计算模块是项目核心,计算功能封装在gen_chain_cpp函数接口中,重点在于从接受命令的外模块获取命令和单词,调用gen_chain_cpp函数计算出最长路径。

算法思路简介:根据函数获取的单词表,从中取得有效单词加入有效单词表中,建单词表的同时为每一个单词创建后继表,计算入度,最终创建邻接链表。以后计算路径,对因而否有环的两种状况,首先会对单词进行拓扑排序,若能顺利进行拓扑排序,则是否有参数-r都采用动态规划算法;若不能顺利完成拓扑排序,则说明有单词环存在,此时检查是否有-r参数存在,没有则返回异常信息,有则采用深度优先算法逐个节点进行搜索。
算法关键及独到之处:在节点数据结构中同时存储了单词长度,所以计算时可根据-c和-w参数自由选择路径计算方式。在计算无环路径时,有无首字母要求的算法存在差别:如有首字母要求,则动态规划计算的起点只会选择符合首字母要求的单词,没有首字母要求时则是会选择入度为0的点做为起点进行计算。而对于有无肯定尾字母的状况,根据动态规划算法的结果,每个节点均会存储以该节点为结尾的最长链的路径和长度,所以只需在获取结果时选择符合尾字母要求的点,选出最长路径输出,无尾字母要求则直接从中选出最长路径输出。c++

五、UML图

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

计算模块接口部分的性能改进。 记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展现一张性能分析图(由VS 2015/2017的性能分析工具自动生成),并展现你程序中消耗最大的函数
在完成程序的基本功能后,咱们采用了一些数据对程序进行测试,在少许单词的数据下测试,咱们修复了程序的一些逻辑问题,在可以正确运行小文本数据以后,咱们利用一些大文本数据对程序进行测试,测试结果比较使人失望:因为数据结构的设计问题,程序出现了爆内存的问题。以后咱们经过对数据结构进行重构优化,修复了这一问题,如下是一部分性能测试截图:


以上能够看出耗时最多的时进行动态规划计算时的函数,咱们的动态规划计算性能还有提高空间。git

如下是带有-r参数且图中有环的状况,能够看出searchpath做为深度优先递归函数被频繁调用:


因为采起暴力枚举的方法来进行有环路径的搜索,运行速度较慢,性能仍须要改进。github

七、Design by Contract, Code Contract

  • 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参数的状况下文本有环,该状况由计算模块经过拓扑排序后得出文本是否存在单词环,返回信息给界面模块进行异常处理

十、界面模块的详细设计过程

界面咱们仅采用简单的命令行方式处理:

如下是命令行界面:

十一、界面模块与计算模块的对接


界面模块的对接就是界面模块从命令行获取所需数据,以后调用计算模块方法对计算模块进行调用,计算模块返回处理结果信息后,界面模块做出反馈。

十二、描述结对过程

  • 在项目计划和设计的阶段,咱们采用了彻底的结对讨论。讨论前事先阅读相同的材料,讨论时针对算法问题提出各自的见解和修改意见。如此,咱们肯定了无环状况下基于拓扑排序和动态规划的最长路径算法,对于有环状况通过讨论咱们认定为np问题,明确使用暴力解法,优化也仅针对下降访问成本进行。
  • 在实现过程当中,咱们也充分讨论了关于命令行参数要处理异常的状况,然后才着手实现。实现过程当中算法的数据结构作过几回修改,从一开始使用n*n临接矩阵到使用临界链表(错误实现,结构体传值而非传指针),到最后发现问题终于解决内存占用不断膨胀的问题。优化算法的过程当中咱们也细致地针对性能分析结果和大测试样本下的代码覆盖率进行一些分支必要性的讨论,不断优化。

1三、结对编程反思

  • 结对编程优缺点

    • 正如课本所描述的,结对编程的灵魂在于不间断的复审,不断地交替领航员的位置维持高效率、高正确性的编程过程。
    • 基于这样的分析,便能看到结对编程的条件:两我的须要至少须要在工做任务上掌握的技能相同并水平接近,从而才能以同等的技术水平相互审查提醒。
    • 而不间断互审也是有必定代价的,如两我的须要进行充分的交流,想法上要同步,这是须要花费时间的;又若是两我的并不很好地知足结对编程的条件,如技能覆盖不一样,则交流每每会变成单向的,互审的有效性每每也会变成单向有效。一样地,有些状况下,工做任务是能够平行进行的,如测试程序的编写和功能程序的编写时能够同时进行的,有些较复杂的类也是能够同步开发的,因而结对编程实际上创建在同步开发的机会成本上。
    • 此外,实际践行过程当中,咱们还发现结对编程一旦采用须要尽量全程采用。两人在共同时间没法调和的状况下无可奈何进行的开发,再次结对时每每须要较长间相互说明并理解工做成果,若是遇到问题,则更麻烦,被说明的人每每被原先写代码的人的思路牵着走,较难像正常结对编程互审时保持本身独立的思考,跳出思惟惯性而去发现错误。
  • 我和搭档的优缺点

    本人 搭档
    优势1 熟悉c#,较熟悉vs2017 调试能力强
    优势2 较熟悉框架、接口设计 对题目需求理解较细致
    优势3 待人友善,乐于沟通 待人友善,乐于沟通
    优势4 能提出一些新的设计想法 能快速响应需求(设计)中的变化
    缺点 debug时不细致,容易进入思惟惯性找不到问题 对vs较不熟悉
    • 总的来讲,此次项目咱们尝试告终对编程,但也有一些时间在进行各自开发。结对的时间里有时会由于双方对编程语言的熟悉程度不一样有效率较低的状况,但慢慢地随着磨合的进行,结对工做的代码复审效率大有提升。

1四、PSP表格回填

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
  • 实际开发过程当中,用于学习、实践算法的时间超过预期,其他时间较接近。

1五、模块松耦合

  • 按照做业接口要求封装dll后,咱们和16091049 16061057互换了Core,咱们能正常使用对方的c++ dll,对方调用时却不能看到函数接口问题,但我方自测dll时用c#调用能够正常工做,可能与c++调用c#dll方式有必定关系。
相关文章
相关标签/搜索