• 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 (问老师要权限及小组的路径)

  • 相关阅读:
    回车代码兼容火狐浏览器
    js区分浏览器类型
    阶段总结(2014-07-23)
    Spring学习笔记 2014-7-9
    Maven学习笔记
    QQ协议的研究
    模仿微信打飞机做的程序
    滚动字幕
    13年8月15日阿里云服务器网络故障事件
    [转]程序员自己写的神器 MonoDevelop 4 (Xamarin Studio) Debugging for Unity
  • 原文地址:https://www.cnblogs.com/jiel/p/4830912.html
Copyright © 2020-2023  润新知