zoukankan      html  css  js  c++  java
  • 2015结对项目

    结对项目

    作业截止日期:2015年10月6日 

    我们在第一个作业中,用各种语言实现了一个命令行的四则运算小程序。我们看看如果要把我们的小程序升级为能稳定运行,解决用户问题的软件,应该怎么做。

    大家写了不少四则运算的练习,这些代码都各有特色,大家写的 “软件” 也有一定的用处。如果我们要把这个功能放到不同的环境中去(例如,命令行,Windows 图形界面程序,网页程序,手机App),就会碰到困难,因为目前代码的普遍问题是代码都散落在main ( )函数或者其他子函数中,我们很难把这些功能完整地剥离出来,作为一个独立的模块满足不同的需求。

    我们看到,不同的代码解决不同层面的问题,有些是内部数据的计算 (例如四则运算);有些是和用户输入相关的 (例如 scanf,cin,图形界面的输入字段),有些是和数据的展现相关的(例如 printf ,cout,println,DrawText),有些是和程序所在平台的架构相关的(例如 main 函数,并不是所有的程序都需要某个特定格式的main)。这就需要我们对软件的架构做一些整理和优化。

    建议大家把四则运算的计算功能包装在一个模块中(这个模块可以是一个类 Class, 一个DLL,等等), 为了方便起见,我们叫它 “计算核心”Core 模块, 这个模块至少在两个地方可以使用:

    1. 测试程序,这个可以是一个命令行的程序,或者是JUnit 的框架,或者是Visual Studio 单元测试的框架。这样,我们在算法层级保证了这个模块的正确性。
    2. 实际的软件,这是交付给最终用户的软件,有一定的界面和必要的辅助功能。

    那么这个Core模块和使用它的其他模块之间是什么关系呢?它们要通过一定的API (Application Programming Interface) 来和其他模块交流。这个API 接口应该怎么设计呢?(这是一个给有一定经验和实力的同学的题目),为了简单,我们可以从下面的最简单的接口开始:

                Calc ( )

    这个Calc 函数接受字符串的输入(字符串里就是算术表达式,例如 “5+3.5”,“7/8 - 3/8 ”,“3 + 90 * (-0.3)”等等),这个模块的返回值是一个字符串,例如,前面几个例子的结果就是(“17.5”,“1/2”,“-24”)。

      

    假设我们用的是类,我们的测试程序刚开始可以是非常简单的测试例子:(用伪代码表示)

                String  result  = Core.Calc(“1 + 1”) ;

                Assert ( result == “2”);  //我们断言 1 + 1 的结果一定是 2.

    然后同学们实现自己Core 的这个功能。

    Core的功能与个人项目的要求基本一致,为了让大家理解更清楚,我把必须实现的基本功能列出来:

    1. 生成的题目不能重复(个人项目的要求)
    2. 四则运算在个人项目要求的基础上再支持负数,例如-1,-1/2,-3‘4/5等。

    需要支持的基本设定参数:

    1. 题目的数量(个人项目的要求)
    2. 数值的范围(个人项目的要求)
    3. 题目中最多几个运算符
    4. 题目中或运算过程中有无有分数(比如进行整数除法的时候不能除尽)
    5. 题目中是否有乘除法
    6. 题目中是否有括号
    7. 题目中或运算过程中有无负数

     当然,你也可以在此基础上支持更多的功能和设定。

    第一阶段目标 - 能把计算的功能封装起来,通过测试程序和API 接口测试其简单的加法功能。

    加法成功之后,然后我们再做减法,乘法,除法,我们假设目前为止都是两个操作数的运算,还是很容易实现的。由于同学们已经在自己以前的程序中实现了各种算法,这时候只要把实现的算法搬过来就好了。大家可以不断增加测试的数量,在每实现一个新的功能的时候,要保证以前运行正确的例子继续是正确的,通过这样的 “回归测试”,  来保证自己实现的函数一直是正确的。(请看书中关于单元测试,回归测试的内容)

    第二阶段目标 - 通过测试程序和API 接口测试其简单的加减乘除功能。并能看到代码覆盖率。

    多个运算符的运算,带负数的运算。

    如果我们考虑这些情况的话,我们这个模块有一些参数要设置,例如,最多几个运算符,数据范围是多少,还要设置计算的精度(留几位小数,等等),这是由什么API 来决定呢?我们可以扩展 Calc ( ) 的定义,让它接受一个新的参数“precision”,或者我们可以启用一个新的函数 Setting ( )。

    如果我想表示:

    • 最多4个运算符。
    • 数值范围是-1000到1000。
    • 精度是小数点后两位。

    怎么通过API 告诉我们的模块呢?我们当然可以用函数的参数直接传递,但是参数的组合很多,怎么定义好参数的规范呢?建议大家考虑用XML来传递这些参数。

    增加了新的Setting ( )函数之后,我们要让Core模块支持这样的参数,同时,还要保证原来的各个测试用例继续正确地工作

    第三阶段目标 - 通过测试程序和API 接口测试对于各种参数的支持。并能看到代码覆盖率。

    这个时候,如果输入是有错误的,例如 “1 ++ 2”, 在数值范围是 -1000 .. 1000 的时候,传进去“10000 + 32768”,或者是“248 / 0” 怎么办?怎么告诉函数的调用者“你错了”?把返回的字符串定义为“-1” 来表示? 那么如果真的计算结果是“-1”又怎么处理呢?

    建议这个时候,我们要定义各种异常(Exception),让Core在碰到各种异常情况的时候,能告诉调用者——你错了!当然,这个时候,我们同样要进行下面的增量修改:

    • 定义要增加什么功能 - 例如:支持 “运算式子格式错误” 异常
    • 写好测试用例,传进去一个错误的式子,期望能捕获这个 异常。 如果没有,那测试就报错。
    • 在 Core 模块中实现这个功能
    • 测试这个功能
    • 同时测试所有以前的功能,保证以前的功能还能继续工作 (没有 regression)
    • 确认功能完成,继续下一个功能

    [附加题]第四阶段目标 - 界面模块,测试模块和核心模块的松耦合。

    既然各组同学都写了高质量的各个模块,而且模块之间的关系是明确定义的,一致的,那么,小组A 的测试模块就可以测试小组B 的核心模块;小组C 的用户界面模块就可以和小组B 的核心模块结合起来,正常运行。对吧?!那我们就让两个小组(A,B)在一起,测试一下下面的情况:

    • A 的核心模块,加上B 的测试模块和用户界面模块
    • B 的核心模块,加上A 的测试模块和用户界面模块

    两组同学分析合并之后出现了什么问题,为何会出现这样的问题?如何改进?并且改进各种模块中的bug。

    [附加题]第五阶段目标 - 通过增量修改的方式,改进程序,完成对各种错误情况的处理。

    选择两组程序中高质量的模块,增加必要的功能,把所有代码签入源代码管理服务器,同时,把这个软件发布出来。

    博客作业要求:

    我再强调一点,写博客是每人写一个博客,有一部分的内容是可以共享的,但是对于结对编程的体会和感想是不一样的,希望看到不同队友对于结对编程的不同角度的感受。

    作业

    博客要求 (写1个博客,附加题的解法写另一个博客)

    博客注明结对编程人员的名字/或学号后3位.

    看教科书和其它参考书, 网站中关于结对编程的章节。例如:

    http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

    照至少一张照片, 展现两人在一起合作编程的情况。

    说明结对编程的优点和缺点。

    结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)。

    看教科书和其它资料中关于 Information Hiding, interface design, loose coupling 的章节

    说明怎样利用这些好的设计方法。

    看 Design by Contract, Code Contract 的内容:

    http://en.wikipedia.org/wiki/Design_by_contract

    http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

    描述这些做法的优缺点, 说明你是如何把它们融入你的作业中的。

    看教科书中,网上有关 unit test 的内容

    http://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html

    通过截屏显示你是如何用VS 的unit test 来保证你写的类的质量的。显示unit test 对你的写的类(class) 的覆盖率

    阅读有关 UML 的内容

    画出UML 图显示各个实体之间的关系 (画一个图即可)

    实现你的算法

    说明你的算法的关键 (不必列出源代码), 以及独到之处。

    把你的代码签入TFS (问老师要权限及小组的路径)

  • 相关阅读:
    2、容器初探
    3、二叉树:先序,中序,后序循环遍历详解
    Hebbian Learning Rule
    论文笔记 Weakly-Supervised Spatial Context Networks
    在Caffe添加Python layer详细步骤
    论文笔记 Learning to Compare Image Patches via Convolutional Neural Networks
    Deconvolution 反卷积理解
    论文笔记 Feature Pyramid Networks for Object Detection
    Caffe2 初识
    论文笔记 Densely Connected Convolutional Networks
  • 原文地址:https://www.cnblogs.com/jiel/p/4830912.html
Copyright © 2011-2022 走看看