结对项目作业

结对项目

前言

项目 内容
这个作业属于哪个课程 北航2020春软工
这个作业的要求在哪里 结对项目作业
我在这个课程的目标是 学习并实践软件开发,提高团队合作的能力
这个作业在哪个具体方面帮助我实现目标 结对编程,在两人合作中增加合作经验。
我的教学班级 005
项目地址 https://github.com/SpookyDreamer/Intersect2

在开始实现程序之前,在下述 PSP 表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5')

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 30 30
Development 开发
· Analysis · 需求分析 (包括学习新技术) 480 480
· Design Spec · 生成设计文档 30 30
· Design Review · 设计复审 (和同事审核设计文档) 30 60
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 240 240
· Coding · 具体编码 480 600
· Code Review · 代码复审 120 60
· Test · 测试(自我测试,修改代码,提交修改) 240 240
Reporting 报告
· Test Report · 测试报告 60 120
· Size Measurement · 计算工作量 30 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 20
合计 1780 1910

看教科书和其它资料中关于 Information Hiding,Interface Design,Loose Coupling 的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。(5')

信息隐藏:将几何对象(直线/射线/线段)的属性设置为私有,设置get方法,从而防止对属性的修改。

松耦合:松耦合使得软件之间的依赖程度降低,从而软件的应用可以更加广泛普适。

计算模块接口的设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。(7')

几何图形类:Point\Line\Radial\Segment

  • 在Point类中重载equals方法,用于判定两点是否相等。

  • 在Line类中主要定义了直线是否平行、点是否在线上、求解两直线的交点、两直线相等的判定、两直线在一条直线上的判定函数,用于交点的计算以及在之后删除几何对象操作时会用到的直线相等的判定方法。

  • Radial类继承于Line类,其主要重写了线相等的判定、点是否在线上的函数,并且新增了一个函数用于求解位于一条直线上的两个射线/线段的交点个数的判定方法

  • 同理Segment为线段类,继承Radial类,主要重写函数同上。

管理几何图形的容器类:LineSeries

  • 有两个属性,一个存放线的数组,一个存放交点的集合

类之间的关系:

  • 根据点可以构造直线/线段/射线类
  • 根据LineSeries类负责管理几何对象。并向UI提供add、delete、clear、cal_intersect等接口。

关键与独到之处:如何求解位于一条直线上的两个射线/线段的交点个数的方法,我们使用了方向向量的思想,对线段和射线进行分类讨论。

看 Design by Contract,Code Contract 的内容:描述这些做法的优缺点,说明你是如何把它们融入结对作业中的。

契约式设计:是一种设计计算机软件的方法。要求软件设计者为软件组件定义正式的,精确的并且可验证的接口。

  • 前置条件:为了调用函数,必须为真的条件,在其违反时,函数决不调用,传递好数据是调用者的责任。
  • 后置条件:函数保证能做到的事情,函数完成时的状态,函数有这一事实表示它会结束,不会无休止的循环
  • 类不变项:从调用者的角度来看,该条件总是为真,在函数的内部处理过程中,不变项可以为变,但在函数结束后,控制返回调用者时,不变项必须为真。

优点:契约式设计可以使软件开发者者有更清晰、有条理的逻辑与设计,能够提高软件的可靠性。缺点:编写契约需要用到大量的时间。

在此次作业中,我们没有采用契约式编程进行接口设计,只是吸取了其思想,在接口设计的时候考虑了应该保证何种前置条件和后置条件

计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。要求总体覆盖率到 90% 以上,否则单元测试部分视作无效。

构造单元测试时基本思路是对每一个类中的方法进行测试,注重代码的细节逻辑,争取覆盖全面。

部分单元测试的代码:

  • 测试同一直线上两线交点个数

结对项目作业_第1张图片

  • 测试容器类的:

结对项目作业_第2张图片

单元测试通过截图:

结对项目作业_第3张图片

单元测试覆盖率截图:没有找到合适的单元测试覆盖率的检查工具。

计算模块部分异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。

在异常处理部分,通过自定义4种异常类,我们完成了4种异常的处理

WrongFormatException //格式错误:文件中的几何对象描述不正确,不能被正确的解析。
UnableToConstructException //给出的几何对象上两点重复,无法构造直线/线段/射线。
CoordinateOutOfRangeException //坐标超过了题目要求的范围。
InfiniteIntersectionPointsException //当插入一个新的几何图形时,会导致无穷个交点的出现。 

异常的应用场景以及单元测试。

  • WrongFormatException

    这个异常出现在从文件中导入集合对象的描述时,描述的格式与题目要求不符。

    char type;
    double x1 = 0, y1 = 0, x2 = 0, y2 = 0;
    		try {
    			if (getline(input, strLine)) {
    				//split line
    				vector res;
    				stringstream aline(strLine);
    				string result;
    				while (aline >> result)
    					res.push_back(result);
    				//exception
    				if (res.size() != 5) {
    					throw WrongFormatException();
    				}
    				stringstream countstr(res[0]);
    				if (!(countstr >> type)) {
    					throw WrongFormatException();
    				}
    				if ((type!='L') && (type != 'R') && (type != 'S')) {
    					throw WrongFormatException();
    				}
    				stringstream x1str(res[1]), y1str(res[2]), x2str(res[3]), y2str(res[4]);
    				if ((!(x1str >> x1)) || (!(y1str >> y1)) || (!(x2str >> x2)) || (!(y2str >> y2))) {
    					throw WrongFormatException();
    				}
    			}
    			else {
    				throw WrongFormatException();
    			}
    

    这类异常没有进行单元测试。进行的测试主要是改变input.txt中的内容,通过命令行的运行,观察输出的错误信息是否一致。

  • UnableToConstructException

    这个异常出现在构造几何对象(直线/线段/射线)时。当出现这种错误时,无法构造直线/线段/射线。

    if (point1->equals(point2)) {
    		throw UnableToConstructException();
    	}
    

    单元测试:

    Point* pe4 = new Point(0, 0);
    			try {
    				Line* l3 = new Line(pe4, pe4);
    				Assert::IsFalse(true);
    			}
    			catch (UnableToConstructException& e) {
    				Assert::AreEqual(e.what(), "ERROR! Since the two points given coincide, we cannot construct a line.\n");
    			}
    
  • CoordinateOutOfRangeException

    这个异常出现在构造几何对象(直线/线段/射线)时。这种情况不符合题目要求

    if (x1 >= 100000 || x1 <= -100000 || y1 >= 100000 || y1 <= -100000 || x2 >= 100000 || x2 <= -100000 || y2 >= 100000 || y2 <= -100000) {
    		throw CoordinateOutOfRangeException();
    	}
    

    单元测试:

    Point* pe1 = new Point(0, 0);
    Point* pe2 = new Point(-100000, 0);			
    	try {
            Line* l1 = new Line(pe1, pe2);
    		Assert::IsFalse(true);
    	}
    	catch (CoordinateOutOfRangeException& e) {
    				Assert::AreEqual(e.what(), "ERROR! Both horizontal and vertical values should be within  (-100000, 100000).\n");
    			}
    
  • InfiniteIntersectionPointsException

    这个异常出现插入新的几何对象时。当新插入的这个图形会导致目前的几何对象集会出现无穷多个交点的时候,则不应该将其插入集合中。

    char type1 = l->getType();
    if (!line->inOneLine(l)) {
    	continue;
    }
    if (line->getType() == 'L' || l->getType() == 'L') {
    	throw InfiniteIntersectionPointsException();
    }
    Radial* r0 = (Radial*)line;
    Radial* r1 = (Radial*)l;
    int tmp = r0->countIntersectinOneLine(r1);
    if (tmp < 0) {
    	throw InfiniteIntersectionPointsException();
    }
    

    单元测试:

    LineSeries* ls0 = new LineSeries();
    Point* pe5 = new Point(0, 0);
    Point* pe6 = new Point(1, 1);
    Line* le1 = new Line(pe5, pe6);
    Segment* se1 = new Segment(pe5, pe6);
    ls0->add_line(se1);
    try {
    	ls0->add_line(le1);
    	Assert::IsFalse(true);
    }
    catch (InfiniteIntersectionPointsException& e) {
    	Assert::AreEqual(e.what(), "ERROR!There are infinite points of intersection between geometric objects .\n");
    }
    

界面模块的详细设计过程。在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。(5')

(队友完成)

界面模块与计算模块的对接。详细地描述 UI 模块的设计与两个模块的对接,并在博客中截图实现的功能。(4')

(队友完成)

描述结对的过程,提供两人在讨论的结对图像资料(比如 Live Share 的截图)。关于如何远程进行结对参见作业最后的注意事项。(1')

我们主要采用了live share与微信聊天、微信语音等方式进行结对编程。
结对项目作业_第4张图片

结对项目作业_第5张图片

看教科书和其它参考书,网站中关于结对编程的章节 ,说明结对编程的优点和缺点。同时描述结对的每一个人的优点和缺点在哪里(要列出至少三个优点和一个缺点)。(5')

  • 结对编程的优缺点

    优点 缺点
    结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。结对编程可以促进结对伙伴之间的交流,增强沟通能力。同时,结对编程中两人可以互相监督,避免开小差等行为。 结对的伙伴需要磨合,花费时间会比较久。由于磨合期的存在,加之两人同写一份代码,结对编程的效率可能比较低下。
  • 结对编程的每个人的优缺点

    优点 缺点
    本身 认真;比较注重细节; 编码能力不足,学习新的知识用时久,拖延。
    结对同学 编码速度较快;思路比较清晰; 对C++不熟悉,拖延

在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。

见上。

你可能感兴趣的:(结对项目作业)