1、软件成品展现前端
- 软件本体下载(包括程序及其更新日志,源码工程包,UML图,API接口文档,算法介绍文档,算式计算excel实例,浅查重程序)
- 计算模块
- 运算式及答案生成
- 批改模块
- 异常报告
-
-
 |
Type:InvalidDataException程序员 运算符数量过大, 容易致使程序在运行计算模块生成答案时内存溢出,所以限定数量上限为10算法 |
 |
Type:InvalidDataException编程 数值上界与运算符数过大,易致使算式产生超long整型范围的分数,致使计算出错,所以限定:后端 Log(数值上界,2)*2*运算符数目 < 64数据结构 |
 |
Type:InvalidOperationExceptionide 括号不匹配,容易引起越界访问问题,实质上对应非法栈操做,所以需检验算式并抛出该异常函数 |
 |
Type:FormatException单元测试 算式格式不正确,没法解析学习 |
 |
Type:DividedByZeroException 算式中不能出现除0操做 |
 |
Type:DividedByZeroException 算式中分数分母不能为0 |
 |
Type:InvalidDataException 算式中分数的分子或分母超过long整型范围 |
 |
Type:InvalidDataException 在生成算式时会进行查重操做,如重复则从新生成。若是5分钟内程序没法生成新算式,则程序断定生成数量达到上界,仅输出生产部分并报出异常,这里只有6个式子: 1+1;1-1;0+1(或1+0);1-0;0-0;0+0 |
 |
Type:FileNotFoundException 执行批改程序时默认读取当前目录下的Exercise.txt和Answer.txt文件(固然用户也能够浏览选择本身的文件,默认编码为Unicode),如文件不存在则会报相应的异常 |
2、结对编程感想及总结
- 合做照片展现:
- 结对编程的感悟
- 两我的一块儿合做编程是很是愉快的事情,固然,若是不用牺牲美好的国庆假期的话。
- 江昊同窗负责作前端,相应的我保证后端功能正确便可,设计整个计算核心大约消耗了整整三天左右,由于前一次我的项目中已经较好的封装了计算核心模块,因此这几天就是不断地加入新的参数控制,并排查错误,增添异常处理等等。期间经过江昊的测试反馈,找到了不少前一次做业中仍有疏漏的bug,可见结对编程仍是颇有效率的,更新好的后端马上就能够拿到另外一我的写好的前端里检验,有了未经处理的异常前端也能及时给出错误报告,不少参数范围不须要在后端代码里进行有效性检查,前端就能够经过输入栏进行限制,能够说是方便了很多。江昊写的前端我用起来也很舒服,若是发现了问题,直接用本身从新封装好的dll替换程序包里的dll就能用上新的。这样一边设计,一边测试,一边更新,颇有真正开发一款软件的感受。两我的协做编程,不只提升了开发效率,也有助于更好地维护程序,使得咱们可以更快速的发现问题并解决问题。不过结对编程同时也要求两我的的工做时间尽量统一,而且须要大量的沟通来确保先后端的准确对接,不只须要后端充分考虑接口调用的简易性,也要求前端写的界面尽量兼容各类不一样的后端类库,可见若是两人的合做时间仅占据各自独立开发一小部分,又不增强沟通的话,结对编程的效率会大大下降,若是把由于沟通问题而把大量时间花在理解对方的代码上,结对编程的做用就再也不那么明显了。
- 江昊同窗的优势在于,针对我对前端提出的要求,可以很快的相应并做出修改,须要增长相应的测试单元也能很快实现,能够说执行力很是之高;此外,善于沟通,出现问题第一时间向我反馈,使得我能够及时做出更新修改,而且在他的帮助下咱们得以和刘乾小组,杨墨犁小组实现先后端交换对接;并且作事也颇有耐心,期间咱们的程序从v0.9.0.0一路更新到v1.1.0.7,大大小小的修改更新也有二十余次了,可以一次又一次不厌其烦的为我后端的更新修改相应前端的说明和测试单元,这一点我很佩服,可以与这样的同窗结对编程我十分荣幸。固然,若是在程序设计上更细致一些,江昊同窗会是很是完美的结对编程伙伴的。
- 个人缺点在于太精益求精了= =。。。本身给本身整一堆没用的功能而后又弄出一堆bug来,而后不停地更新后端让队友帮忙修改前端,说实话我本身都会以为本身有点烦23333333 固然最后的效果还算不错,也算是解脱本身了吧,优势的话,时间多,熬得起,动力足。
3、 Information Hiding, interface design, loose coupling 的应用
- Information Hiding
- 信息隐藏,与面向对象的封装概念较为相似,我做为负责后端的程序员,主要作的就是封装的工做,尽量避免重要信息外泄给调用者,从而引起不可预测的异常,我在本身编写的后端dll文件中,经过如下几种方式体现这一设计方法:
- 1. 除了提供接口的core类外,其它类都用默认的internal修饰符修饰,使得除core类外,其它类都不可实例化,做为dll应用时不可见
- 2. core类的全部属性所有用private修饰,仅能经过接口函数select访问并修改
- 3. 尽可能避免经过返回值或ref修饰的返回参数来向外传值,在内部处理产生的全部信息,向外部提供的信息仅限于抛出异常,设计接口时大部分为void方法
- Interface Design
- 接口设计,接口是用于交互的,因此在设计接口时,主要须要考虑的是,“咱们会接受哪些信息”和“咱们须要反馈哪些信息”,有些接口,好比生成表达式,既不须要接受信息也不须要反馈(固然抛出异常除外),那就设计成不接受任何参数的void函数,我理解的接口设计围绕两个字展开,那就是“抠门”,既不过多向前端请求一些无用的信息,也不向前端反馈一些不便于处理的内容,将信息处理尽量集成到dll内部,全部的参数都设置的恰到好处。固然设计接口最后在了解用户需求的状况下与前端设计者达成协议,这样也有便于本身的设计。C#能够为传入的参数设置默认值,这样传入参数的时候若是少传了也能够正常使用,固然咱们也能够经过重载函数来实现。灵活的接口设计,既要作到信息精简,也要作到普遍兼容。我在最上面的程序包里提供本身的API接口说明,试着写这样一份文档也有助于我更好的帮助本身反思接口设计须要注意的一些地方。
- loose coupling
- 松耦合,松耦合要求最小化依赖,实现可伸缩性、灵活性和容错。这一点不只仅是对于后端,对于前段也有很高的要求。对于后端而言。须要在API接口设计上作到普适,提供各类重载的方法来应对不一样的应用场景,并在内部处理好异常信息,使得使用者调用时或者不出错,或者一旦出错,后端里也为其写好了处理函数,获得的是通过处理的异常信息,有明确的错误定位。对于前端而言,须要作好输入规范,须要考虑从UI得到的各类信息并设计相应的数据结构,以便传递给不一样的后端程序,对于后端抛出的异常须要采用统一的处理方案,并尽量避免本身发生异常,从而保证传入后端的参数是始终有效的。只有作到这一点,后端才能对接更多的前端,前端才能应用于更多的后端。不过松耦合设计的代价会有不少冗余性的工做,若是只是开发私人项目,不须要作太多维护工做的话,松耦合并不是十分必要。
- 在咱们的结对编程项目中,实现了松耦合,咱们的后端与杨墨犁小组的前端,咱们的前端与刘乾小组的后端分别实现了完美的对接,下面是截图:
4、Design By Contract
-
契约式设计,就是把类和他的客户程序之间的关系看作正式的协议,描述双方的权利和义务,被Bertrand Meyer称做构建面向对象软件系统方法的核心。
契约式设计的提出主要基于软件可靠性的考虑,包括正确性与健壮性。正确性指软件按照需求规格执行的能力,健壮性指软件对需求规格中未声明情况的处理能力。健壮性主要与异常处理机制相关。契约即客户按照需求规格使用软件,软件设计者按照需求规格设计软件,需求规格以外的请求形成的软件使用错误责任不禁软件设计者承担。契约式设计是一套机制,在客户称须要提供者之间明确地声明双方的责任与权力,即契约,并可以对这些契约进行验证。
咱们在“小学数学习题助手”软件开发过程当中,对于绝大部分正常请求给予支持,并进行了正确性验证。对于极端状况的数据,好比生成题目数量很是大而生成数值上限与运算符数量很是小的状况,咱们进行了响应的异常报错处理机制,并设计良好的用户交互,通知异常缘由。咱们的软件开发过程实际上是在遵循契约式设计的原则。
契约式设计的原则的优势在于,确保了server与client地位的平等,双方有各自的义务与责任,这样就保证了代码的质量,提升了软件工程的效率与质量。
契约式设计也有缺点,那就是契约式设计须要一种机制来验证契约的成立与否,断言就是最好的选择,但并非全部的程序语言都有断言机制,那么强行使用语言进行模仿就势必形成代码的冗余和不可读性的提升,好比.NET4.0之前就没有assert的概念。
5、 Unit Test
- 经过单元测试,咱们完成了对程序基本功能(计算,表达式生成,批改,读入参数)的检验,并成功捕捉到错误输入时相应的各种异常(见前面展现部分),展现图以下所示:

- PS:UML图和算法核心思想在顶部程序包里,欢迎自取ww