结对作业:基于GUI实现四则运算
1)Coding.Net项目地址:https://git.coding.net/day_light/GUIszysLL.git
2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。
任务内容 |
计划共完成需要的时间(min) |
|
Planning |
计划 |
25 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10天 |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
90 |
· Design Spec |
· 生成设计文档 |
5 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
4 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
· Design |
· 具体设计 |
10 |
· Coding |
· 具体编码 |
600 |
· Code Review |
· 代码复审 |
35 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
Reporting |
报告 |
9 |
· Test Report |
· 测试报告 |
60 |
· Size Measurement |
· 计算工作量 |
2 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
3)看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。
信息隐藏(Information Hiding)
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。信息隐藏有着独特的启发力,它能够激发出有效的设计方案。信息隐藏同样有助于设计类的公开接口。
我们的信息隐藏设计: 类的所有数据成员都是private,所有访问都是通过访问函数实现的;
接口设计(Interface Design)
接口可以降低耦合性,即可以让某个模块或功能能够重复利用。
我们的设计:可以了解对象的交互界面,而不需了解对象所对应的类。
松耦合(Loose Coupling)
松耦合:即降低功能模块之间的依赖度。
我们的设计: 采用模块化设计,将方法进行封装,每个类之间保持独立,降低耦合度
4)计算模块接口的设计与实现过程。
1.共三个大类,六个函数:分别为命令行测试和GUI界面测试。
2.命令行:Command类中包含主函数,主要负责命令行参数的接受及参数异常处理;同时调用Lib类中的Compute1,Compute2,Compute3,Compute4的四个方法,分别生成加减运算式,加减带括号运算式,加减乘除运算式,加减乘除带括号运算式。
3.GUI界面测试:GUI类中包含主函数,主要负责GUI的界面展示,同时设置监听器,分别调用buttonSubmit和buttonNext两个方法,进行出题和提交答案;同时buttonNext调用Lib类中的Compute1,Compute2,Compute3,Compute4的四个运算方法,生成运算式。
算法关键:通过复选框监听器实现调用四个运算函数
if (c ==0 && b == 0) { String answer = Lib2.compute1(ns, os, m1s, m2s); label.setText(answer); } if (c != 1 && b == 1) { String answer = Lib2.compute2(ns, os, m1s, m2s); label.setText(answer); } if (c == 1 && b != 1) { String answer = Lib2.compute3(ns, os, m1s, m2s); label.setText(answer); } if (c == 1 && b == 1) { String answer = Lib2.compute4(ns, os, m1s, m2s); label.setText(answer); }
5) 计算模块接口部分的性能改进。记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。
F4回收垃圾后,发现红色全部消失,资源全部被回收。证明没有资源泄露。程序性能良好。
6)计算模块部分单元测试展示。展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。只需要测试命令行部分,且该部分覆盖率到90%以上。
单元测试代码:
import static org.junit.Assert.*; import org.junit.Test; public class test { Lib2 lib = new Lib2(); @Test public void test() { lib.compute1(12, 2, 1, 100); lib.compute2(12, 2, 1, 100); lib.compute3(12, 2, 1, 100); lib.compute4(12, 2, 1, 100); } }
7)计算模块部分异常处理说明。在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。
样例1:n为非法字符(字母,符号等,这里以字母为例)。
@Test public void testn1command() { String[] args={"-n","e","-m","1","100"}; Command.main(args); }
样例2:n超出预计范围(n小于1或大于10000,这里以-9为例)。
@Test public void testn2command() { String[] args={"-n","-9","-m","1","100"}; Command.main(args); }
样例3:m1,m2超出预计范围(m1大于m2或者m1小于1大于100或者m2小于50大于1000,这里以m1为-8,m2为40为例)。
@Test public void testm1command() { String[] args={"-n","10","-m","-8","40"}; Command.main(args); }
样例4:m为非法字符(字母,符号等,这里以字母为例)。
@Test public void testm2command() { String[] args={"-n","10","-m","8","e"}; Command.main(args); }
样例5:m,n为空值
@Test public void testmncommand() { String[] args={}; Command.main(args); }
8)界面模块的详细设计过程。在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。
做题界面,设置监听器,当触发“下一题”的按钮事件时,根据用户定制的要求,进行出题。
class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { Lib2 lib2 = new Lib2(); int ns = Integer.parseInt(n.getText()); int os = Integer.parseInt(o.getText()); int m1s = Integer.parseInt(m1.getText()); int m2s = Integer.parseInt(m2.getText()); if (e.getSource() == jbtBeginCompute) { JFrame frame2 = new JFrame(); frame2.setTitle("做题界面"); frame2.setSize(500, 500); frame2.setLocationRelativeTo(null); frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame2.setVisible(true); if (c ==0 && b == 0) { String answer = Lib2.compute1(ns, os, m1s, m2s); label.setText(answer); } if (c != 1 && b == 1) { String answer = Lib2.compute2(ns, os, m1s, m2s); label.setText(answer); } if (c == 1 && b != 1) { String answer = Lib2.compute3(ns, os, m1s, m2s); label.setText(answer); } if (c == 1 && b == 1) { String answer = Lib2.compute4(ns, os, m1s, m2s); label.setText(answer); } panel1.add(label); JPanel panel2 = new JPanel(); panel2.add(new JLabel("请输入答案:")); panel2.add(text); JButton buttonSubmit = new JButton("提交答案"); JButton buttonNext = new JButton("下一题"); JPanel panel3 = new JPanel(); panel3.add(buttonNext); panel3.add(buttonSubmit); frame2.add(panel1, BorderLayout.NORTH); frame2.add(panel2, BorderLayout.CENTER); frame2.add(panel3, BorderLayout.SOUTH); frame2.setSize(500, 500); frame2.setLocationRelativeTo(null); frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame2.setVisible(true); }
核对答案:
buttonNext.addActionListener(new ActionListener() {// 定义时间监听器 public void actionPerformed(ActionEvent e) { System.out.println("下一题"+lib2.result); String question = label.getText(); int count = 0; double sum = Double.parseDouble(text.getText()); if (count < ns) { String ifRight = ""; if (lib2.result == sum) { ifRight = "正确"; rightSum++; count++; } else { ifRight = "错误"; count++; } String message = question + ", " + "你的答案:" + sum + ", " + "正确答案: " + lib2.result + ", 状态: " + ifRight; list.add(message); text.setText(""); if (c ==0 && b == 0) { String answer = Lib2.compute1(ns, os, m1s, m2s); label.setText(answer); } if (c != 1 && b == 1) { String answer = Lib2.compute2(ns, os, m1s, m2s); label.setText(answer); } if (c == 1 && b != 1) { String answer = Lib2.compute3(ns, os, m1s, m2s); label.setText(answer); } if (c == 1 && b == 1) { String answer = Lib2.compute4(ns, os, m1s, m2s); label.setText(answer); } } } });
9)界面模块与计算模块的对接。详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。
界面模块共四个,出题界面选择用户上传或定制出题,选择定制出题时,在“四则运算”界面,选择输入题目数量、运算符个数、数值上下界范围、是否带乘除和括号时,UI模块将参数传到符合定制要求的计算模块中,计算模块将满足用户要求的题目生成,并返回到“做题界面”,用户在做题界面输入答案,首先判断是否为合法参数,若不合适则重新生成,若合适,则调用计算模块中生成的正确答案,与用户输入答案进行判断,生成错题库,当完成做题数量时,中止做题,按下提交答案按钮,跳转到错题库,查看做题情况。
输入“题目数量、运算符个数、数值上下界范围、是否带乘除和括号”后,选择开始做题。
有计算做题时间的功能。
如果选择“上传题目”
将用户上传的题目逐一展示出来,用户可在此界面做题。
答题完毕后,自动审核,展示错题库。
10)描述结对的过程,提供非摆拍的两人在讨论的结对照片。
11)说明结对编程的优点和缺点。
结对编程的优点:
1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
2)两个程序员之间可以相互教对方,进行优劣势的互补。
结对编程的缺点:
1)两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
2)有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
搭档的优缺点:性格好,有耐心,心细,有规划。可以实现互帮互助,一起学习,有时候,会对一个问题很坚持,缺少变通性。
我的优缺点:好沟通,愿意共享,喜欢一起学习,耐性比较差,有时不够细心。
12)PSP
任务内容 |
实际完成需要的时间(min) |
|
Planning |
计划 |
30 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
10天 |
Development |
开发 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
45 |
· Design Spec |
· 生成设计文档 |
8 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
6 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
15 |
· Design |
· 具体设计 |
30 |
· Coding |
· 具体编码 |
500 |
· Code Review |
· 代码复审 |
80 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
Reporting |
报告 |
6 |
· Test Report |
· 测试报告 |
90 |
· Size Measurement |
· 计算工作量 |
8 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
结对作业:基于GUI实现四则运算的更多相关文章
- 结对作业--基于GUI的四则运算生成器
组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址 :https://coding.net/u/zhang1995/p/wo ...
- 结对作业-基于GUI的四则运算
一.需求分析 1.题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web ...
- 结对实验---基于GUI的四则运算
详细代码:https://git.coding.net/wangluo24/NO.2.git 结对伙伴:吕志哲(201421123021) &本人.许明涛 201421123024 一.题目要 ...
- 基于GUI的四则运算
基于GUI的四则运算 李志强 201421123028 连永刚 201421123014 林方言 201421123023 coding 地址 https://git.coding.net/lizhi ...
- 结队编程--基于GUI的四则运算
coding地址 https://git.coding.net/lizhiqiang0x01/GUI-sizeyunsuan.git 李志强 201421123028 连永刚 201421123014 ...
- 结对作业(1)----基于GUI的四则运算
小伙伴:201421123031 余洋 201421123044 潘志坚 题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是W ...
- 结队编程-基于gui的四则运算生成器
成员:卢少锐 201421123027.刘存201421033023 coding.net地址 1.需求分析:除了实现四则运算的功能外,还添加了计时器功能和语言选择功能 2.程序设计:这次作业是基于上 ...
- 结对编程1 (四则运算基于GUI)
https://git.coding.net/Luo_yujie/sizeyunsuan.app.git 201421123034 201421123032 1. 需求分析 这次作业新引用了语言选择, ...
- 结对作业1----基于GUI的四则运算生成器
组员:201421123015 陈麟凤 201421123019 张志杰 201421123020 黄海鸿 coding 地址:代码点这里 需求分析: 1.除了整数的四则运算还要支持分数的四则运算: ...
随机推荐
- HDFS上传数据的流程
1.当客户端输入一条指令:hdfs dfs -put text.txt /text时,这条命令会给到DistributeFileSystem. 2.通过DistributeFileSystem简称DF ...
- 快速安装Docker
Docker需要操作系统的内核3.0以上,如低于3.0,需先升级内核,才能安装docker: 1.查看内核版本号 [root@daojia ~]# uname -r 3.10.0-693.el7.x8 ...
- 开发自己的DataSet查看器
记得在vs2002不是2003上没有DataSet调试器,断点时查看DataSet内容非常麻烦,最后有人开发了第三方工具解决了此问题. 后续的vs版本内部都自带的此工具可查看DataSet/DataT ...
- Google官方网页载入速度检测工具PageSpeed Insights 使用教程
相信有接触前端开发的大神们都听说过Google官方的PageSpeed Tools,这个网页载入速度检测工具有在线版本也有一个 Chrome 扩展,叫PageSpeed Insights,在此之前,J ...
- 洛咕P4542 [ZJOI2011]营救皮卡丘
套路题? 感觉讲不清,先写建图 把每个点拆成两个,A和B, S->Ai流量=1费用=0,Bi->T流量=1费用=0, Ai->Bj流量=1费用=ij最短路 还有一个特殊的s点,S-& ...
- 为什么java代码中要避免多层深度for循环嵌套
在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...
- bootStrap中Tab页签切换
关于$().tab()一般用来实现标签页和胶囊链接内容片段的切换,或是相关内容的页面导航: <ul class="nav nav-tabs" id="myTab&q ...
- [Selenium]如何通过Selenium实现Ctrl+click,即按住Ctrl的同时进行单击操作
[以下是不负责任的转载……] 在自动化测试的过程中,经常会出现这样的场景: 按住Ctrl的同时,进行单击操作,已达到多选的目的 Actions a = new Actions(driver); a.k ...
- Cisco Packet Tracer中两台电脑通信设置
Cisco Packet Tracer是网络初学者仿真模拟网络环境的必备工具.今天我们来模拟下两台电脑之间的通信. Cisco Packet Tracer版本6.2.0 一.添加设备 1.这里添加一个 ...
- UART、SPI、I2C协议异同点
I2C.SPI.UART都是常见的低速板级通信协议,目前主流的SoC都内置了这些通讯协议的控制器,同样,各种传感器.Touch控制器.指纹模块.蓝牙模块.WIFI模块也都兼容这三种通信方式的一种或几种 ...