zoukankan      html  css  js  c++  java
  • 软工结对项目作业

    项目 内容
    这个作业属于哪个课程 班级博客
    这个作业的要求在哪里 作业要求
    教学班级 006
    项目地址 https://github.com/yorkyer/PairProgramming.git

    PSP

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

    Information Hiding,Interface Design,Loose Coupling

    • Information Hiding:

    信息隐藏,就是把信息封装起来,让class把复杂的、敏感的、一旦被外界捕获可能会引起不良后果的内容封装在自身内部,防止外部随意调用其内部信息(public除外)。

    结对编程中,把函数和数据成员都封装在类里,达到信息隐藏的目的。

    • Interface Design:

    接口设计,我们俩人负责不同的模块内部的设计,然后预留外部接口,从而可以并行编程,提高开发速度。

    • Loose Coupling:

    松耦合。不同模块之间的耦合程度低,一般是通过接口来实现的。当然,接口也应该适度使用,过多的接口会适得其反。

    计算模块接口的设计与实现过程

    如下UML图,共有6各类.其中四个类表示几何对象.一个类是其基类.这些代表几何对象的类统一暴露出Intersect接口。核心函数是基类中的三个静态函数用于计算直线与直线、直线与圆、圆与圆的交点。然后在子类中利用这三个函数,外加判断交点是否在射线或线段上的条件,实现任意几何对象之间的交点计算。

    之所以将辅助类也放入计算模块,是因为解析字符串、计算所有交点等一些函数ConsoleApp、UPWApp都会用到,故设计了一个静态类来进行代码复用。

    UML类图

    img

    计算模块接口部分的性能改进

    img

    Design by Contract,Code Contract

    契约式设计:希望程序员能够在设计程序时明确地规定一个模块单元(具体到面向对象,就是一个类的实例)在调用某个操作前后应当属于何种状态。它包含三个概念:前置条件,后置条件和不变式。

    • 优点:调用者必须提供正确的参数,被调用者必须保证正确的结果和调用者要求的不变性,因此保证了双方代码的质量,是保证软件质量(可靠性)的手段。

    • 缺点:对于程序语言有一定的要求,契约式编程需要一种机制来验证契约的成立与否。而断言显然是最好的选择,但是并不是所有的程序语言都支持断言。那么强行使用契约式设计就会造成代码的冗余和不可读性的提高。

    计算模块部分单元测试展示

    • 部分单元测试代码

    直线和直线相交

     	[Test]
            public void TestIntersectWithStraightLine()
            {
                List<double> result = test.Intersect(straightLine);
                List<double> answer = new List<double> { -1, 0 };
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    

    直线和射线相交

    	[Test]
            public void TestIntersectWithRayLine()
            {
                List<double> result = test.Intersect(rayLine2);
                List<double> answer = new List<double> { -1, 0 };
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    

    直线和线段相交

    	[Test]
            public void TestIntersectWithLineSegmentNoIntersection()
            {
                List<double> result = test.Intersect(lineSegment);
                List<double> answer = new List<double>();
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    

    直线和圆相交

    	[Test]
            public void TestIntersectWithCircle()
            {
                List<double> result = test.Intersect(circle);
                List<double> answer = new List<double> { 0, 0 };
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    

    圆和直线相交

      	[Test]
            public void TestIntersectWithStraightLine()
            {
                List<double> result = test.Intersect(straightLine);
                List<double> answer = new List<double> { 2, 0 };
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    

    圆和圆相切、相离、相交

     	[Test]
            public void TestIntersectWithCircle1()
            {
                List<double> result = test.Intersect(circle1);
                List<double> answer = new List<double> { 2, 0 };
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    
    
            [Test]
            public void TestIntersectWithCircle2()
            {
                List<double> result = test.Intersect(circle2);
                List<double> answer = new List<double>();
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer));
            }
    
            [Test]
            public void TestIntersectWithCircle3()
            {
                List<double> result = test.Intersect(circle3);
                List<double> answer1 = new List<double> { 1, Math.Sqrt(3), 1, -1 * Math.Sqrt(3) };
                List<double> answer2 = new List<double> { 1, -1 * Math.Sqrt(3), 1, Math.Sqrt(3) };
                Assert.IsTrue(Enumerable.SequenceEqual(result, answer1) |
                    Enumerable.SequenceEqual(result, answer2));
            }
    
    • 测试覆盖率94%

    img

    计算模块部分异常处理说明

    异常 样例 场景
    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 用户输入的直线、线段、射线对象部分重合使得交点无数个
     	[Test]	
    	public void TestTypeException()
            {
                Assert.Throws<TypeException>(() => Helper.ParseLine("Q 1 2 3 4"));
            }
    
    
            [Test]
            public void TestCoordinateRangeException()
            {
                Assert.Throws<CoordinateRangeException>(() => Helper.ParseLine("L 100000 3 2 1"));
            }
    
    
            [Test]
            public void TestRadiusIllegalException()
            {
                Assert.Throws<RadiusIllegalException>(() => Helper.ParseLine("C 2 3 -3"));
            }
    
    
            [Test]
            public void TestPointCoincidentException()
            {
                Assert.Throws<PointCoincidentException>(() => Helper.ParseLine("R 1 2 1 2"));
            }
    
            [Test]
            public void TestIntersectionsInfiniteException()
            {
                Assert.Throws<IntersectionInfiniteException>(() => {
                    List<double> l1 = new List<double> { 0, 0, 0, 1 };
                    List<double> l2 = new List<double> { 0, -1, 0, -2 };
                    SimpleObject.LineLineIntersect(l1, l2);
                });
            }
    

    UI的详细设计过程

    以下xaml文件定义了UI的主要界面.
    img

    1. 打开文件

      点击 OpenFile 按钮,触发 AppBarButton_Click_OpenFile 函数,该函数会打开win10的文件管理器。当用户选择文件后,将文件内容描绘出来。
      img

    img

    img

    1. 计算交点

      点击 ReFresh 按钮,会触发 AppbarButton_Click_ReFresh 函数,该函数计算交点个数并显示,同时绘制交点。
      img

    2. 添加对象

      点击 Add 按钮,会触发AppBarButton_Click_Add 函数,该函数提示对话框让用户需要添加的集合对象。若用户输入不合法,则进行提示。之后点击 ReFresh 按钮计算新的交点。
      )
      img

    img

    img

    1. 删除对象

      鼠标双击需要删除的对象,会触发 Object_DoubleTapped 函数,该函数删除该对象。之后点击 ReFresh 按钮计算会绘制。
      img

    img

    UI 的完善方向:

    • 实现画布的缩放与拖动
    • 绘制坐标轴
    • 优化交互流程
    • 优化错误提示

    界面模块与计算模块的对接

    界面模块的设计采用了 MVC 的思想,分离 UI 代码和 Model 代码。对于UI部分,仅仅是交互逻辑,而把描绘、计算的任务放在了 Model 里。

    在界面模块里,存储 SimpleObject 的列表,然后通过调用 Helper 里的函数来完成数据解析和计算。

    如图,点击ReFresh会触发core模块里的Intersect函数

    img

    结对的过程

    结对编程的优点和缺点

    • 优点

      结对编程能提供更好的设计质量和代码质量

      结对工作可以给开发人员带来更多的信心

      结对能更有效的交流、相互学习和传递经验从而共同进步

      在编码过程中更容易发现隐藏的bug

    • 缺点

      与合不来的人一起编程容易发生争执,不利于团队和谐。

      开发人员可能会在工作时交谈一些与工作无关的事,分散注意力,造成效率低下。

    结对对象的优点和缺点

    结对伙伴
    优点 高效负责;编程能力优秀;细致严谨 学习热情高;编程能力优秀;认真负责;有效沟通
    缺点 沟通不够主动 测试不够细致

    Code Quality Analysis

  • 相关阅读:
    中科燕园GIS外包--移动GIS
    创建二维数组
    DSP开发中遇到的问题
    Unity 2D游戏开发教程之精灵的死亡和重生
    Unity 2D游戏开发教程之摄像头追踪功能
    Unity 2D游戏开发教程之2D游戏的运行效果
    Unity 2D游戏开发教程之使用脚本实现游戏逻辑
    Kail Linux渗透测试教程之免杀Payload生成工具Veil
    Kail Linux渗透测试教程之在Metasploit中扫描
    Kail Linux渗透测试教程之网络扫描和嗅探工具Nmap
  • 原文地址:https://www.cnblogs.com/wanzf-bky/p/12560334.html
Copyright © 2011-2022 走看看