做业截止日期:2015年10月6日 html
咱们在第一个做业中,用各类语言实现了一个命令行的四则运算小程序。咱们看看若是要把咱们的小程序升级为能稳定运行,解决用户问题的软件,应该怎么作。算法
你们写了很多四则运算的练习,这些代码都各有特点,你们写的 “软件” 也有必定的用处。若是咱们要把这个功能放到不一样的环境中去(例如,命令行,Windows 图形界面程序,网页程序,手机App),就会碰到困难,由于目前代码的广泛问题是代码都散落在main ( )函数或者其余子函数中,咱们很难把这些功能完整地剥离出来,做为一个独立的模块知足不一样的需求。编程
咱们看到,不一样的代码解决不一样层面的问题,有些是内部数据的计算 (例如四则运算);有些是和用户输入相关的 (例如 scanf,cin,图形界面的输入字段),有些是和数据的展示相关的(例如 printf ,cout,println,DrawText),有些是和程序所在平台的架构相关的(例如 main 函数,并非全部的程序都须要某个特定格式的main)。这就须要咱们对软件的架构作一些整理和优化。小程序
建议你们把四则运算的计算功能包装在一个模块中(这个模块能够是一个类 Class, 一个DLL,等等), 为了方便起见,咱们叫它 “计算核心”Core 模块, 这个模块至少在两个地方可使用:服务器
那么这个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的功能与我的项目的要求基本一致,为了让你们理解更清楚,我把必须实现的基本功能列出来:
须要支持的基本设定参数:
固然,你也能够在此基础上支持更多的功能和设定。
第一阶段目标 - 能把计算的功能封装起来,经过测试程序和API 接口测试其简单的加法功能。
加法成功以后,而后咱们再作减法,乘法,除法,咱们假设目前为止都是两个操做数的运算,仍是很容易实现的。因为同窗们已经在本身之前的程序中实现了各类算法,这时候只要把实现的算法搬过来就行了。你们能够不断增长测试的数量,在每实现一个新的功能的时候,要保证之前运行正确的例子继续是正确的,经过这样的 “回归测试”, 来保证本身实现的函数一直是正确的。(请看书中关于单元测试,回归测试的内容)
第二阶段目标 - 经过测试程序和API 接口测试其简单的加减乘除功能。并能看到代码覆盖率。
多个运算符的运算,带负数的运算。
若是咱们考虑这些状况的话,咱们这个模块有一些参数要设置,例如,最多几个运算符,数据范围是多少,还要设置计算的精度(留几位小数,等等),这是由什么API 来决定呢?咱们能够扩展 Calc ( ) 的定义,让它接受一个新的参数“precision”,或者咱们能够启用一个新的函数 Setting ( )。
若是我想表示:
怎么经过API 告诉咱们的模块呢?咱们固然能够用函数的参数直接传递,可是参数的组合不少,怎么定义好参数的规范呢?建议你们考虑用XML来传递这些参数。
增长了新的Setting ( )函数以后,咱们要让Core模块支持这样的参数,同时,还要保证原来的各个测试用例继续正确地工做。
第三阶段目标 - 经过测试程序和API 接口测试对于各类参数的支持。并能看到代码覆盖率。
这个时候,若是输入是有错误的,例如 “1 ++ 2”, 在数值范围是 -1000 .. 1000 的时候,传进去“10000 + 32768”,或者是“248 / 0” 怎么办?怎么告诉函数的调用者“你错了”?把返回的字符串定义为“-1” 来表示? 那么若是真的计算结果是“-1”又怎么处理呢?
建议这个时候,咱们要定义各类异常(Exception),让Core在碰到各类异常状况的时候,能告诉调用者——你错了!固然,这个时候,咱们一样要进行下面的增量修改:
[附加题]第四阶段目标 - 界面模块,测试模块和核心模块的松耦合。
既然各组同窗都写了高质量的各个模块,并且模块之间的关系是明肯定义的,一致的,那么,小组A 的测试模块就能够测试小组B 的核心模块;小组C 的用户界面模块就能够和小组B 的核心模块结合起来,正常运行。对吧?!那咱们就让两个小组(A,B)在一块儿,测试一下下面的状况:
两组同窗分析合并以后出现了什么问题,为什么会出现这样的问题?如何改进?而且改进各类模块中的bug。
[附加题]第五阶段目标 - 经过增量修改的方式,改进程序,完成对各类错误状况的处理。
选择两组程序中高质量的模块,增长必要的功能,把全部代码签入源代码管理服务器,同时,把这个软件发布出来。
博客做业要求:
我再强调一点,写博客是每人写一个博客,有一部分的内容是能够共享的,可是对于结对编程的体会和感想是不同的,但愿看到不一样队友对于结对编程的不一样角度的感觉。
做业 |
博客要求 (写1个博客,附加题的解法写另外一个博客) 博客注明结对编程人员的名字/或学号后3位. |
|
看教科书和其它参考书, 网站中关于结对编程的章节。例如: |
照至少一张照片, 展示两人在一块儿合做编程的状况。 说明结对编程的优势和缺点。 结对的每个人的优势和缺点在哪里 (要列出至少三个优势和一个缺点)。 |
|
看教科书和其它资料中关于 Information Hiding, interface design, loose coupling 的章节
|
说明怎样利用这些好的设计方法。 |
|
看 Design by Contract, Code Contract 的内容: |
描述这些作法的优缺点, 说明你是如何把它们融入你的做业中的。 |
|
看教科书中,网上有关 unit test 的内容 http://www.cnblogs.com/xinz/archive/2011/11/20/2255830.html
|
经过截屏显示你是如何用VS 的unit test 来保证你写的类的质量的。显示unit test 对你的写的类(class) 的覆盖率 |
|
阅读有关 UML 的内容 |
画出UML 图显示各个实体之间的关系 (画一个图便可) |
|
实现你的算法 |
说明你的算法的关键 (没必要列出源代码), 以及独到之处。
把你的代码签入TFS (问老师要权限及小组的路径) |