结对项目作业
结对编程作业
1.在文章开头给出教学班级和可克隆的 Github 项目地址
- 教学班级:005
- 项目地址: https://github.com/Junhaoo/IntersectProject2.git
2.在开始实现程序之前,在下述 PSP 表格记录下你估计将在程序的各个模块的开发上耗费的时间
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 300 | 640 |
· Design Spec | · 生成设计文档 | 30 | 60 |
· Design Review | · 设计复审(和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范(为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 240 | 180 |
· Code Review | · 代码复审 | 60 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 40 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 120 |
Total | 合计 | 920 | 1320 |
3.看教科书和其它资料中关于 Information Hiding,Interface Design,Loose Coupling 的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的
- 除了尽可能使用private修饰成员变量外,最有代表性的就是接口的使用。接口本身就是Information Hiding的实现。类与类、层与层之间不展示细节,只进行必要的通信,从而达成Loose Coupling,最大程度降低了模块之间的依赖性,几乎不用担心彼此的影响,但对设计的要求也更高,是多人开发常用的手段。但有些情况下,也不适合使用接口、松耦合等方式,如整个任务本身各个部分的耦合度较高时,松耦合的设计不仅在难度上提高了不少,而且也会直接影响性能。
- 在我们的项目中,将核心部分单独设计,通过输入,得到输出,不展示其他细节,如使用容器,实现方法等。具体实现见第4部分。
4.计算模块接口的设计与实现过程
共计五个接口,
- addPlot用于添加几何图形
- removePlot用于删除几何图形
- printPlots用于打印(返回)所有几何图形
- printDots用于打印(返回)所有交点
- reloadIOstream用于重载输入输出流
其中的难点在于删除几何图形,实现主要依靠重复点的存取。
使用两个容器:set
前者存储无重复的点集,后者存储可重复的点集(对于三条以上线交于一点的情况),每次removePlot操作,将multiset中与移除几何图形相关的点全部剔除,再将multiset去重得到set,总体时间复杂度仅为去重的时间复杂度,无需重新生成一遍点集。
5.画出 UML 图显示计算模块部分各个实体之间的关系
- 省略细节
6.计算模块接口部分的性能改进
- 并没有做出性能改进
7.看 Design by Contract,Code Contract 的内容,描述这些做法的优缺点,说明你是如何把它们融入结对作业中的
- 在我的理解中,契约式设计的核心就是assert的使用,可能出现未知错误的地方都assert一下。这样确实能够保证正确性,但有时候,对assert内容的处理是很十分重要的,一句assert就可以把包袱甩出去。可能会使得另一方的编程由完成目标变成了完成契约。
- 结对作业中并没有应用到DbC。
8.计算模块部分单元测试展示
- 无单元测试环节
9.计算模块部分异常处理说明
主要设计了三种异常:
OutRangedException:输入的数据超出给定的(-100000,100000)范围
DuplicatedDotException:用于确定几何图形的两点重合
UnknownTypeException:除了C,L,R,S之外的其他类型
10.界面模块的详细设计过程
- 由于对时间的把握不充分,以及对C++的不熟悉,从选择UI的开发工具到选定工具,再到学习相关工具的使用,花费了过多的时间,没能按时完成。
11.界面模块与计算模块的对接
- 无
12.描述结对的过程
主要靠QQ交流 (基本都是夜深人静的时候写代码,不好用语音类的工具)
13.结对编程的优点和缺点与结对的每一个人的优点和缺点
结对编程:
- 优点:相互学习;提高积极性;1+1>2(大概)。
- 缺点:门槛较高,需要至少一方对开发环境、流程等有较清楚的认识,否则,结果基本都是1+1<2。
我:
- 优点:善于熬夜、抗压能力强、敢于尝试新技术
- 缺点:对新知识理解太慢、拖延症
队友:
- 优点:写代码较快、C++较擅长(比我好)、善于测试
- 缺点:拖延症
14.在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间
- 见第2部分
总结:
对于本次作业的完成情况很不满意,虽然花的时间比大多数人要多了不少,但对于学习新知识以及寻找合适的工具还是很不擅长,时间安排也很不合理。会在接下来的一周内继续完善项目,直到自己满意。