软件工程实验二---结对编程
一、实验目标:
1)体验敏捷开发中的两人合作。
2)进一步提高个人编程技巧与实践
二、实验内容:
1)根据以下问题描述,练习结对编程(pair programming)实践;
2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求;
3)要求在结对编程工作期间,两人的角色至少切换 4 次;
4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。
三、问题描述(二选一)
见第一阶段
四、实验过程
第一阶段
见上一次实验报告
第二阶段
1).代码规范
变量命名规范:使用驼峰式的命名方式,函数和变量以及类名使用简介且容易理解的英文名称
代码书写规范:需要正确的缩进,对于函数需要有简单易懂的注解;排版避免再一个语句里给多个变量赋值等
其他:参考阿里巴巴的Java代码约束
2).程序的总体设计
经过讨论之后确定总体设计分为如下几个模块,以及各个模块的关系如下:
- 初始化模块
- 界面模块
- 程序规则控制模块
- 刷新模块
3).结对编程过程
经过协商我们决定先写好程序的架构,以及完成初始化模块,界面模块的设计,然后再完成规则控制和刷新模块,并且在此期间参考了网上的文档。
初始化模块和GUI模块
初始化模块主要包括初始化随机数组,界面模块设计主要包括可获取行列,以及刷新频率等,还有显示地图信息。
五、实验结果
运行结果:当程序开始运行时,即开始运行,默认刷新频率为1s,长宽分别为50个格子
改变长宽:
代码如仓库中代码所示:仓库链接
代码如下
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);
}
}
总结
经过了两个星期的结对编程实验,基本上掌握了结对编程的基本过程,在结对编程中,最让我感到受益的是在两个人讨论下解决问题的过程,在以往的编程活动中,往往只有自己一个人解决问题,有时即使解决了也感觉自己想的不够全面,但是在结对编程中,两个同时思考如何解决问题,互相讨论,不断完善对这个问题的理解,比仅仅解决这个问题收获更多。