-
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 认识结对编程 教学班级 005 项目地址 PairIntersectProject
二、PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 150 | 180 |
· Design Spec | · 生成设计文档 | 40 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
· Design | · 具体设计 | 60 | 70 |
· Coding | · 具体编码 | 180 | 190 |
· Code Review | · 代码复审 | 20 | 15 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 660 | 675 |
三、封装、接口与松耦合
本次作业我们的项目分工为:
-
L:实现求交点功能的扩展
-
X:编写UI界面
那么为了使得对接顺利,编写求解交点的同学需要将该模块封装,与编写UI界面的同学保持独立性,提升对接效率。那么如何保持求解交点功能的独立性呢?为此,L同学设计了求解模块的接口,求解计算的功能对调用者不透明;命令行输入模块及UI输入模块仅调用接口函数,输入几何图形,得到该几何图形的交点。个人认为降低耦合程度的最好办法就是面对耦合少给数据和函数,这里我们设计的接口中内容如下:
1 class Point //坐标(x, y) 2 { 3 ... 4 }; 5 6 std::set<Point> get_inters(char type, double x1, double y1, double x2, double y2); 7 std::set<Point> get_inters(double p, double q, double r);
根据我们程序的设计,最小化了接口规模,实现松耦合。
四、接口设计与实现
接口模块共有一个类两个函数:
-
class Point:点类,用于存储交点
-
get_inters(5参数):求线类与已有几何图形的交点
-
get_inters(3参数):求圆与已有几何图形的交点
函数的动作流程如下图
五、UML
(注:略去了部分属性和方法)
六、性能分析
从该性能分析图中可以看出,set的查找和排序占据大量的CPU资源,对于此我认为实用unordered_set会改善性能,因为其查找效率更高一点,但是我们本次作业并没有进行此项改进,只对计算交点的算法进行了改进。不同于上次作业的用公式求,本次作业采用向量法求解交点,改进了计算的效率。
七、Contract
-
优点
-
大量的计算机科学研究开始探究正式的规范说明和验证,它允许在编译时检查程序的正确性;
-
将API的需求和承诺与实现相分离;
-
契约约定比文档约定方式更“同步”一些;
-
-
缺点
-
增加了代码量
-
难以检测错误
-
由于之前没有系统学过contract,本次作业没有采用这种方式约定,而使用文档的方式来进行约定。
八、单元测试展示
接口函数是软件的最顶级函数,其功能为求出图形与已经记录的图形的交点,每个类型的对象都进行测试:
-
当前线对象求与线的交点
-
当前线对象求与圆的交点
-
当前圆对象求与线的交点
-
当前圆对象求与圆的交点
以此实现高覆盖率,代码如下:
1 Assert::AreEqual((int)get_inters('L', 0, 0, 1, 1).size(), 0); 2 Assert::AreEqual((int)get_inters('R', 1, -1, -1, 1).size(), 1); 3 Assert::AreEqual((int)get_inters(0, 0, 2).size(), 3); 4 Assert::AreEqual((int)get_inters(2, 0, 2).size(), 4); 5 Assert::AreEqual((int)get_inters('S', 0, 3, 3, 0).size(), 2);
九、异常处理说明
错误类型 | 输入(其中一种) | 输出 |
---|---|---|
圆半径非正 | 1 C 0 0 0 |
R should > 0! |
类型未定义 | 1 a 0 0 1 |
Undefined type! |
线类两点重合 | 1 L 1 1 1 1 |
Line should be a point! |
未输入几何个数 | L 1 0 0 1 | No geometry number input! |
类型错误 | 1 - |
Wrong type! |
参数错误 | 1 L - - - - |
Wrong parameter! |
十、结对过程及评价
优点:
1、互相鼓励,不容易沮丧:团队工作能增加成员的工作积极性。因为在面对问题的时候,会有人一起分担,共同尝试新的策略。
2、互相监督,不容易偷懒:两个人一起工作需要互相配合,如果想偷懒去干别的,就会拖延工作进度。
3、互相学习编程技巧:在编程中,相互讨论,可以更快更有效地解决问题,互相请教对方,可以得到能力上的互补。
4、可以培养和训练新人:让资深开发者和新手一起工作,可以让新人更快上手。
5、多双眼睛,少点 bug:两人互相监督工作,可以增强代码和产品质量,并有效的减少 BUG。
缺点:
1、与合不来的人一起编程容易发生争执,不利于团队和谐。
2、经验丰富的老手可能会对新手产生不满的情绪。
3、开发者之间可能就某一问题发生分歧,产生矛盾,造成不必要的内耗。
我 | PTN | |
---|---|---|
优点 | 代码风格良好 | 容易接受新知识 |
代码框架清晰 | 编程思维活跃 | |
善于交流 | 擅长开发算法 | |
缺点 | 编程基础薄弱 | 软件使用不统一 |