目录:

一、项目地址
二、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类(包含newExpSome,newExpAll,divideExactly)

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

设计思路:

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

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

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

2.测试Command类(包含main和write方法)

设计思路:

(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 = ;
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类中

十、结对过程

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

十一、结对编程思考

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

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

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

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


结对作业-四则运算GUI的更多相关文章

  1. 结对作业——四则运算 Part2. 封装与对接相关问题

    结对作业——四则运算 Part2. 封装与对接相关问题 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分Part 2. ...

  2. 结对作业——四则运算 Part3. 对于结对编程的总结与思考

    结对作业——四则运算 Part3. 对于结对编程的总结与思考 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 Part 1. Core代码编写部分 Part ...

  3. Core 第三组 结对作业——四则运算 Part1. Core代码编写

    结对作业——四则运算 Part1. Core代码编写 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 (因为内容较多,分为了三个部分,但作业系统中只能提交一 ...

  4. 结对项目——四则运算GUI项目

    一.项目地址:https://git.coding.net/lvgx/wsz.git 二.PSP: PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min) Plannin ...

  5. 结对作业--基于GUI的四则运算生成器

    组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址 :https://coding.net/u/zhang1995/p/wo ...

  6. 结对作业-基于GUI的四则运算

    一.需求分析 1.题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web ...

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

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

  8. 结对编程四则运算gui

    码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...

  9. 结对编程-四则运算-GUI

     201421123022 王若凡        201421123026  欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...

随机推荐

  1. python 第一课作用

    1.使用while循环输入 1 2 3 4 5 6     8 9 10 x=0while x<10: x=x+1 if x==7: print(' ') continue print(x)#学 ...

  2. 2018下学期C语言学习总结

    怎么说呢,2018年下学期已经过去了,2019年的上学期又来了,在2018年没有达到自己想要的结果,希望2019年可以达到,加油!我希望我以后可以又快又准确的完成C语言的编程,学习好所以关于电脑的基础 ...

  3. Java线程和多线程(十四)——Synchronized关键字解析

    曾经有一个比较有趣的面试问题,那就是,关于使用synchronized关键字,是用在方法上面尾号,还是用在一个代码块上面为好? 答案就是使用锁定代码块为更好.因为这样不会锁定对象.当synchroni ...

  4. tkinter的GUI设计:界面与逻辑分离(三)-- 多页面

    知识点: 使用 tkinter.Frame.tkraise() 函数去提升当前 tkinter.Frame 的 z 轴顺序,使得多个 tkinter.Frame 的可见性得以切换 本文基于:win7 ...

  5. AngularJS中Directive指令系列 - bindToController属性的使用

    默认false.这个属性用来绑定scope的属性直接赋给controller.可以为true或者和scope相同格式的对象. 此外使用此属性,要设置controller的别名,通常通过"co ...

  6. Storm 第三章 Storm编程案例及Stream Grouping详解

    1 功能说明 设计一个topology,来实现对文档里面的单词出现的频率进行统计.整个topology分为三个部分: SentenceSpout:数据源,在已知的英文句子中,随机发送一条句子出去. S ...

  7. idea ssm项目出现日志中文乱码,封装的json中的msg字段中文乱码(但是json封装的bean中的字段不乱码)等其他各种项目下的中文乱码解决方案

    开头划重点!(敲黑板):rebuild和mvn package的循环往复好几次的操作是解决这个问题的最主要的方法! 经过多次试验,发现这样做就可以正常显示中文了 我说为什么有时候乱码,有时候中文正常, ...

  8. SpringBoot日记——日志框架篇

    在项目的开发中,日志是必不可少的一个记录事件的组件,所以也会相应的在项目中实现和构建我们所需要的日志框架. 而市面上常见的日志框架有很多,比如:JCL.SLF4J.Jboss-logging.jUL. ...

  9. mysql 分页查询时,如何正确的获取总数

    1. 普遍方法: 使用 COUNT(*) ,例如: SELECT COUNT(*) as total FROM studentTask WHERE subjectName = '高中数学'; 缺点: ...

  10. MySQL与DevC++的连接问题

    0.引言 MySQL作为当前的一个主流的开源的关系型数据库,受到大家的广泛关注.DevC++也作为一个开源的简单的C++编辑器,有着比VS更简便更快捷的编译.但是目前网上,却很少有对 MySQL连接D ...