结对项目-最长单词链
作者:互联网
项目 | 内容 |
---|---|
所属课程 | 2019春季计算机学院软件工程(任健) |
所属作业 | 结对项目-最长单词链 |
课程目标 | 理解软件工程的作用和重要性,提升工程能力,团队协作能力 |
作业目标 | 实战双人结对编程 |
1 GitHub项目地址
https://github.com/shewhowasborngood/wordChain/invitations
2 & 14 PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 35 |
Development | 开发 | ||
· Analysis | · 需求分析(包括学习新技术) | 360 | 450 |
· Design Spec | · 生成设计文档 | 40 | 0 |
· Design Review | · 设计复审(和同事审核设计文档) | 30 | 0 |
· Coding Standard | · 代码规范(为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 100 | 150 |
· Coding | · 具体编码 | 400 | 660 |
· Code Review | · 代码复审 | 60 | 90 |
· Test | · 测试(自我测试,修改代码。提交修改) | 300 | 500 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 100 | 70 |
· Size Measurement | · 计算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 15 | 0 |
合计 | 1100 | 2015 |
3 接口设计方法
Information Hiding
信息隐藏是将最有可能变化的设计决策分离开来,从而保护程序的其它部分,即使此设计决策被改变,
其它部分也不会受到特别大的更改。保护涉及提供稳定的接口,即使用编程语言功能(如私有变量)或
显式导出策略来阻止其客户端访问类或软件组件的某些方面。信息隐藏是原则,封装是技术,软件模块
通过将信息封装到呈现接口的模块或其他构造中来隐藏信息。在面向对象的编程中,信息隐藏(通过类
型嵌套)通过将代码对设计决策的依赖性转移到明确定义的接口上来降低软件开发风险。接口的客户端
完全通过它执行操作,因此如果实现更改,客户端不必更改。
例如在我们的程序中,通过将所有实现封装成私有,这样当类发生改变时,调用者不需要改变任何代码,
除非类的公共接口发生了变化。
4 计算模块接口的设计与实现过程
算法描述
采用面向对象的设计思想,运用动态规划的方法,不断的拆分数组,以寻找符合要求的,再将若干个目标合并。
类的介绍
计算模块的类包括Wordlist类、Word类和List的模板类
Wordlist类:处理读取的单词表,生成目标单词链
Word类:存储单词及单词的相关信息(首尾字母,单词长度)
List的模板类:提供链表的基本方法
关键算法
在Wordlist类里的getwordchain函数是实现最大子链功能的部分,排除找到目标尾部、子
链为空、子链中没有符合要求的单词这几个终止递归的情况外,单词表中剩下的单词要进入
递归进行进一步的查找:如果找到了可连接单词,在链表中删除该单词,然后在剩下单词组
成的新链表中递归查找最长单词串;接着找到子链表中的最大子链,并比较,选择更大的一
个;一直进行递归调用直到子链中没有符合要求的单词,则返回最大子链(当最大子链不存
在,返回空链表)。
5 UML
6 计算模块接口部分的性能改进
可以通过改进部分算法减少递归次数:在递归开始前遍历所有单词,标记出尾字母没有任何
对应的单词的首字母的单词,可以降低一些复杂度
7 Design by Contract & Code Contract
函数调用者应该保证传入函数的参数是符合函数的要求,如果不符合函数要求,函数将拒绝继续执行。
如果按照契约式编程的思想编写代码,就要求我们写函数时检查函数参数。有时候是简单的判断某个参
数不能为空,或者数值不能小于0。如果在项目中全面应用契约式编程,则应该有一个“契约框架”帮我们
来做这些事情。
所谓契约与我们通常所说的商业契约很相似,有以下几个特点:
- 契约关系的双方是平等的,对整个bussiness的顺利进行负有共同责任,没有哪一方可以只享有权利
而不承担义务。 - 契约关系经常是相互的,权利和义务之间往往是互相捆绑在一起的;
- 执行契约的义务在我,而核查契约的权力在对方;
- 我的义务保障的是你的利益,而你的义务保障的是我的利益;
一般认为在模块中检查错误状况并且上报,是模块本身的义务:一旦条件不满足,我方(义务方)必须
负责以合适手法处理这尴尬局面,或者返回错误值,或者抛出异常。而在契约体制下,对于契约的检查并
非义务,实际上是在履行权利:如果条件不满足,那么错误在对方而不在我,我可以立刻“撕毁合同”,罢
工了事,无需做任何多余动作。这无疑可以大大简化程序库和组件库的开发。
### 8 单元测试
9 异常处理
在不允许出现环情况下出现了环,报错退出
命令行参数不符合规定的,不响应
在命令行输入-h -t时,若后面出现的不是单个字母,默认读首字母
文件无法打开时,报错退出
10 命令行模块设计
直接在main函数里实现,对每个命令行参数进行判断,并对应不同处理
11 命令行模块与计算模块对接
通过传参的方式,在计算模块中把对应参数传递进去
12 结对过程
13 结对编程优缺点
优点
- 能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力
- 结对工作能带来更多的信心,高质量的产出能带来更高的满足感
- 能更有效地交流,相互学习和传递经验
缺点
- 编码不再是私人的工作,而是一种公开的“表演”
标签:结对,子链,单词,模块,契约,设计,最长 来源: https://www.cnblogs.com/wangchao-0511/p/10540465.html