BUAA_2020_软件工程_结对项目作业
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 班级博客 |
这个作业的要求在哪里 | 作业要求 |
我在这个课程的目标是 | 掌握软件工程的思路方法 |
这个作业在哪个具体方面帮助我实现目标 | 学习结对编程 |
教学班级 | 006 |
项目地址 | https://github.com/Reliacrt/INTERSECTION_GUI/ |
看教科书和其它资料中关于 Information Hiding,Interface Design,Loose Coupling 的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。
- Information Hiding: 外部使用Shape类求解交点时不需要知道某个形状的具体信息,具体信息被隐藏在子类内部;
- Interface Design: 所有子类继承自Shape类统一的intersect接口,即,对外求解的接口是统一的;
- Loose Coupling: 其他模块不需要负责具体的求解交点的过程。
计算模块接口的设计与实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。
类:
核心类
一个抽象类(Shape),四个子类:
- Line:直线
- Circle:圆
- Segment:线段
- Radial:射线
工具类
- Point类(记录交点信息),
- RetPoints类(记录两个图形交点信息,可能0、1、2个点),
- ShapeList类(用于异常处理);
函数:
三个主要函数(用于求直线与直线、直线与圆、圆与圆的交点)
- inline RetPoints line_inter_line(Shape* s1, Shape* s2);
- inline RetPoints line_inter_circle(Shape* s1, Shape* s2);
- inline RetPoints circle_inter_circle(Shape* s1, Shape* s2);
判断函数(判断交点是否在射线或直线上,如果不在的话就删除)
- inline RetPoints segment_constraint(Shape* s, RetPoints orig);
- inline RetPoints radial_constraint(Shape* s, RetPoints orig);
- inline bool on_radial(Point p, Shape* s);
- inline bool on_segment(Point p, Shape* s);
与异常处理相关的函数:
void add_shape(char* line);
void delete_shape(char* line);
inline char* decide_char(char* s, char* c);
inline char* decide_int(char* s);
inline void decide_more(char* s);
add_shape函数是与外界的接口,传进输入(例如“C 1 1 1”),然后通过decide_char、decide_int、decide_more判断输入是否异常;
delete_shape函数用于GUI模块删除某个几何对象,并且判断异常(没有被删除的对象);
接口:
- RetPoints intersect(Shape* ano);
- vector<Shape*> get_shapelist();
get_shapelist用于传出向量(所有new的对象(Line、Circle、Segment、Radial));
四个类(Line、Circle、Segment、Radial)都有成员函数RetPoints intersect(Shape* ano),外部通过该函数来求两两几何对象的交点,外部可以通过set(去重)来存储交点信息。
关键函数流程图:
函数不复杂,可用文字表达:
三个主要函数(用于求直线与直线、直线与圆、圆与圆的交点)用公式求交点即可;void add_shape(char* line)函数对line先判断格式(字符 数字 数字 ...),格式不对抛出异常,然后new相应的对象,与已有的几何对象比较,如果重合抛出异常,否则将该对象加入shapelist中;
算法的关键:
关键在于求两个几何对象的交点;
算法的独到之处:
线段、射线可以看成直线,只需计算交点后判断交点是否位于线段或者射线之上即可,double的比较(eps)。
阅读有关 UML 的内容:https://en.wikipedia.org/wiki/Unified_Modeling_Language。画出 UML 图显示计算模块部分各个实体之间的关系(画一个图即可)。
计算模块接口部分的性能改进。记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由VS 2015/2017的性能分析工具自动生成),并展示你程序中消耗最大的函数。
在改进计算模块性能上花费60min;改进思路:改进之前两个几何对象的交点信息用vector记录,发现比较浪费时间和空间(最多两个交点),改建一个新类RetPoints来记录信息、改进之前判断两线是否重合通过化简A、B、C(求最大公因子),然后比较是否相等,改进之后可以直接取一条直线上的两点带入另一条线判断即可。
性能消耗最大的函数:
## 看 Design by Contract,Code Contract 的内容:http://en.wikipedia.org/wiki/Design_by_contract、http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx描述这些做法的优缺点,说明你是如何把它们融入结对作业中的。
- 优点:可以严格规范实现的有效性,经过约束的代码可靠性更高;
- 缺点:实现难度大,投入成本高。
尽量将契约式设计的思维融入单元测试中,通过单元测试努力接近契约式设计。
计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。要求总体覆盖率到 90% 以上,否则单元测试部分视作无效。
计算模块为CORE.cpp
计算模块部分异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
序列号 | 异常 | 单元测试样例 | 说明 |
---|---|---|---|
1 | Input char does not conform to four formats | shapelist->add_shape("E 1 1 1"); | 没有E这种格式 |
2 | Fewer inputs | shapelist->add_shape("C 1 1"); | 输入数字太少 |
3 | Leading 0 | shapelist->add_shape("C 1 1 001"); | 输入数字有前导0 |
4 | The input number does not meet the requirements | shapelist->add_shape("C 1 1 10000000"); | 输入数字不符合要求 |
5 | More inputs | shapelist->add_shape("C 1 1 1 1"); | 输入数字太多 |
6 | Two point superposition | shapelist->add_shape("L 1 1 1 1"); | 输入两点重合 |
7 | Circle radius is 0 | shapelist->add_shape("C 1 1 0"); | 圆半径为0 |
8 | Infinite intersections | shapelist->add_shape("C 1 1 1"); shapelist->add_shape("C 1 1 1"); | 无穷多个交点 |
9 | Deleted element is empty | shapelist->delete_shape("C 1 1 1"); | 没有删除对象 |
界面模块的详细设计过程。在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。
控件
- 输入文本框
- Insert按钮
- Delete按钮
- 绘图区
回调函数
- text_cb: 保存输入数据的指针
- bt_insert_cb: 向ShapeList中插入图形,若出错打印错误信息
- bt_delete_cb: 从ShapeList中删除图形,若出错打印错误信息
- update_canvas: 绘图区重绘函数
绘图(即update_canvas函数)
- 初始化绘图区;
- 绘制x、y轴;
- 遍历Shape的数组,绘制每个Shape
- 坐标转换
- 绘制图形
- 遍历Point的数组,绘制每个交点
- 坐标转换
- 绘制图形
坐标转换
// unit求解每单位坐标的像素数
inline double unit(int w, int h, double mx, double my)
{
// w: width
// h: height
// mx: 最大绘制图形的横坐标
// my: 最大绘制图形的纵坐标
double xu = (w / 2.0) / (mx + 5);
double yu = (h / 2.0) / (my + 5);
return xu < yu ? xu : yu;
}
// trans转换图形的坐标到canvas的坐标
inline double trans(double x, int w, double un)
{
// x: x或y坐标
// w: 宽度或高度
// un: unit
return w / 2.0 + x * un;
}
上述两个函数就实现了将某个点数学的x、y坐标转换为canvas的坐标的功能。
界面模块与计算模块的对接。详细地描述 UI 模块的设计与两个模块的对接,并在博客中截图实现的功能。
模块对接
- 使用CORE模块导出得ShapeList存储各个Shape
- 遍历ShapeList使用Shape类的intersect接口计算Point集合
- 使用ShapeList的add_shape和delete_shape添加删除某个Shape
如图,绘制了圆、直线、线段、射线及其交点
描述结对的过程,提供两人在讨论的结对图像资料(比如 Live Share 的截图)。
一者提出设计方案,一者进行其实现,大致按照了领航员的结对方式。
看教科书和其它参考书,网站中关于结对编程的章节,例如:http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html ,说明结对编程的优点和缺点。同时描述结对的每一个人的优点和缺点在哪里(要列出至少三个优点和一个缺点)。
结对编程
优点
两人协作更容易代码复审,提前发现错误
缺点
两人一起编码时,代码产出效率会低一些
本人
优点
- 设计思路清晰
- 代码组织结构清楚
- 思维敏捷
缺点
- 代码更容易出漏洞
结对对象
优点
- 写代码投入时间更多
- 思考较为全面
- 步骤繁琐但不易出错
缺点
- 思路流程常常比较复杂
在你实现完程序之后,在附录提供的PSP表格记录下你在程序的各个模块上实际花费的时间。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | 970 | 1240 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 50 |
· Design Spec | · 生成设计文档 | 50 | 50 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 60 | 80 |
· Coding | · 具体编码 | 600 | 800 |
· Code Review | · 代码复审 | 100 | 100 |
· Test | · 测试(自我测试,修改代码,提交修改) | 100 | 100 |
Reporting | 报告 | 60 | 60 |
· Test Report | · 测试报告 | 40 | 40 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 1050 | 1320 |
BUAA_2020_软件工程_结对项目作业的更多相关文章
- BUAA_2020_软件工程_个人项目作业
作业抬头(1') 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 了解软件工程的技术,掌握工程化开发的能力 这 ...
- BUAA软件工程结对项目作业
BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...
- BUAA 2020 软件工程 结对项目作业
Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...
- BUAA软件工程_结对编程
1.写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...
- BUAA 软工 结对项目作业
1.相关信息 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...
- BUAA软工-结对项目作业
结对项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 通过这门课锻炼软件开发能力和经验,强化与他人合作 ...
- BUAA_2020_软件工程_热身作业
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 热身作业要求 我在这个课程的目标 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方面 ...
- 结对项目作业GUI
一.Coding.Net项目地址:https://git.coding.net/zhengsh589/CoupleProject.git 二.PSP表格(完成前): PSP 任务内容 计划共完成需要的 ...
- 结对项目作业报告——四则运算web项目
成员:顾思宇2016011993 程羚2016012050 1.仓库地址:https://git.coding.net/DandelionClaw/WEB_Calculator.git 注: 本项 ...
随机推荐
- Mybatis-基本学习(上)
目录 Mybatis mybatis开始 -----环境准备 一.简介 1.什么是MyBatis 2.持久化 3.持久层 4.为什么需要Mybatis? 二.第一个Mybatis程序 1.搭建环境 1 ...
- 如何实现 iOS 短视频跨页面的无痕续播?
在一切皆可视频化的今天,短视频内容作为移动端产品新的促活点,受到了越来越多的重视与投入.盒马在秒播.卡顿率.播放成功率等基础优化之外,在用户使用体验上引入了无痕续播能力,提升用户观看视频内容的延续性. ...
- Prism+WPF使用DependencyInjection实现AutoMapper的依赖注入功能
前言 在使用PRISM+WPF开发项目的过程中,需要使用AutoMapper实现对象-对象的映射功能.无奈PRISM没有相关对AutoMapper相关的类库,于是转换一下思想,在nuget 中存在有关 ...
- 边缘使用 K8s 门槛太高?OpenYurt 这个功能帮你快速搭建集群!
OpenYurt作为阿里巴巴首个开源的边缘云原生项目,涉及到边缘计算和云原生两个领域.然而,许多边缘计算的开发者并不熟悉云原生相关的知识.为了降低 OpenYurt 的使用门槛,帮助更多地开发者快速上 ...
- TP5路由的位置导致错误
// 测试 '[js]' => [ ':id' => ['test/test/js', ['method' => 'get'], ['id' => '\d+']], ':id/ ...
- DEDE留言板调用导航的方法
DEDE留言板调用导航的方法 dede里的留言板guestbook.htm用{dede:include filename="../default/head.htm"/}不能自动生成 ...
- 制作python程序windows安装包(飞机大战源码)
本文以飞机大战源码为例: 1.首先使用pyinstaller -w xxx.py打包 -w的意思是不显示命令行:飞机大战源码由多个.py文件以及一些图片,音乐文件组成,我们将main.py打包, ...
- [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统
[源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 目录 [源码解析] PyTorch 流水线并行实现 (3)--切分数据和运行时系统 0x00 摘要 0x01 分割小批次 ...
- Keras函数——keras.callbacks.ModelCheckpoint()及模型的训练
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_ ...
- 打开属性页,分别在Debug和Release下将其配置类型改为:静态库(.lib);
右键工程->属性 配置类型里面的下拉菜单选择静态库