结对编程作业

一、作业信息

二、PSP

PSP2.1Personal 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
优点 代码风格良好 容易接受新知识
  代码框架清晰 编程思维活跃
  善于交流 擅长开发算法
缺点 编程基础薄弱 软件使用不统一

 

注:UI模块部分的博客: https://www.cnblogs.com/csdcounter/p/12560377.html

原文地址:https://www.cnblogs.com/lucien98/p/12560679.html