结对作业-四则运算GUI

目录:

一、项目地址
二、PSP
三、接口设计
四、计算模块接口的设计与实现过程
五、计算模块接口部分的性能改进
六、计算模块部分单元测试展示
七、计算模块部分异常处理说明
八、界面模块的详细设计过程
九、界面模块与计算模块的对接
十、结对过程
十一、结对编程思考


一、项目地址

Coding.Net项目地址:https://git.coding.net/chenq971/arithmetic.git

二、PSP

PSP

任务内容

计划时间(min)

完成时间(min)

Planning

计划

30

60

     Estimate

    估计这个任务需要多少时间,并规划大致工作步骤

30

60

Development

开发

1000

3080

    Analysis

    需求分析

60

120

    Design Spec

    生成文档

30

30

    Design Review

    设计复审

30

20

    Coding Standard

    代码规范

10

10

    Design

    具体设计

30

40

    Coding

    具体编码

720

2500

    Code Review

    代码复审

60

210

    Test

    测试

60

150

Reporting

报告

55

100

    Test Report

    测试报告

30

60

    Size Measurement

    计算工作量

10

20

   Postmortem& ProcessImprovement Plan

    事后总结, 并提出过程改进计划

15

20

三、接口设计

1.Information Hiding

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。好的类接口就像是冰山的尖儿一样,让类的大部分内容都不会暴露出来。在本次项目中,我们把描述对象属性的变量及实现对象功能的方法合在一起,尽心封装,保证外界不能任意更改其内部的属性值,也不能任意调动其内部的功能方法。

2.Interface Design

接口作为数据流通的桥梁,起着举足轻重的作用,直接影响着程序的效率性、稳定性、可靠性以及数据的正确性、完整性。因次,设计接口在一个项目中,是非常重要的。不是随便一个功能就要有个接口,也不是随便一个需求就要加个接口。一个接口只负责一个业务功能,包含完整的业务功能。

3.Loose Coupling

耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。所以一个接口要包含完整的业务功能,而不同接口之间的业务关联要尽可能的小,就是说一个接口不应该随着另一个变化而变化或以某几个接口为前提而存在。在本次项目中,我们都尽量减少类与类之间传递的数据量,增强他们的独立性。

四、计算模块接口的设计与实现过程

计算模块分开了有乘除和没有乘除的四则运算式生成方法,并调用一个类使得式子可以整除以及除数在正确的范围内。

五、计算模块接口部分的性能改进

       由于出题时对题目的结果和运算过程中的部分结果是有要求的,所以这次虽然在出题时不要求给出结果,但还是需要调用计算模块来提供检查功能,每计算一步就对结果进行判断,对不合格的运算式舍弃不用,但是在出现有乘法的时候数字就会成倍变大,导致运算式不可用,对于这个问题我在出题模块内进行了优化,当出现乘法时,尽量缩小乘数,在一定程度上使结果不会超出限定,加快出题速度。

我们在第一次性能分析的基础上做了CPU性能分析,以下是以下是访问树 Call Tree:

下面是热点 Hot Spots视图,显示了消耗时间最多的方法:

下面是内存性能分析图(包含改进后的成果):

六、计算模块部分单元测试展示

1.测试Core类(包含newExpSomenewExpAlldivideExactly

    在测试Core类中的函数时,我模拟了在实际应用时会出现的情况,结合更大限度地覆盖更多代码这一目标,我设计了多组参数,期望能覆盖到各种情况。通过多次进行单元测试,将多次单元测试结合起来,达到了97%

设计思路:

(1)改变运算符个数的上限:由于运算符个数不同产生括号的代码不同,所以增加情况个数能够覆盖更多代码。

(2)设置是否有括号和乘除。

(3)增加运算次数:这样在使用随机数的函数中能出现更多的情况,覆盖更多的代码,走通一些异常处理代码。

2.测试Command类(包含mainwrite方法)

设计思路:

(1)测试main方法:

    在main方法中实现了对输入参数的解析和对输入参数异常的报错,所以测试这个部分的函数最主要的就是构造不同的异常情况,同时也不要忘记测试参数正确时的情况,因为这也是代码的一部分(单元测试中第一次就是因此覆盖率较低)。

(2)测试write方法

write方法中主要实现了将传入的ArrayList分行写入文件,所以测试这个部分的思路就是:在测试方法中构造一个ArrayList,向里面传入一些值,然后以它为参数传入到write方法中,通过输出结果判定是否成功执行。

七、计算模块部分异常处理说明

以下为各参数会出现的异常:

       1.出题数量:出题数量范围错误;出题数量输入值不是数字;未输入出题数量。

            单元测试样例:

String[] args1 = {“-n”,”-20”}
Command.main(args1);
String[] args2 = {“-n”,”a”}
Command.main(args2);
String[] args3 = {“-b”,”-c”}
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”}
Command.main(args1);

八、界面模块的详细设计过程

       1、首先设计一个欢迎页面,并询问用户是要出题还是做题,点击相应的按钮进入不同的功能,同时我们还为项目界面设置了背景,更加美观。

JLabel title = new JLabel("欢迎使用四则运算软件,您是要:");
JButton make = new JButton("出题");//出题按钮
JButton ans = new JButton("做题");//做题按钮
JLabel l = new JLabel();
Icon icon = new ImageIcon("3.jpg"); //页面背景
l.setIcon(icon);
add(l);

       2.如果用户点击了出题按钮,就会跳转到出题界面。出题界面仔细询问用户的各个需求,例如题目数量、数值范围、有无括号等等。用户点击提交按钮即可在桌面上生成名为result.txt的四则运算文件。

JLabel num = new JLabel("题目数量(必填)");
JLabel lower = new JLabel("数值范围(下界)");
JLabel upper = new JLabel("数值范围(上界)");
JLabel num_op = new JLabel("最多有几个运算符");
JTextField theNum = new JTextField(10);
JTextField theLower = new JTextField(10);
JTextField theUpper = new JTextField(10);
JTextField theNum_op = new JTextField(10);
JCheckBox mul_de = new JCheckBox("乘除法",false);
JCheckBox bracket = new JCheckBox("括号",false);
JButton ok = new JButton("提交");
JLabel l = new JLabel();//页面背景

       3.如果用户点击了做题按钮,就会跳转到做题界面。这个界面大致又可以分为三块,用户登录、上传文件以及做题。用户可以选择不登录,直接上传文件做题,但是登陆后可以记录他每次的成绩,并且查询最好成绩和最高正确率。

(1)用户登录,包含用户名、密码和登录、退出按钮。同时我还在页面上提示了登录做题与不登录的区别,用户自己选择。

JPanel pa;
JLabel la11;//用户登录标签
JLabel la; // 标题标签
JLabel la1; // 用户名标签
JLabel la2; // 密码标签
JTextField f1; // 用户名输入
JTextField f2; // 密码输入
JLabel la3;// 说明标签
JLabel la4;// 说明标签
JButton login; // 登录按钮
JButton logout;//退出按钮

(2)上传文件,包含上传文件和开始做题按钮,还输出了整个文件的内容

JButton upload;// 上传文件按钮
TextArea doExpre; // 做题文本框
JButton start; // 开始做题按钮

// 上传文件
int reslut = 0;
File file = null;
String path = null;
Component chatFrame = null;
JFileChooser fileChooser = new JFileChooser();

(3)如果没有登录用户,只能一道道做题,最后停止查看本次的正确个数;如果登录了,可以查看做题记录和最好成绩。

JButton stop; // 停止做题按钮
JButton best;// 记录成绩按钮
JButton good;//最好成绩

// 做题
JTextArea question;
JTextArea answer;
TextArea fina; // 最后结果
JLabel la21;
JLabel la22;
JButton next;
    
int[] correctGood;
double[] correctTime;

// 时间
long startTime;
long endTime;

九、界面模块与计算模块的对接

       在界面和计算模块的对接过程中,我主要负责的是做题功能。界面模块获取用户的意愿,然后通过判断参数内容调用不同的方法。上传文件题目后,用户输入答案,调用方法验证是否是正确答案,并把正确个数和做题时间存放在变量里。如果用户登录了,那么做题记录会全部保存到一个TXT文件里,这样用户想要查询时,软件就能找到对应的信息了。

        以下是本项目的功能截图:

1.欢迎界面,选择功能

相当于主函数,按钮分别调用MakeExp类和Count2_1类

2.出题功能

通过按钮调用Core类和InToPost类

2.做题功能

 这个界面没有调用其他的类,调用的方法都在Count2_1类中

十、结对过程

       

这是我和晓真在工作室里一起结对编程的照片。

十一、结对编程思考

       结对编码作为最近流行的编程方式,有不少的优点。第一,结对编码 的方式是两名程序开发人员一个扮演驾驶者的角色,进行代码编写,另一个扮演观察员的角色,对代码进行评测。这就使得代码的正确率大大提高,增强代码的质量。第二, 结对编程会使两个人都会发现自己平时没有注意到的地方,相互讨论,可以更快更有效地解决问题和发现自身的不足,从而提高了双方的编码能力。第三,和团队编程相比,结对编程只有两人,想法交流更加迅速,编写速度更快,编程效率更高。
       然而,在面对一些问题时,双方可能有不同的看法,容易产生分歧,造成不必要的时间内耗。如果两名开发人员的能力相差过大,可能造成想法上沟通不畅发生争执,不利于团队和谐。或者造成代码基本都是由一方完成,而另一方就是享受成果的局面。

       在本次编程中开始由于我们两人从未接触过这种编程方式,所以不熟悉各自的职责,导致了一些小的问题,但是经过一段时间的磨合,我们的配合逐渐合拍了起来,,渐渐也体会到了结对编程的好处,就是编程完成后两个人就都理解了代码,不会像之前一样只理解自己写的代码,同时也省去了将两个人代码整合的步骤;而且在编程过程中对于一些问题两个人可以得出更好的结论,就直接优化了代码,减少了后续的工作量;两个人一起编程也可以相互监督,减少开小差的几率,提高工作效率。


吕晓真:
规划项目进度,思路清晰
代码规范,格式简洁,便于阅读
细心,可以发现程序中隐藏的问题
算法欠佳,有时会导致代码过长

陈琦:
注重细节,善于优化程序的代码
对代码的理解能力强
态度积极,不懒散
耐心欠佳,在解决不了问题时会变得急躁


原文地址:https://www.cnblogs.com/chenq971/p/8759134.html