教学班级:005
项目地址:https://github.com/gzhGit/Intersectprogit
项目 | 内容 |
---|---|
这个做业属于哪一个课程 | 班级博客 |
这个做业的要求在哪里 | 结对项目 |
我在这个课程的目标是 | 学会团体和我的的软件开发方式 |
这个做业在哪一个具体方面帮我实现目标 | 结对编程,体会合做 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
.Estimate | 估计这个任务须要多少时间 | 40 | 40 |
Development | 开发 | ||
·Analysis | 需求分析 (包括学习新技术) | 600 | 没有具体计算 |
·Design Spec | 生成设计文档 | 60 | 60 |
·Design Review | 设计复审 (和同事审核设计文档) | 10 | 10 |
·Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
·Design | 具体设计 | 20 | 0 |
·Coding | 具体编码 | 400 | 没统计 |
·Code Review | 代码复审 | 30 | 30 |
·Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | ||
·Test Report | 测试报告 | 20 | 20 |
·Size Measurement | 计算工做量 | 20 | 20 |
·Postmortem & Process Improvement Plan | 过后总结, 并提出过程改进计划 | 60 | 60 |
Information Hiding:对这一项应用比较少,全部类的属性和方法基本都是public,没有特别隐藏的方法或者变量。
Interface Design:只是建立一个能工做的应用程序是不够的。 用户期待直观的,吸引人的,强壮的应用。因此咱们采用gui来完成与用户的交互。图形界面简单直接,易于操做。
Loose Coupling:不少不须要交流的参数和变量都封装在模块单元内部,不用被其余单元知晓,其余模块单元只须要知道提供的函数接口须要的数据类型,以及返回的数据类型。github
咱们在core模块中,为点、线、圆各建了一个类。其中,线分为直线、线段、射线,这三种都属于线这个类,用类中的一个整型变量来区分(0-直线,1-射线,2-线段)。而后线与线求交点,而后线与圆求交点,而后圆与圆求交点三个函数(直线、线段、射线都属于线,用同一个函数处理,在求出交点后,根据射线和线段的性质对交点取舍)。这些外部单元模块不须要知道,core向外提供了三个重载函数solve做为借口,外部模块只须要按头文件中的函数声明顺序输入参数便可(输入的参数就和结对项目中给的样例是同样的,好比直线就输入一个字符‘L’,四个整型表明两个点坐标,采用这样的标准输入来下降耦合度)。算法
咱们起初用来存储几何类型数据信息的数据结构是set容器,可是set容器是一个基于红黑树的容器,他须要维护树结构的平衡和顺序,这会带来时间开销,然而这些功能对于此次的项目是没有必要的,因此咱们又换用了vector容器。vector容器至关于就是一个动态数组,他的插入、删除速度要因为set,可是数组扩容时,vector须要复制整个数组,也须要大量的时间开销。vector还有一个致命的问题。在插入几何对象时须要判断这个集合对象是否已经存在容器中,要解决这个问题,vector须要遍历一遍整个数组,在分析图中咱们也能够看到,在插入点时,为了不插入重复点,须要大量时间遍历数组,占到了90%以上的时间开销。因而咱们决定使用hash结构来存储几何类型,能够避免对容器的遍历
编程
http://en.wikipedia.org/wiki/Design_by_contract
http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx
描述这些作法的优缺点,说明你是如何把它们融入结对做业中的。
优势:
(1)编写者和使用者均可以获得足够的信息。
(2)对于编写者来讲,明确接口功能,检查预期行为,帮助debug,缩小了检测时间的花销。
(3)对于使用者来讲,必要的有关接口的信息,给了使用者正确的使用方法。
缺点:编写须要额外的时间开销。数组
首先咱们考虑全部的几何类型组合,共有10种(从4个选2个,好比LC相交,从4个选1个,好比LL相交),再根据分支覆盖状况添加测试样例。
微信
咱们设计了4种异常状况:
(1)输入几何类型字符不合法,输入了L, R, S, C以外的几何类型
(2)输入的点的坐标不在规定范围内
(3)输入的直线的两个端点重合
(4)输入的圆的半径r小于等于0
数据结构
ui模块如图所示,有两种输入方式:(1)直接从文件导入; (2)输入几何对象数据信息来增长集合对象。
用户输入数据后,ui模块调用core模块的solve函数接口,将这些数据传到core模块中去运算,core将算出来的交点坐标返回给ui模块,ui在下方的显示界面上绘制出几何图形和交点。架构
咱们使用了qt的信号与槽机制来实现以上功能。首先咱们所用的组件有6个push button,分别是上图中给出的6个功能,每一个push button对应一个被用户点击都会发出一个clicked()信号(这个信号函数由qt的库提供),咱们的工做主要是包这些clicked()对应到相应的功能上,也就是qt的信号与槽机制。如下是这几个槽函数的函数声明以及6个push botton的声明,以及注释说明每一个槽函数具体干什么。函数
private: QPushButton *btnFile; QPushButton *btnHelp; QPushButton *btnLine; QPushButton *btnCycle; QPushButton *btnInfile; QPushButton *btnAbout; private slots: void on_btnFile(bool checked); //btnfile按钮的clicked(bool)信号的槽函数,点击将会进入选择要导入的文件路径 void on_btnHelp(bool checked);//btnHelp按钮的clicked(bool)信号的槽函数,点击将会跳出一个文本窗口介绍本UI界面 void on_btnLine(bool checked); //btnHelp按钮的clicked(bool)信号的槽函数,点击将会跳出一个窗口,用户在这个窗口输入想要插入的Line的参数 void on_btnCycle(bool checked); //btnCycle按钮的clicked(bool)信号的槽函数,点击将会跳出一个窗口,用户在这个窗口输入想要插入的Cycle的参数 void on_btnInfile(bool checked); //btnInfile按钮的clicked(bool)信号的槽函数,点击将会把先前读入的文件信息转化为几何图形绘制在画布上。 void on_btnAbout(bool checked); //btnAbout按钮的clicked(bool)信号的槽函数,点击将会跳出一个文本窗口,窗口中显示当前已输入几何图形的数字信息。
微信语音形式,界面分享靠截图。工具
优势:(1)两我的起到了一个相互监督的做用,有助于双方(尤为是在写代码的一方)集中于工做。 (2)两我的一块儿工做,能够随时讨论程序算法、架构等问题,集思广益。 (3)一我的在写代码的同时,另外一我的在debug,极大的下降了出bug的可能性。 缺点:须要两我的有比较默契的合做,两人实力差距也不该过大。