结对项目报告

1.Coding.net项目地址
https://coding.net/u/lirl660/p/coupleproject/git

2.PSP
在这里插入图片描述

3.Information Hiding, Interface Design, Loose Coupling
信息隐藏(Information Hiding)指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
信息隐藏在设计的所有层次上都有很大作用:从用具名常量代替字面常量,到创建数据类型,再到类的设计、子程序的设计以及子系统的设计等等。
在类中,定义的变量和方法可以再前面加上一个下划线"_"来标识,这是一个好的命名规范,可以避免无意中对私有成员进行赋值。类与类之间交换信息时,要交流私有变量时,要用事先设计好的方法来访问,这样如果我们在其它类里面调用另外一个类的私有变量,那么我们必须定义一个获得该类私有变量的方法;要在另一个类里面改变另外一个类里面的变量时,我们也要定义一个改变该类私有变量的方法。在结对项目中,使用命令行模式执行和使用GUI界面执行出题部分时调用同一接口,项目中将代码实现部分隐藏。

接口设计(Interface Design),好的接口能够提供给项目一个良好的框架。在项目设计接口过程中,接口的职责尽量单一;使用有意义的命名方式使接口的功能一目了然,增强了可读性;接口尽量细化,同时接口中的方法尽量少。在接口设计过程中参考六大原则,主要参考以下内容:https://www.cnblogs.com/Jordandan/p/8656273.html

松耦合(Loose Coupling),即模块间的依赖性。松耦合的方法一般是底层函数功能尽量单一,尽量避免修改底层函数。功能相近的函数,可以设计2个以上,不要为了减少代码量,把一个函数的功能设计的太多。

4.计算模块接口的设计与实现过程。
项目分为两个模块,一个是负责数据计算的Core模块,另一模块为计算模块的入口 Command。其中计算模块由newExpSome方法(产生一个只含有加减的运算式)、newExpAll方法(产生一个含有加减乘除的运算式)、divideExactly方法(控制整除)。Command模块包含入口函数,负责接受参数进行调用,Write方法负责写入文件。
各函数的调用:newExpSome方法调用divideExactly方法;newExpAll方法调用divideExactly方法;main方法调用newExpSome方法、newExpAll方法、Write方法。
在设计接口以及实现过程中,尽可能的避免一个函数包含过多功能,尽量减少接口之间的循环依赖性。

5.计算模块接口部分的性能改进
由于出题时对题目的结果和运算过程中的部分结果是有要求的,虽然在出题时不要求给出结果,但还是需要调用计算模块来提供检查功能,每计算一步就对结果进行判断,对不合格的运算式舍弃不用,但是在出现有乘法的时候数字就会成倍变大,导致运算式不可用。对上述问题在出题模块内进行了优化,当出现乘法时,尽量缩小乘数,在一定程度上使结果不会超出限定,加快出题速度。
下面的热点Hot Spots 视图显示了消耗时间最多的方法:
在这里插入图片描述

6.计算模块部分单元测试展示
以测试newExpSome方法为例,下图为测试部分代码。
在这里插入图片描述
测试的思路是:改变运算符个数的上限,由于运算符个数不同产生括号的代码不同,所以增加多种状态能够覆盖更多代码;设置是否有括号和乘除;增加运算次数,覆盖更多的代码,走通一些异常处理代码。
在测试Core类中的函数时,模拟了在实际应用时会出现的情况,最大限度地覆盖更多代码这一目标,由此设计了多组参数。通过多次单元测试,覆盖率达到了97%。
在这里插入图片描述

7.计算模块部分异常处理说明
每个模块中的方法都有相对的异常处理,以下为异常处理说明。
1).出题数量:出题数量范围错误;出题数量输入值不是数字;未输入出题数量。
单元测试样例:

String[] args1 = {“-n”,”-20”}
Command.main(args1);
String[] args2 = {“-n”,”a”}
Command.main(args2);
String[] args3 = {“-b”,”-c”}6 Command.main(args3);

2).运算符上限:上限范围错误;输入值不是数字。
单元测试样例:

String[] args1 = {“-o”,”20”}
Command.main(args1);
String[] args2 = {“-o”,”a”}
Command.main(args2);

3).数值范围:上下界范围错误;上下界输入不是数字;下界大于上界。
单元测试样例:

String[] args1 = {“-m”,”-20”,”2000”}
Command.main(args1);
String[] args2 = {“-m”,”a”,”b”}
Command.main(args2);
String[] args3 = {“-m”,”40”,”20”}
Command.main(args3);

4).输入的参数不是规定的参数格式,如输入“-”、“-x”等作为参数。
单元测试样例:

String[] args1 = {“-x”}2 Command.main(args1);

8.界面模块的详细设计过程
项目分为首页、出题页面、做题页面、错误提示页面。
首页、出题页面使用同种方式生成用户界面,代表首页和出题页面的类集成JFrame类,在这两个勒种分别生命了一个内部类继承JPanel类,在内部类中加载所需要的组件,在外部类的构造方法中新建一个内部类的实例,并将这个内部类的对象加入到外部类的实例中。
以首页为例,部分代码如下:
在这里插入图片描述

9.界面模块与计算模块的对接
项目功能分为两部分,收集参数和计算执行,在UI模块中我主要就是通过GUI组件和相关事件来获取参数,并通过判断参数属性来调用相应的函数,而计算模块的功能是判断接受参数是否合法并进行相关的计算。

10.描述结对的过程
此次结对项目中,两人共同讨论、设计,在开发过程中,一名同学负责项目指导,另一名同学负责编程开发。以下为结对项目成员:
在这里插入图片描述

11.结对编程的优缺点
具体地说,结对编程既有优点同时也存在一些不足。
结对编程有如下的好处:
(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
同样,结对编程时,在面对一些问题时有不同看法,解决不当容易产生分歧,延长开发时间。分歧是不可避免的,只要处理妥当即可。
总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。
在整个结对项目中我们也各自发现了自身的不足,是一次很好的编程体验。组员马豪珍的优点是比较耐心,对于代码细节的处理比较细致,态度也十分积极。组员李瑞琳的优点是对于项目时间控制较好,对于用户需求思考比较全面,思路比较清晰。共同的缺点就是代码能力还是较弱,对于编程的理解欠佳。今后还是应该扎实基本功,勤加练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值