# 软件工程实验二---结对编程

一、实验目标:

1)体验敏捷开发中的两人合作。
2)进一步提高个人编程技巧与实践

二、实验内容:

1)根据以下问题描述,练习结对编程(pair programming)实践;
2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求;
3)要求在结对编程工作期间,两人的角色至少切换 4 次;
4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。

三、问题描述(二选一)

见第一阶段

四、实验过程

第一阶段

​ 见上一次实验报告

第二阶段

1).代码规范

变量命名规范:使用驼峰式的命名方式,函数和变量以及类名使用简介且容易理解的英文名称
代码书写规范:需要正确的缩进,对于函数需要有简单易懂的注解;排版避免再一个语句里给多个变量赋值等
其他:参考阿里巴巴的Java代码约束

2).程序的总体设计
经过讨论之后确定总体设计分为如下几个模块,以及各个模块的关系如下:

  • 初始化模块
  • 界面模块
  • 程序规则控制模块
  • 刷新模块
    img

3).结对编程过程
经过协商我们决定先写好程序的架构,以及完成初始化模块,界面模块的设计,然后再完成规则控制和刷新模块,并且在此期间参考了网上的文档。
初始化模块和GUI模块
初始化模块主要包括初始化随机数组,界面模块设计主要包括可获取行列,以及刷新频率等,还有显示地图信息。

五、实验结果

​ 运行结果:当程序开始运行时,即开始运行,默认刷新频率为1s,长宽分别为50个格子

image-20200330140844582

image-20200330141145009

改变长宽:

image-20200330141204465

image-20200330141354931

代码如仓库中代码所示:仓库链接

img

代码如下

GUI代码块:

package test.lifeGame;

import test.demo.extendsJPanel;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//对于遇到的覆盖问题,可以使用多个JPanel试试能不能解决,实在不行其他控件只能放菜单栏
public class GUI extends JFrame {
    Thread thread;

    private final gameDemo game;
    private boolean GameStatus = false;

    private JButton jbuttonRun;
    private JLabel jlabelRows;

    private JTextField jtextRows;
    private JLabel jLabelCols;
    private JTextField jtextCols;

    private JLabel jLabelRate;
    private JTextField jtextRate;

    public GUI(){
        game = new gameDemo(50,50);//可用像素:500
        game.setBounds(0,0,450,450);
        thread = new Thread(game);
        thread.start();
        add(game);
    }

    public  void init(){
        setTitle("生命游戏");
        setBounds(200,150,700,540);
        getContentPane().setLayout(null);

        //设置Rate文本
        jLabelRate = new JLabel("Rate:");
        jLabelRate.setBounds(500,100,40,20);
        this.getContentPane().add(jLabelRate);

        jtextRate = new JTextField("1=>1s");
        jtextRate.setBounds(540,100,60,20);
        this.getContentPane().add(jtextRate);

        //设置cols文本
        jLabelCols = new JLabel("Cols:");
        jLabelCols.setBounds(500,200,40,20);
        this.getContentPane().add(jLabelCols);

        jtextCols = new JTextField();
        jtextCols.setBounds(540,200,60,20);
        this.getContentPane().add(jtextCols);

        //设置Rows文本
        jlabelRows = new JLabel();
        jlabelRows.setText("Rows:");
        jlabelRows.setBounds(500,300,40,20);
        this.getContentPane().add(jlabelRows);

        jtextRows = new JTextField();
        jtextRows.setBounds(540,300,60,20);
        this.getContentPane().add(jtextRows);

        //run按钮
        jbuttonRun = new JButton("run");
        jbuttonRun.setBounds(500,400,100,40);
        this.getContentPane().add(jbuttonRun);
        jbuttonRun.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //添加获取输入的代码,以及执行规则的代码,线程的暂停和重启
                if(!GameStatus){
                    GameStatus=true;
                    game.cancle();
                    jbuttonRun.setText("stop");
                }else{
                    String col_st = jtextCols.getText();
                    String row_st = jtextRows.getText();
                    String rate_st = jtextRate.getText();

                    System.out.println("col:"+Integer.parseInt(col_st)+",row:"+Integer.parseInt(row_st)+",rate:"+Float.parseFloat(rate_st));
                    game.Start();
                    game.generationRandom(Integer.parseInt(col_st),Integer.parseInt(row_st));
                    game.setFrequenceRate(Float.parseFloat(rate_st));

                    GameStatus = false;
                    jbuttonRun.setText("run");
                }

            }
        });

    }

    public static void main(String[] args) {
        GUI frame = new GUI();
        frame.init();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

    }

}

总结

经过了两个星期的结对编程实验,基本上掌握了结对编程的基本过程,在结对编程中,最让我感到受益的是在两个人讨论下解决问题的过程,在以往的编程活动中,往往只有自己一个人解决问题,有时即使解决了也感觉自己想的不够全面,但是在结对编程中,两个同时思考如何解决问题,互相讨论,不断完善对这个问题的理解,比仅仅解决这个问题收获更多。