结对作业

Posted 陈双·林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对作业相关的知识,希望对你有一定的参考价值。

1.Coding.Net项目地址https://git.coding.net/Meloody/jieduizuoye.git

2.PSP表格

在末尾。

3.Information Hiding, Interface Design, Loose Coupling

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.异常处理

(一)Java标准裤内建了一些通用的异常,这些类以Throwable为顶层父类:

(二)判断参数范围是否符合题意

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.PSP表格

 

SP2.1

    Personal Software

       Process Stages

            Time 

     SeniorStudentmin

 Time 

SDEmin

           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

  • Test Report

                测试报告

                        420

                   780

  • Size Measurement

              计算工作量

                        40

                     40 

  • Postmortem& ProcessImprovement Plan

                事后总结

       并提出过程改进计划

                         30

30

以上是关于结对作业的主要内容,如果未能解决你的问题,请参考以下文章

结对编程作业

结对编程第一次作业

《结对作业》——软件工程作业

结对-结对编程项目作业名称-结对项目总结

结对作业(软件工程第四次作业)

结对作业