C#【结对编程作业】小学数学习题助手

时间:2022-08-29 20:57:15

一、软件成品展示


  • 软件本体下载(包括程序及其更新日志,源码工程包,UML图,API接口文档,算法介绍文档,算式计算excel实例,浅查重程序)
  • 计算模块
    • C#【结对编程作业】小学数学习题助手
  • 运算式及答案生成
    • C#【结对编程作业】小学数学习题助手  
  • 批改模块
    • C#【结对编程作业】小学数学习题助手
  • 异常报告
      • C#【结对编程作业】小学数学习题助手

        Type:InvalidDataException

        运算符数量过大, 容易导致程序在运行计算模块生成答案时内存溢出,因此限定数量上限为10

        C#【结对编程作业】小学数学习题助手

        Type:InvalidDataException

        数值上界与运算符数过大,易导致算式产生超long整型范围的分数,导致计算出错,因此限定:

        Log(数值上界,2)*2*运算符数目 < 64

        C#【结对编程作业】小学数学习题助手

        Type:InvalidOperationException

        括号不匹配,容易引发越界访问问题,实质上对应非法栈操作,因此需检验算式并抛出该异常

        C#【结对编程作业】小学数学习题助手

        Type:FormatException

        算式格式不正确,无法解析

        C#【结对编程作业】小学数学习题助手

        Type:DividedByZeroException

        算式中不能出现除0操作

        C#【结对编程作业】小学数学习题助手

        Type:DividedByZeroException

        算式中分数分母不能为0

        C#【结对编程作业】小学数学习题助手

        Type:InvalidDataException

        算式中分数的分子或分母超过long整型范围

        C#【结对编程作业】小学数学习题助手

        Type:InvalidDataException

        在生成算式时会进行查重操作,如重复则重新生成。如果5分钟内程序无法生成新算式,则程序判定生成数量达到上界,仅输出生产部分并报出异常,这里只有6个式子:

        1+1;1-1;0+1(或1+0);1-0;0-0;0+0

        C#【结对编程作业】小学数学习题助手

        Type:FileNotFoundException

        执行批改程序时默认读取当前目录下的Exercise.txt和Answer.txt文件(当然用户也可以浏览选择自己的文件,默认编码为Unicode),如文件不存在则会报相应的异常

二、结对编程感想及总结


  • 合作照片展示:
    • C#【结对编程作业】小学数学习题助手
  • 结对编程的感悟
    •   两个人一起合作编程是非常愉快的事情,当然,如果不用牺牲美好的国庆假期的话。
    •   江昊同学负责做前端,相应的我保证后端功能正确即可,设计整个计算核心大约消耗了整整三天左右,因为前一次个人项目中已经较好的封装了计算核心模块,所以这几天就是不断地加入新的参数控制,并排查错误,增添异常处理等等。期间通过江昊的测试反馈,找到了很多前一次作业中仍有疏漏的bug,可见结对编程还是很有效率的,更新好的后端立刻就可以拿到另一个人写好的前端里检验,有了未经处理的异常前端也能及时给出错误报告,很多参数范围不需要在后端代码里进行有效性检查,前端就可以通过输入栏进行限制,可以说是方便了不少。江昊写的前端我用起来也很舒服,如果发现了问题,直接用自己重新封装好的dll替换程序包里的dll就能用上新的。这样一边设计,一边测试,一边更新,很有真正开发一款软件的感觉。两个人协作编程,不仅提高了开发效率,也有助于更好地维护程序,使得我们能够更快速的发现问题并解决问题。不过结对编程同时也要求两个人的工作时间尽可能统一,并且需要大量的沟通来确保前后端的准确对接,不仅需要后端充分考虑接口调用的简易性,也要求前端写的界面尽可能兼容各种不同的后端类库,可见如果两人的合作时间仅占据各自独立开发一小部分,又不加强沟通的话,结对编程的效率会大大降低,如果把因为沟通问题而把大量时间花在理解对方的代码上,结对编程的作用就不再那么明显了。
    •   江昊同学的优点在于,针对我对前端提出的要求,能够很快的相应并作出修改,需要增加相应的测试单元也能很快实现,可以说执行力非常之高;此外,善于沟通,出现问题第一时间向我反馈,使得我可以及时作出更新修改,并且在他的帮助下我们得以和刘乾小组,杨墨犁小组实现前后端交换对接;而且做事也很有耐心,期间我们的程序从v0.9.0.0一路更新到v1.1.0.7,大大小小的修改更新也有二十余次了,能够一次又一次不厌其烦的为我后端的更新修改相应前端的说明和测试单元,这一点我很佩服,能够与这样的同学结对编程我十分荣幸。当然,如果在程序设计上更细致一些,江昊同学会是非常完美的结对编程伙伴的。
    •   我的缺点在于太精益求精了= =。。。自己给自己整一堆没用的功能然后又弄出一堆bug来,然后不停地更新后端让队友帮忙修改前端,说实话我自己都会觉得自己有点烦23333333 当然最后的效果还算不错,也算是解脱自己了吧,优点的话,时间多,熬得起,动力足。

三、 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获得的各种信息并设计相应的数据结构,以便传递给不同的后端程序,对于后端抛出的异常需要采用统一的处理方案,并尽可能避免自己发生异常,从而保证传入后端的参数是始终有效的。只有做到这一点,后端才能对接更多的前端,前端才能应用于更多的后端。不过松耦合设计的代价会有很多冗余性的工作,如果只是开发私人项目,不需要做太多维护工作的话,松耦合并非十分必要。
    •   在我们的结对编程项目中,实现了松耦合,我们的后端与杨墨犁小组的前端,我们的前端与刘乾小组的后端分别实现了完美的对接,下面是截图:
      •   与杨墨犁小组的前端对接:
      • C#【结对编程作业】小学数学习题助手
      •   
      •   与乾麻小组的后端对接:
      • C#【结对编程作业】小学数学习题助手
      • C#【结对编程作业】小学数学习题助手
      • C#【结对编程作业】小学数学习题助手

四、Design By Contract


  • 契约式设计,就是把类和他的客户程序之间的关系看做正式的协议,描述双方的权利和义务,被Bertrand Meyer称作构建面向对象软件系统方法的核心。

    契约式设计的提出主要基于软件可靠性的考虑,包括正确性与健壮性。正确性指软件按照需求规格执行的能力,健壮性指软件对需求规格中未声明状况的处理能力。健壮性主要与异常处理机制相关。契约即客户按照需求规格使用软件,软件设计者按照需求规格设计软件,需求规格之外的请求造成的软件使用错误责任不由软件设计者承担。契约式设计是一套机制,在客户称需要提供者之间明确地声明双方的责任与权力,即契约,并能够对这些契约进行验证。

    我们在“小学数学习题助手”软件开发过程中,对于绝大部分正常请求给予支持,并进行了正确性验证。对于极端情况的数据,比如生成题目数量非常大而生成数值上限与运算符数量非常小的情况,我们进行了响应的异常报错处理机制,并设计良好的用户交互,通知异常原因。我们的软件开发过程其实是在遵循契约式设计的原则。

    契约式设计的原则的优点在于,确保了server与client地位的平等,双方有各自的义务与责任,这样就保证了代码的质量,提高了软件工程的效率与质量。

    契约式设计也有缺点,那就是契约式设计需要一种机制来验证契约的成立与否,断言就是最好的选择,但并不是所有的程序语言都有断言机制,那么强行使用语言进行模仿就势必造成代码的冗余和不可读性的提高,比如.NET4.0以前就没有assert的概念。

五、 Unit Test


  • 通过单元测试,我们完成了对程序基本功能(计算,表达式生成,批改,读入参数)的检验,并成功捕捉到错误输入时相应的各类异常(见前面展示部分),展示图如下所示:
  • C#【结对编程作业】小学数学习题助手
  • PS:UML图和算法核心思想在顶部程序包里,欢迎自取ww

C#【结对编程作业】小学数学习题助手的更多相关文章

  1. 11061160&lowbar;11061151&lowbar;Pair Project&colon; Elevator Scheduler软件工程结对编程作业总结

    软件工程结对编程作业总结 11061160  顾泽鹏 11061151  庞梦劼 一.关于结对编程 这次的软工任务既不是单打独斗的个人任务,也不是集思广益的团队项目,而是人数为两人的结对编程.两个人合 ...

  2. UI-12组结对编程作业总结

    UI-12组结对编程作业总结 源码Github地址 https://github.com/tilmto/TILMTO/tree/master/Arithmetic 作业摘要 本次结对编程作业分为以下两 ...

  3. 【BUAA软工】结对编程作业

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程结对编程项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 完 ...

  4. 结对编程作业——四则运算GUI程序

    毛忠庆 201421122088 赵嘉楠 201421122065 源代码存放位置:https://gitee.com/ouwen0819/SiZeYunSuan.git 题目描述 使用 -n 参数控 ...

  5. 结对编程作业(python实现)

    一.Github项目地址:https://github.com/asswecanfat/git_place/tree/master/oper_make 二.PSP2.1表格: PSP2.1 Perso ...

  6. 关于软件工程结对编程作业 PairProject &colon; Elevator Scheduler(电梯调度算法的实现与测试)的总结

    1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...

  7. ASE code search -- 第二次结对编程作业

    baseline 复现 baseline模型 我们再这次实验中选择了deep code search方法作为了解并复现.下面介绍一下这两种方法 deep code search 模型的结构在论文中已经 ...

  8. 结对编程作业(java实现)

    项目成员:罗海屏.郑晓婷 一 .Github项目地址:https://github.com/ting9500/GNIT_Second 二.PSP表格 PSP2.1 Personal Software ...

  9. 结对编程作业&lpar;java&rpar;

    结对对象:许峰铭 一.Github项目地址:https://github.com/Leungdc/Leungdc/tree/master/%E5%9B%9B%E5%88%99%E8%BF%90%E7% ...

随机推荐

  1. Catenyms

    poj2337:http://poj.org/problem?id=2337 题意:给定一些单词,如果一个单词的尾字母与另一个的首字母相同则可以连接.问是否可以每个单词用一次,将所有单词连接,可以则输 ...

  2. 购物车Demo&comma;前端使用AngularJS&comma;后端使用ASP&period;NET Web API&lpar;1&rpar;--后端

    原文:购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(1)--后端 chsakell分享了前端使用AngularJS,后端使用ASP.NET Web API的购物车 ...

  3. 在C&num;中interface与abstract class的区别

    1)在继承抽象类时,必须覆盖该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值,这一点与接口相同. 2)当父类已有实际功能的方法时,该方 ...

  4. &lbrack;HNOI2002&rsqb;营业额统计&lowbar;Treap

    [HNOI2002]营业额统计 题目大意:给你一串n数序列,对于每一个刚输入的数a,找到一个前面的数k,使得|a-k|最小. 注释:$n<=32767,ai<=10^6$. 想法:刚学Tr ...

  5. Transform介绍(Unity3D开发之二)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=491 可能unity中接触较早的 ...

  6. JavaScript进阶&lpar;六&rpar;用JavaScript读取和保存文件

    用JavaScript读取和保存文件 因为Google还不提供同步插件数据的功能,所以导入和导出插件配置就必须和文件打交道了.而出于安全原因,只有IE才提供访问文件的API:但随着HTML 5的到来, ...

  7. JavaScript Node节点笔记

    1. 节点及其类型: 1). 元素节点 2). 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 3). 文本节点: 是元素节点的子节点, 其内容为文本. 2. 在 html 文档的什么位置编 ...

  8. 【微服务】&period;netCore eShopOnContainers 部署实践《二》

    Docker 专业术语介绍 优点:轻量级.可伸缩(灵活性).可靠性.可移植  Container image A package with all of the dependencies and in ...

  9. Hadoop&colon; the definitive guide 第三版 拾遗 第四章

    第四章中提到了通过CompressionCodec对streams进行压缩和解压缩,并提供了示例程序: 输入:标准输入流 输出:压缩后的标准输出流 // cc StreamCompressor A p ...

  10. 【Python】用Python打开csv和xml文件

    一.csv文件的读取1 #coding=utf-8 import csv with open("F:\\script\\py_scripts\\test2.csv","r ...