结对作业
1.
3.
Information Hiding(信息隐藏):指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的,是一种重要的软件开发手段,它与对象的封装(encapsulation)与模块化(modularity)密切相关。
我们在实现的过程中经常发生变量混乱的问题,导致经常会莫名的产生错误,导致我们去查看前面编写的代码,后来就经常运用privite ,需要的话就通过访问函数实现。
private String exe; private Object answer;
Interface Design(接口设计):面向接口编程是软件工程领域常用的设计手段
Loose Coupling(松耦合):允许改变或者当问题发生在“电线的一端时”来避免影响到其他的端点,目标是最小化依赖。
4.
Commandl类:GUI界面;
Calculate类:运行结果以及表达式中符号的转换;
Expression类:产生满足要求的“题目“;
Judge类:将输入数字与正确结果进行比较并记录总共正确的题数;
Change类:替换符号;
Answer类:GUI答题界面的后续模块;
算法的关键对我自己来说就是输入结果和正确结果的各种处理,刚开始由于没处理好,导致realyAnswe传的空值,程序无法正常运行,捣鼓了好久才弄好。至于独到之处,我们原本是想将“*“与”/“换成小学生所熟悉的计算符号,但是没成功,有点可惜。
5.计算模块接口部分的性能改进
通过参数传值,类间调用等实现模块的对接(主要是Commandl类和Expression类)。参考Frofile教程,学习软件用了约三小时,内存消耗如图:分析可知相对稳定。
最初由项目的Commandl.java右键Profile As,进入性能分析,其次打开JVM虚拟机(可以用教程的密码破解Frofile软件)。
然后进入Live memory,最初消耗变化如图:
等待两分钟后,出现红色绿色并存现象:
性能分析排查后,发现代码还有不足,进行优化处理。花费了约一小时,代码优化改进了,并且把占用内存的四则运算GUI小程序关闭,IO输入流关闭,性能如图明显提高。
6.单元测试
7.异常处理
public static boolean scope(int num){ if(num<=0||num>=10001) return false; else{ return true; } }
try { num = Integer.parseInt(args[++i]); } catch (NumberFormatException e) { e.printStackTrace(); return; }
8.
我们在设计的时候就想主要分成三个界面
第一个界面是用来进行对题目数量的要求,包括题目数量,数值范围,有无乘除法以及运算符的个数;
第二个界面是包括生成的题目,我们需要输入的答案,以及计时功能;
第三个界面则是提示我们结果的正确,以及历史所有的总正确数目;
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Command extends JFrame { private static final long serialVersionUID = 1L; // 定义登录界面的组件 JButton jb1, jb2, jb3 = null; JPanel jp1, jp2, jp3, jp4,jp5,jp6= null; JTextField jtf = null; JTextField jpf = null; JTextField jpfM = null; JTextField jtf1 = null; JTextField jpf1= null; JLabel jlb1, jlb2,jlb3, jlb4= null; ButtonGroup bg = null; static int exepresionNum = 0; static int exepresionRangeNum; static int jtfNum = 0; static int jpfNum = 0; static int jpfMNum = 0; static int jtf1Num = 1; static int jpf1Num = 0; public static void main(String[] args) { new Command(); } // 构造函数 public Command() { // 创建组件 jb1 = new JButton("确认"); jb2 = new JButton("刷新"); jb3 = new JButton("退出"); // 设置监听 jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { OK(); } }); jb2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { clear(); } }); jb3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }); jp1 = new JPanel(); jp2 = new JPanel(); jp3 = new JPanel(); jp4 = new JPanel(); jp5 = new JPanel(); jp6 = new JPanel(); jlb1 = new JLabel("生成题目个数:"); jlb2 = new JLabel("题目数值范围:"); jlb3 = new JLabel("操作符个数:"); jlb4 = new JLabel("乘除法 0无1有:"); jtf = new JTextField(10); jpf = new JTextField(4); jpfM = new JTextField(4); jtf1 = new JTextField(10); jpf1 = new JTextField(10); // 加入到JPanel中 jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2);//jpfM是最大值 jp2.add(jpf); jp2.add(jpfM); jp5.add(jlb3); jp5.add(jtf1); jp6.add(jlb4); jp6.add(jpf1); jp4.add(jb1); jp4.add(jb2); jp4.add(jb3); // 加入JFrame中 this.add(jp1); this.add(jp2); this.add(jp5); this.add(jp6); this.add(jp3); this.add(jp4); // 设置布局管理器 jlb1.setFont(new java.awt.Font("Dialog", 0, 20)); jlb2.setFont(new java.awt.Font("Dialog", 0, 20)); jlb3.setFont(new java.awt.Font("Dialog", 0, 20)); jlb4.setFont(new java.awt.Font("Dialog", 0, 20)); jtf.setFont(new Font("宋体", Font.PLAIN, 20)); jpf.setFont(new Font("宋体", Font.PLAIN, 20)); jpfM.setFont(new Font("宋体", Font.PLAIN, 20)); jtf1.setFont(new Font("宋体", Font.PLAIN, 20)); jpf1.setFont(new Font("宋体", Font.PLAIN, 20)); Font f = new Font("华文行楷", Font.BOLD, 20); jb1.setFont(f); jb2.setFont(f); jb3.setFont(f); this.setLayout(new GridLayout(4, 1)); // 给窗口设置标题 this.setTitle("小学生四则运算界面"); // 设置窗体大小 this.setSize(600, 300); // 设置窗体初始位置 this.setLocation(700, 330); // 设置当关闭窗口时,保证JVM也退出 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 显示窗体 this.setVisible(true); this.setResizable(true); } // 清空文本框 public void clear() { jtf.setText(""); jpf.setText(""); jpfM.setText(""); jtf1.setText(""); jpf1.setText(""); }
import javax.swing.*; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.HeadlessException; import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Answer extends JFrame { private static final long serialVersionUID = 1L; private static final String INITIAL_LABEL_TEXT = "00:00:00 000"; // 线程 private CountingThread thread = new CountingThread(); // 开始时间 private long programStart = System.currentTimeMillis(); // 程序暂停 private JLabel label = new JLabel(INITIAL_LABEL_TEXT); JButton button, quit = null; JPanel yh, yh1, yh2 = null; JLabel question = null; static JTextField answer = null; Expression exp;
if (answer.getText().isEmpty()) { JOptionPane.showMessageDialog(null, "请输入答案!", "提示消息", JOptionPane.WARNING_MESSAGE); } else if (jud.judge(this.exp.getAnswer(), answer.getText())) { JOptionPane .showMessageDialog( null, "正确答案为" + this.exp.getAnswer() + ". " + "恭喜你答对了. 耗时" + (System.currentTimeMillis() - programStart) + "ms" + ". " + "本次答对" + Judge.rightnum + ",共答对" + (Integer.parseInt(WriteReader.reader() .trim()) + Judge.rightnum) + "道题"/*+(Integer.parseDouble(Judge.rightnum/Four.jtfNum))*/, "提示消息", JOptionPane.WARNING_MESSAGE); Command.create(); dispose(); } else { JOptionPane .showMessageDialog( null, "正确答案为" + this.exp.getAnswer() + ". " + "很遗憾答错了. 耗时" + (System.currentTimeMillis() - programStart) + "ms" + ". " + "本次答对" + Judge.rightnum + ",共答对" + (Integer.parseInt(WriteReader.reader() .trim()) + Judge.rightnum) + "道题", "提示消息", JOptionPane.WARNING_MESSAGE); Command.create(); dispose(); } }
9.界面模块与计算模块的对接
通过依靠参数传值实现模块的对接(主要是Command类和Expression类)
界面具体介绍:
(1)第一个界面对题目要求的限制
(2)要求信息输入完整(不完整)的界面
(3)题目界面
(4)答案正确(错误)的提示界面
(5)不输答案直接提交的界面
10.描述结对的过程
我们在结对的过程中花了很多时间在代码上,也在分析的阶段确定了各自的需要分工的范围,比如单元测试和性能分析的学习。
11.
遇到问题可以更好更快的解决,而且对一些细节可以进行分工,加快我们的实现进程,但是我们在结对的过程中彼此的想法会产生分歧,这有时也会浪费许多时间来达成共识。
成员优缺点:
卫小琼:代码能力强,能钻研,同学关系好,解决不了的问题能找到人帮忙,但是有时会钻牛角尖;
陈双林:脾气好,能坚持,有上进心,但是编码能力弱。
12.
SP2.1 |
Personal Software Process Stages |
Time : SeniorStudent(min) |
Time : SDE(min) |
Planning |
计划 |
30 |
40 |
Estimate |
估计这个任务需要多少时间,规划大致步骤 |
10 |
10 |
Development |
开发 |
1250 |
2375 |
Analysis |
需求分析 (包括学习新技术) |
300 |
400 |
Design Spec |
生成设计文档 |
20 |
30 |
Design Review |
设计复审 |
10 |
20 |
Coding Standard |
代码规范 |
15 |
20 |
Design |
具体设计 |
30 |
60 |
Coding |
具体编码 |
600 |
1500 |
Code Review |
代码复审 |
30 |
45 |
Test |
测试 |
200 |
300 |
Reporting |
报告 |
490 |
850 |
|
测试报告 |
420 |
780 |
|
计算工作量 |
40 |
40 |
|
事后总结 并提出过程改进计划 |
30 |
30 |