Java实验三报告

一、   实验内容

(一)敏捷开发与XP

内容:1.敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。

2.极限编程(eXtreme Programming,XP)是一种全新而快捷的软件开发方法。

要点: 1. XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。

2. 我们关注其中的编码标准,结对编程,代码集体所有,测试,重构等实践。(如实验二中的TDD)

(二)编码标准

内容:编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少。编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

学习:

1. 软件辅助修改:在eclipse中,用source->Format进行格式规范;

2. 自己命名:包名全部小写,如: io ;类名第一个字母要大写,如:HelloWorldApp;等

(三)结对编程

内容:在结对编程模式下,一对程序员肩并肩、平等地、互补地进行开发工作。其中的角色分配为驾驶员(控制键盘输入),领航人(起到领航、提醒作用)。

(四)版本控制

摘要:版本控制提供项目级的 undo(撤销) 功能;•   版本控制允许多人在同一代码上工作;•  版本控制系统保存了过去所作的修改的历史记录;具体步骤如下——

# 添加修改文件

$ git add 所有修改的文件

# 提交到环境中本地代码仓库

$ git commit -m '本次修改的描述'

# push到git.shiyanlou.com,无需输入密码

$ git push

学习:按照要求指导,逐步在实验楼中完成,截图如下:

git log之后的结果如下:

(五)重构

摘要:重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。学习:尝试Encapsulate Field(封装)功能:

原图:

使用后:

清除代码重复的重构方法:同一class中重复,则提炼重复;互为兄弟的模块内重复,则提炼到父类中;不同的方法做同样的事,则选择更清晰的算法而将另外的算法清除;

以StudentTest为例,图如下:

此外,在重构代码后,还有一个必不可少的步骤即进行新一轮的测试,即产品代码仍要通过之前的所有测试。

(六)实践项目

(同伴20135216刘蔚然的博客:http://www.cnblogs.com/lwr-/)

1.综述

由于我们小组之前没有编写过具有独立功能和可操作图形化界面程序。因而我们采取“先学习,后操作;边操作,边变通”的实验思路。具体方法是:研读要求—学习代码要素—复习TDD内容—构建测试程序—检查测试程序—测试产品代码—修改产品代码—重新检查产品代码—完成实验报告。在这一过程中,我们对各方面内容都进行了详细记录(未在实验楼中进行托管和git)

团队由两名成员组成,详细分工为:

20135216刘蔚然:负责前期学习的整理工作,将java代码进行必要注释,并对TDD内容进行补充;进行后期测试

20135211李行之:负责中期的测试代码开发;进行后期测试

2.研读要求与自我学习(20135211)

1.TDD(Test Driven Development, 测试驱动开发),

TDD的一般步骤如下:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

2. 测试类具体操作:把鼠标放到项目名上,单击右键,在弹出的菜单中选定New->Source Folder新建一个测试目录test;把鼠标放到test目录上,单击右键,在弹出的菜单中选定New->JUnit Test Case新建一个测试用例类

3.实验要求要点为:程序要有GUI界面,参考用户界面和用户体验;记录TDD和重构的过程,测试代码不要少于业务代码

4.补充学习内容

Java语句(具体见程序注释)

JUnit用法:

1)  http://blog.csdn.net/stevenhu_223/article/details/8269157  Java单元测试JUnit

2)  http://www.blogjava.net/qileilove/archive/2013/10/15/405004.html 使用JUnit进行Java相关测试

  1. 设计思路(20135211,20135216)

首先,根据用户需求合理分配代码密度,即:

  1. 用户直接操作(点击运行)的程序为主控程序,仅包含对与用户接触的窗口的定义语句和相关函数调用;
  2. 后台处理图形化界面的语句组成控制程序,包括:对话框算法、蛇和果实(对象)的位置显示和移动算法、对象位置记录、暂停键及停止条件函数等。

其次,对具体程序进行编写:

  1. MainClass函数:继承JFrame类,调用ControlSnake类;定义窗口大小和位置
  2. ControlSnake函数:继承JPanel类;定义贪吃蛇的坐标位置和果实坐标位置,定义随机数发生器等;建立主函数接收键盘传入并转换成keyCode,执行对应操作;建立Paint函数构造窗口;建立Action函数进行动画演示(包括调用随机数发生函数产生伪随机序列,确定果实位置)

最后,对难点进行攻克:

  1. 如何在蛇碰到边界后产生对话框提示用户重新开始?

参阅资料后,决定在Action函数中再加入语句解决此问题,主要思想是在用专门的函数记录是否“碰到边界”(坐标的范围)这一状态,并返回一个Boolean类型变量;根据此变量值来判断是否跳出对话框;若跳出对话框,则要清空之前的记录重新开始

4.进行代码注释(20135216)

MainClass函数

package resource;

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")//注释处的所有警告都忽视

public class MainClass extends JFrame {

ControlSnake control;

Toolkit kit;//所有实际应用的抽象窗口工具包的父类

Dimension dimen;//压缩了有整数精确度的组件

public static void main(String[] args) {

new MainClass("my snake");

}

public MainClass(String s) {

super(s);

control = new ControlSnake();//新的ControlSnake类

control.setFocusable(true);

kit = Toolkit.getDefaultToolkit();

dimen = kit.getScreenSize();//获取屏幕尺寸

add(control);//添加control

setLayout(new BorderLayout());

setLocation(dimen.width / 3, dimen.height / 3);// 挪位置,dimen.width/3,dimen.height/3

setSize(FWIDTH, FHEIGHT);//定格操作窗口大小

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setResizable(false);

setVisible(true);

}

public static final int FWIDTH = 315;

public static final int FHEIGHT = 380;

}

ControlSnake函数

package resource;

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.Timer;

import java.util.Random;

@SuppressWarnings("serial")

public class ControlSnake extends JPanel implements ActionListener {

//JPanel类用于为小内容提供简单窗口,ActionListener为对象提供添加动作的方法

Random rand;

//Random,用48bit的种子产生伪随机序列

ArrayList<Point> list, listBody;

//ArrayList<Point>,类似于二维数组,声明了两个泛型对象

String str, str1;

static boolean key;

int x, y, dx, dy, fx, fy, flag;

int snakeBody;

//控制蛇的长度

int speed;

public ControlSnake()

{

snakeBody = 1;

str = "上下左右方向键控制 P键暂停...";

str1 = "现在的长度为:" + snakeBody;

key = true;

flag = 1;

speed = 700;

rand = new Random();//创造一个新的随机数产生器

list = new ArrayList<Point>();//创造一个初始容量为10的数列

listBody = new ArrayList<Point>();

x = 5;

y = 5;

list.add(new Point(x, y));//在坐标空间中创建并初始化一个新的点

listBody.add(list.get(0));//list.get(0),返回在list列中0位置的元素

dx = 10;

dy = 0;

fx = rand.nextInt(30) * 10 + 5;// rand.nextInt(30),返回一个在0——30内的随机数

fy = rand.nextInt(30) * 10 + 5;// 2

setBackground(Color.WHITE);//为窗口添加背景色

setSize(new Dimension(318, 380));//重新定义窗口的高和宽

final Timer time = new Timer(speed, this);

time.start();

//timer类,在指定时间间隔触发一个或多个 ActionEvent

addKeyListener(new KeyAdapter()

{

//KeyAdapter(),用于接收键盘传来的事件的抽象类

public void keyPressed(KeyEvent e)

{

//KeyEvent,使键盘输入转化成对应对象

if (e.getKeyCode() == 37) {//getKeyCode(),将键盘输入转化成对应的整形键码

dx = -10;

dy = 0;

} else if (e.getKeyCode() == 38) {

dx = 0;

dy = -10;

} else if (e.getKeyCode() == 39) {

dx = 10;

dy = 0;

} else if (e.getKeyCode() == 40) {

dx = 0;

dy = 10;

} else if (e.getKeyCode() == 80) {

if (flag % 2 == 1) {

time.stop();

}

if (flag % 2 == 0) {

time.start();

}

flag++;

}

}

});

}

public void paint(Graphics g) {//Graphics,所有环境算法基础类,允许应用在已有组件上进行绘制

g.setColor(Color.WHITE);

g.fillRect(0, 0, 400, 400);//指定一个以setColor返回值为底色的长方形,具体参数为x,y

g.setColor(Color.DARK_GRAY);

g.drawLine(3, 3, 305, 3);//在点(3,3)和(305,3)之间用当前色填充一条线

g.drawLine(3, 3, 3, 305);

g.drawLine(305, 3, 305, 305);

g.drawLine(3, 305, 305, 305);

g.setColor(Color.PINK);

for (int i = 0; i < listBody.size(); i++) {//listBody.size(),返回当前list的元素个数

g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9);

}//控制蛇的长度

g.fillRect(x, y, 9, 9);//蛇的长度最大为9

g.setColor(Color.ORANGE);

g.fillRect(fx, fy, 9, 9);//随机显示果实

g.setColor(Color.DARK_GRAY);

str1 = "现在的长度为:" + snakeBody;

g.drawString(str, 10, 320);//在图形化界面中显示字符串

g.drawString(str1, 10, 335);

}

public void actionPerformed(ActionEvent e) {

x += dx;

y += dy;

if (makeOut() == false) {//见最后的函数,用于排除超出图形界面的不合法输出

JOptionPane.showMessageDialog(null, "重新开始......");

//跳出对话框,显示“重新开始”

speed = 700;

snakeBody = 1;

x = 5;

y = 5;

list.clear();//清空数列

list.add(new Point(x, y));//加入新元素

listBody.clear();

listBody.add(list.get(0));

dx = 10;

dy = 0;

}

addPoint(x, y);

if (x == fx && y == fy) {//即“蛇吃到果实”

speed = (int) (speed * 0.8);// 速度增加参数

if (speed < 200) {

speed = 100;

}

fx = rand.nextInt(30) * 10 + 5;// 2

fy = rand.nextInt(30) * 10 + 5;// 2

snakeBody++;// 2

} // 2

repaint();//重新进行

}

public void addPoint(int xx, int yy) {

// 动态的记录最新发生的50步以内的移动过的坐标

// 并画出最新的snakeBody

if (list.size() < 100) {// 蛇身长度最长为100

list.add(new Point(xx, yy));

} else {

list.remove(0);

list.add(new Point(xx, yy));

}

if (snakeBody == 1) {

listBody.remove(0);

listBody.add(0, list.get(list.size() - 1));

} else {

listBody.clear();

if (list.size() < snakeBody) {

for (int i = list.size() - 1; i > 0; i--) {

listBody.add(list.get(i));

}

} else {

for (int i = list.size() - 1; listBody.size() < snakeBody; i--) {

listBody.add(list.get(i));

}

}

}

}

public boolean makeOut() {

if ((x < 3 || y < 3) || (x > 305 || y > 305)) {

return false;

}

for (int i = 0; i < listBody.size() - 1; i++) {

for (int j = i + 1; j < listBody.size(); j++) {

if (listBody.get(i).equals(listBody.get(j))) {

return false;

}

}

}

return true;

}

}

4. 代码测试及思路(20135211)

测试思路:

1.当图形超出界面时,应跳出对话框提示用户重新开始

2.当且仅当按下P键(大写锁定)时,程序停止

代码如下

//import java.util.Timer;

import org.junit.Test;

import resource.ControlSnake;

import junit.framework.TestCase;

//import static org.junit.Assert.*;

//import static org.hamcrest.Matcher.*;

public class ControlSnakeTest extends TestCase {

@Test

public void test()

{

//Timer time = new Timer(speed, this);

ControlSnake controlSnake = new ControlSnake();

assertEquals(true, controlSnake.makeOut());//检测makeOut是否返回值正常

//assertEquals(new String(), );

}

}

5. 过程记录(20135211)

1 初始命名有误

 

2 重命名

3 格式不规范

测试类使用

 

6.时间统计

      因为网络问题实验楼上的任务占用了很多不必要的时间,浪费了大量的精力和财务(话费),希望老师能对实验方面的教学进行一定的修改。

  在实践部分,研读调试游戏代码占用了巨大的时间,是本次实验中最耗时也是最有意义的地方。

7.实验感悟

本次实验,尤其是通过对实验内容四,五的学习,让我对Eclipse的使用有了更多的了解,为以后规范代码提供了很大的帮助。

并且本次实践通过观看网上的游戏代码,对我今后的编程有很大的启发,对程序有了更深刻的认识。

实验三:敏捷开发与XP实践的更多相关文章

  1. 20145213《Java程序设计》实验三敏捷开发与XP实践

    20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...

  2. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  3. JAVA课程实验报告 实验三 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  4. 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"

    20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...

  5. 20145215实验三 敏捷开发与XP实践

    20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...

  6. 20145325张梓靖 实验三 "敏捷开发与XP实践"

    20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...

  7. 20162311 实验三 敏捷开发与XP实践 实验报告

    20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...

  8. 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告

    2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

  9. 20175314 实验三 敏捷开发与XP实践

    20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...

  10. #实验三 敏捷开发与XP实践---实验报告

    一.实验三 敏捷开发与XP实践-1 1.实验要求 -实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成I ...

随机推荐

  1. ubuntu下安装eclipse IDE for C/C++ developers

     序 linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大.linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行li ...

  2. Ext4文件系统架构分析(一)

    本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等 ...

  3. C#引用比较和内容比较

    1.静态方法Object.ReferenceEqual,实际实现为引用比较.   2.静态方法Object.Equal, 实际实现为引用比较.(实际调用了实例方法Equal)   3.Object实例 ...

  4. Centos7安装elasticsearch、logstash、kibana、elasticsearch head

    环境:Centos7, jdk1.8 安装logstash 1.下载logstash 地址:https://artifacts.elastic.co/downloads/logstash/logsta ...

  5. Linux 定时清除日志 Log

    一.原因 写这篇的原因是项目中log没有定时清除,服务器上项目是用脚本启动,log文件只会在启动时生成一次,这时,由于项目在不断运行中,导致log越来越大.如果删除log文件,还得把项目停掉在启动,这 ...

  6. 基于Verilog的奇数偶数小数分频器设计

    今天呢,由泡泡鱼工作室发布的微信公共号“硬件为王”(微信号:king_hardware)正式上线啦,关注有惊喜哦.在这个普天同庆的美好日子里,小编脑洞大开,决定写一首诗赞美一下我们背后伟大的团队,虽然 ...

  7. JavaWeb基础—上传与下载

    1.上传(不能使用BaseServlet): 上传的作用,略 上传的要求(对表单和Servlet都有要求): 1.必须使用表单,而不能是超链接,method="post" 文件明显 ...

  8. 【BZOJ1054】[HAOI2008]移动玩具

    [BZOJ1054][HAOI2008]移动玩具 题面 bzoj 洛谷 题解 太\(sb\)了,不想写了,直接点开洛谷题面单击右边蓝色按钮题解即可

  9. CF 1117 E. Decypher the String

    E. Decypher the String 链接 题意: 有一个字符串,一些操作,每次操作交换两个位置的字符,经过这些操作后,会得到新的字符串.给你新的字符串,求原来的串.可以有3次询问,每次询问给 ...

  10. Kubernetes学习之路(六)之创建K8S应用

    一.Deployment的概念 K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通. POD,是K8S中的一个逻辑概念,K8S管理的是POD,一 ...