项目地址:https://git.coding.net/liuseshz/Pairwork1.git
由于我们两人小组技术的限制,此次作业选择了基于GUI的四则运算程序项目。
结对成员:2016012051 裴颖(http://www.cnblogs.com/Cathelina/) 2016012026 管凌波
附计划PSP:
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) |
Planning | 计划 | 30 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 30 |
Development | 开发 | 800 |
· Analysis | · 需求分析 (包括学习新技术) | 20 |
· Design Spec | · 生成设计文档 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 |
· Design | · 具体设计 | 20 |
· Coding | · 具体编码 | 640 |
· Code Review | · 代码复审 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 |
Reporting | 报告 | 30 |
· Test Report | · 测试报告 | 10 |
· Size Measurement |
· 计算工作量 | 10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 | 10 |
Information Hiding,信息隐藏。信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。类与类之间用接口访问也是一种信息隐藏。我们设计了一些类与类之间的接口,隐藏了类中的信息。在设定范围时定义了常量。
Interface Design, 接口设计。此次编程用到了接口。
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
Loose Coupling,松耦合。接口设计本身就实现了松耦合的作用,降低了模块之间的耦合度,彼此之间依赖性低,不会互相影响。
一、计算模块接口的设计与实现过程:
Main类负责接收定制数据,Jisuan1,Jisuan2,Jisuan3是计算模块,MainFrame类为题目显示与判断,提交,结算界面。
我们使用了按钮监听器、复选框监听器以及文件监听器。
下面是计时器的代码。
now.setHours(0); now.setMinutes(0); now.setSeconds(0); final Timer timer = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { Date now2 = new Date(now.getTime() + 1000); now = now2; SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); lbl.setText(formatter.format(now)); } }); timer.start();
二.计算模块接口部分的性能改进:记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。
在改进计算模块时,我们按运算符数不同分成不同的类,这样做实际上是出于我们能力的考虑,在计算时也不会像把所有种类运算结合在一起时那样容易出错了。
三、计算模块部分单元测试展示:
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。只需要测试命令行部分,且该部分覆盖率到90%以上,否则单元测试部分视作无效。(6')
四、计算模块部分异常处理说明:
在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
1.对输入出题数、运算符个数、范围等进行,判断其是否合法
if (jtf == false) { System.out.println("请输入题目数量"); } else if (jtf == false) { System.out.println("输入的参数中必须包含对题目数值上下界的设定,请重新输入"); }
2.
try { BufferedReader br = new BufferedReader(new FileReader(file)); try { while((line = br.readLine()) != null){ String[] num = +++line.split("#"); zheng1=Integer.parseInt(num[1]); cuo1=Integer.parseInt(num[3]); }} catch (IOException ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); } } catch (FileNotFoundException ex) { keep(); }
3.
try { if (fop != null) { fop.close(); } } catch (IOException e) { e.printStackTrace(); }
五、界面模块的详细设计过程:
所有界面包含语言转换选择。
1.生成主页面定制出题数,运算符数要求
2.点击开始按钮,跳转到做题界面
3.做题界面随机产生要求题目,并计时
4.用户填写答案后按提交按钮,跳转到结算界面,显示答案正误与所用时间。
六、界面模块与计算模块的对接:详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。
如图所示,用监视器实现界面模块与计算模式的对接。当点击提交按钮时,监视器捕捉动作,连接计算模块,对提交结果进行判断,反馈到结算界面。
七、讨论现场:
八、结对编程感想:
对于同一个项目,结对编程比个人编程绝对轻松许多。有了分工,从工作量方面可以说没那么重了,烦躁的时候有人在旁心情也会舒缓许多,此为优点之一。
我们学习时总有各自的侧重点,结对编程也是个互补的过程,此为优点之二。
从对方的身上可以学到生活和学习上的一些优点,新了解不同的方法与技术,此为优点之三。
那么谈一下缺点吧。感触很深的是,由于我们两个人都只会一点前端的知识,做一个完整的项目是有一定难度的。除我们之外,我相信还有一些组会面对技术知识重合度高,对别的知识面不够了解的情况,这个问题使分工和测试校对都很艰难。
队员优缺点:
裴颖
①优点:思想活跃、性格比较活泼、乐观
②缺点:做事容易拖延
我
①优点:比较有耐心,沉稳
②缺点:代码能力弱,积极性不高
最后做出来的东西有一些功能没有实现,我们会在之后进行完善补充。总而言之,此次结对编程让我学到了一些东西,希望之后的合作我们都能更上一层楼吧!
附实际PSP:
PSP2.1 | 任务内容 | 实际完成需要的时间(min) |
Planning | 计划 | 20 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 20 |
Development | 开发 | 1500 |
· Analysis | · 需求分析 (包括学习新技术) | 20 |
· Design Spec | · 生成设计文档 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 |
· Design | · 具体设计 | 40 |
· Coding | · 具体编码 | 1100 |
· Code Review | · 代码复审 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 240 |
Reporting | 报告 | 31 |
· Test Report | · 测试报告 | 8 |
· Size Measurement |
· 计算工作量 | 8 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 | 15 |