项目 | 内容 |
---|---|
这个作业属于哪个课程 | 班级博客 |
这个作业的要求在哪里 | 作业要求 |
我在这个课程的目标是 | 熟悉敏捷开发,提升多人协作技能 |
这个作业在哪个具体方面帮助我实现目标 | 获得结对开发的经验,熟悉GUI开发 |
教学班级 | 005 |
项目地址 | https://github.com/yorkyer/PairProgramming.git |
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
- Estimate | - 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | ||
- Analysis | - 需求分析(包括学习新技术) | 200 | 300 |
- Design Spec | - 生成设计文档 | 60 | 100 |
- Design Review | - 设计复审(和同事审核设计文档) | 40 | 60 |
- Coding Standard | - 代码规范(为目前的开发制定合适的规范) | 10 | 5 |
- Design | - 具体设计 | 100 | 50 |
- Coding | - 具体编码 | 200 | 300 |
- Code Review | - 代码复审 | 60 | 40 |
- Test | - 测试(自我测试,修改代码,提交修改) | 200 | |
Reporting | 报告 | ||
- Test Report | - 测试报告 | 30 | 50 |
- Size Measurement | - 计算工作量 | 10 | 20 |
- Postmortem & Process Improvement Plan | - 事后总结,并提出过程改进计划 | 30 | 60 |
合计 | 850 | 1205 |
注:学习新技能的过程是不连续的。
Information Hiding, Interface Design, Loose Coupling
对于信息隐藏,主要是将类属性设置为私有, 若外界需要使用,则设置get,set方法。对于我写的c#,如图:
对于UI部分,使用MVC原则,隔离UI部分代码与数据逻辑部分代码,如图:
对于接口设计,得益于面向对象的反射能力,设计统一接口:SimpleObject Intersect(SimpleObject obj)
,这个接口对于所有的几何对象都适用,如图:
对于松耦合,由于自己将解析字符串并构造几何对象、计算几何对象间交点的功能封装进了Helper
类,对于命令行程序或窗口程序,只需与IntersectLib.Helper
的Compute
, Parse
, ParseLine
函数交互,最大限度的降低了耦合能力。下图分别为命令行程序与GUI程序调用类库的场景。
计算模块接口的设计与实现过程
如下UML图,共有6各类.其中四个类表示几何对象.一个类是其基类.这些代表几何对象的类统一暴露出Intersect
接口。核心函数是基类中的三个静态函数用于计算直线与直线、直线与圆、圆与圆的交点。然后在子类中利用这三个函数,外加判断交点是否在射线或线段上的条件,实现任意几何对象之间的交点计算。
之所以将辅助类也放入计算模块,是因为解析字符串、计算所有交点等一些函数ConsoleApp、UPWApp都会用到,故设计了一个静态类来进行代码复用。
UML
计算模块接口部分的性能改进
Design by Contract,Code Contract
契约编程通过(内建的或附加的)语言特性强制程序的前置条件 、后置条件以及不变式得到保证。优点是软件正确性进一步提高,缺点是增加了软件开发负责性。本次作业中几乎没有涉及。
计算模块部分单元测试展示
构造思路:对每一个类的每一个方法进行测试,包括各种正确情况和异常情况。
计算模块部分异常处理说明
异常 | 样例 | 场景 |
---|---|---|
TypeException | Q 1 2 3 4 | 用户输入不支持的几何类型 |
CoordinateRangeException | L 100000 3 2 1 | 用户输入的坐标超出支持范围 |
RadiusIllegalException | C 2 3 -3 | 用户输入的圆的坐标为负数 |
PointCoincidentException | R 1 2 1 2 | 用户输入的点对重合 |
IntersectionsInfiniteException | L 0 0 0 1 L 0 -1 0 -2 | 用户输入的直线、线段、射线对象部分重合使得交点无数结对过程 |
界面模块的详细设计过程
这次作业我是用UWP写的.
以下xaml
文件定义了UI的主要界面.
-
打开文件
点击
OpenFile
按钮,触发AppBarButton_Click_OpenFile
函数,该函数会打开win10的文件管理器。当用户选择文件后,将文件内容描绘出来。
-
计算交点
点击
ReFresh
按钮,会触发AppbarButton_Click_ReFresh
函数,该函数计算交点个数并显示,同时绘制交点。
-
添加对象
点击
Add
按钮,会触发AppBarButton_Click_Add
函数,该函数提示对话框让用户需要添加的集合对象。若用户输入不合法,则进行提示。之后点击ReFresh
按钮计算新的交点。
)
-
删除对象
鼠标双击需要删除的对象,会触发
Object_DoubleTapped
函数,该函数删除该对象。之后点击ReFresh
按钮计算会绘制。
UI 的完善方向:
- 实现画布的缩放与拖动
- 绘制坐标轴
- 优化交互流程
- 优化错误提示
界面模块与计算模块的对接
界面模块的设计采用了 MVC
的思想,分离 UI 代码和 Model 代码。对于UI部分,仅仅是交互逻辑,而把描绘、计算的任务放在了 Model 里。
在界面模块里,存储 SimpleObject
的列表,然后通过调用 Helper
里的函数来完成数据解析和计算。
结对编程
过程
由于无法面对面沟通,我们便通过社交软件+github的方式进行开发。
结对编程的优点和缺点
- 优点:
- 两人合作能有更强的解决问题的能力。
- 结对能更有效地交流,相互学习和传递经验。
- 结对编程让两个人所写的代码不断地处于“复审”的过程。
- 缺点:
- 编码不再是私人的工作,而是一种公开的“表演”。
- 默契不够导致投入产出比下降。
结对对象的优点和缺点
我 | 结对伙伴 | |
---|---|---|
优点 | 喜欢学习新知识;认真负责;有效沟通 | 高效负责;编程能力优秀;细致严谨 |
缺点 | 测试不够细致;不注重工程性 | 沟通不够主动 |