结对项目成员 : 王春阳 191 黄雨萌 186
一. 结对编程
1.编程优缺点
优点: (1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强
(2)在开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在企业管理层次,结对能更有效地交流,相互学习和传递经验,分享知识,能更好地应对人员流动。
综上,结对编程可以取得更高的投入产出比。
缺点:重点是需要前期的磨合,这不仅就占用时间,而且如果两人相处的不够融洽,关系紧张,相互敷衍,这不仅会使效率变得低下,也不会产生高质量的代码。
2.成员优缺点
黄雨萌
优点: 1. 对待事情认真负责,积极担当
2. 做事效率高,与自己形成鲜明对比
3. 待人真诚礼貌
缺点:与成员的主动沟通较少
王春阳
优点:1. 做事认真
2. 逻辑严密
3. 能够主动与成员沟通协商
缺点: 1. 做事效率低,不能做到完全专注
2. 工程能力较差,无法做到对代码的整体把握
二.设计方法
1. Informaion hiding : 信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。即保证封装代码模块的”私有性“。该原则可主要用于以下3个方面:
1) 多层设计中的层与层之间加入接口层;
2) 所有类与类之间都通过接口类访问;
3 )类的所有数据成员都是private,所有访问都是通过访问函数实现的;
2. interface design : 接口的设计是为了统一某种标准。按操作行为来定义接口,其他类要进行该类操作时只需调用该接口即可,而不须关心如何实现。
我们在编程中要进行行为抽象,将不同类的相同行为都集成为一个接口,这样使用更方便,有效率
3. Loose coupling:松耦合的原则要求供应者和用户之间任意一方发生了问题都不能影响到另一方。在编写代码时,要注意降低模块(类)之间的依赖性,当一个模块(类)作出修改时,与之相关的模块(类)不必做过多修改且功能能够正常运行。通过提供API来供外部调用,类与类之间建立接口类来实现相互的调用,从而降低类与类之间的依赖性。
我们在开发时,要注意将定义好类的功能,减少功能重叠现象,同时也尽量避免功能过于集中某些类。让每个类都有较高的独立性,互相配合完成最终的操作。
三. Design by Contract&&Code Contract
二者即为契约式编程。由前置条件,后置条件,不变式组成,它明确的规定了在调用某个操作前后应当属于何种状态,所谓契约就是在代码实现之前,将契约建立好,并且保证实现的代码一定是满足三个条件的。如果满足契约则认为程序满足正确性,若否则程序是不正确的。
优点:1. 契约的存在,使得使用者必须要规范自己的调用行为,而开发者必须要处理契约中涉及的相关条件。即契约关系的双方是平等的,对整个bussiness的顺利进行负有共同责任。
2. 对于使用者而言,提高了代码的可复用性,在考虑是否可以使用某一函数时,只需考察其契约是否满足需求,而不需要考虑其内部的具体实现。
3. 对于开发者而言,提高了代码间的可替换性,对于不同的函数实现,只要保证其契约含义相同,则在调用时可以相互替换。
缺点:契约关系经常是相互的,权利和义务之间往往是互相捆绑在一起的。因为是双方共同承担责任,若一方违规而没有及时告知对方,会造成巨大损失。
本次作业中用户界面与计算内核的耦合,只是接口之间的交互。内核规定了接口的输入规范,用户界面的相应输入则要遵从该规范,否则会抛出异常。
四. 单元测试
除去无法测试的主类Main入口,而UI的Form1为partial类,里面方法也为Private,也无法进行测试,这导致整体代码覆盖率较低。 但除去主类之外,内核模块中的各个类均达到了90%以上。
单元测试:
代码覆盖率:
五. UML图
六. 算法
1. 生成算法的关键就是就是根据参数要求预先编码出计算序列,从而可以快速生成有规律的计算式。
总体思想是以个人项目为基础。因为操作数有限制范围,于是可以根据给定的range与num_title来进行计算,得出一个大致的”间隔gap“,即循环时操作数的递减值,该值保证小于range。首先以range-gap为初始值,对应运算符全排列生成一遍,继而以gap为递减值继续循环,直到生成题目数量达到要求。此外再加以函数判断,若遇到产生不符合参数设置的式子,则重新生成。
匹配算法则以前缀表达式与后缀表达式的转换再加以自定义的分数数据结构的相关操作来实现计算,从而达到匹配的目的。
2. 独到之处:主要在生成算法上。预先编码计算序列,尽量在一开始就避免产生与参数不符的计算式。从而相对于随机算法而言,会减少大量无效计算式的产生,让算法的性能提高。