实验楼第三次实验
实验三 敏捷开发与XP实践
l 实验内容
- XP基础
- XP核心实践
- 相关工具
l 实验步骤
(一)敏捷开发与XP
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程
软件工程包括下列领域:软件需求分析、软件设计、软件构建、软件测试和软件维护
人们在开发、运营、维护软件的过程中有很多技术、做法、习惯和思想体系,软件工程把这些相关的技术和过程统一到一个体系中,叫“软件开发流程”
软件开发流程的目的是为了提高软件开发、运营、维护的效率,并提高软件的质量、用户满意度、可靠性和软件的可维护性
软件工程=开发流程+工具
软件=程序+软件工程
软件企业=软件+商业模式
常见的开发流程有:
RUP(Rational Unified Process)
RSP(Personal Software Process)
TSP(Team Software Process)
Agile Process
敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法,包括很多模式,其中,极限编程(eXtreme Programming,XP)是一种全新而快捷的软件开发方法
XP软件开发通过XP准则来表达:
XP的法则:快速反馈、假设简单性、递增更改、提倡更改、优质工作。
XP的活动:编码、测试、倾听、设计
(二) 编码标准
编写代码一个重要的认识是“程序大多时候是给人看的”,编程标准使代码更容易阅读和理解,甚至可以保证其中的错误更少
编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性
编码标准中的版式就是一个很好的例子,版式虽然不会影响程序的功能,但会影响可读性
我们常见的是这样的代码:
程序没有最基本的缩进,解决方式Eclipse->source
->Format
/Ctrl+Shift+F
效果如下
代码标准中很重要的一项是如何给包、类、变量、方法等标识符命名,命名规则如下
(三) 结队编程
结对编程是XP中的重要实践,其中有两个角色
(四)版本控制
版本控制都提供了很多好处
例如HelloWorld
:
Code->shiyanlou_cs212->
创建HelloWorld->创建并编辑HelloWorld.java
编译,运行,测试都没问题,提交代码
如图:先用git status
查看一下代码状态,显示有未跟踪的代码,并用git add <file>...
添加,使用git add HelloWorld.*
把要提交的文件的信息添加到索引库中。当我们使用git commit
时,git将依据索引库中的内容来进行文件的提交。实验完成前使用git push
保存文件
可以修改HelloWorld.java
(五)重构
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更
重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全
Eclipse菜单中的refactor体现出重构几乎是现代IDE的标配了
重构的第一项功能就是Rename
,可以给类、包、方法、变量改名字
这个类,类名,方法名和方法的参数名都有问题,没有注释的话是无法理解代码的。可以使用Eclipse中的重构功能来改名。用鼠标单击要改的名字-> Refactor
->Rename...
效果如下
常犯问题是不会封装,该用类的地方都用了结构体。比如要定义一个类Student
:
Refactor
->Encapsulate Field...
上述代码还是有问题的,每次打印学生信息都这么写代码违反了DRY原则,造成代码重复,正常的重构可以使用Eclipse中的Extract Method...
由于Java中所有的类都有个专门的toString方法,我们使用Eclipse中Source
->Generate toString()...
给Student
类产生一个toString
方法并修改main的代码
(六)实践题目
游戏代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class BorderLayoutDemo extends JFrame {
JPanel p=new JPanel();
public int sum=0;
public BorderLayoutDemo(){
p.setLayout(new GridLayout(3,3,3,3)); //设置按钮(3行,3列,间隔3,间隔3)
//使用循环添加按钮,注意每次添加的按钮对象名称都是b
final int trapLocation=(int)((Math.random()*9)+1);
for(int i=1;i<10;i++){
final int checkTrap=i;
final JButton b=new JButton("Unknown");
p.add(b); //将按钮添加到面板中
//按钮产生效果
b.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
if(checkTrap==trapLocation){
b.setText("Trap!");
EndGame(sum);
}
else{
int randomNum=0;
randomNum=(int)((Math.random()*10)+1);
b.setText(String.valueOf(randomNum));
sum=sum+randomNum;
}
}//ActionPerformed
}//ActionListener
);
}//结束for循环
getContentPane().add("Center",p); //将面板添加到中间位置
}
public void EndGame(int sum){
Component tip = null;
JOptionPane.showMessageDialog(tip, "A Trap Caugh! Your Score: "+sum);
//添加sum到文件
FileReader();
HighScores(sum);
Object[] options = {"Quit","Play Again"};
int response=JOptionPane.showOptionDialog ( null, "Quit or Play Again","Game Over",JOptionPane.YES_OPTION ,JOptionPane.PLAIN_MESSAGE,null, options, options[0] ) ;
if(response==0){
System.exit(0);
}else if(response==1){
this.dispose();
BorderLayoutDemo ls=new BorderLayoutDemo();
ls.setTitle("Treasure Hunter");
ls.setSize(400,400);
ls.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ls.setLocationRelativeTo(null);
ls.setVisible(true);
}
}
public void FileReader(){
try {
String content = "This is the content to write into file";
File file = new File("highScores.txt");
// if file doesn't exists, then create it
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
System.out.println("Done");
} catch (IOException e) {
e.printStackTrace();
}
}
public String FileSave(String filePath){
File file = new File(filePath);
StringBuffer sb = null;
if(file.exists()){
try {
FileReader fr = new FileReader(file.getAbsoluteFile());
BufferedReader br = new BufferedReader(fr);
sb = new StringBuffer();
String str =null;
while((str=br.readLine())!=null){
sb.append(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();//框架写好了~
}
public void HighScores(int sum){
ArrayList scores=new ArrayList();
scores.add(sum);
Collections.sort(scores);
Component highScore = null;
JOptionPane.showMessageDialog(highScore, "High Scores: "+scores.toString());
}
public static void main(String args[]) {
boolean playAgain=false;
JOptionPane.setDefaultLocale(Locale.ENGLISH);
JOptionPane.showMessageDialog(null, "Welcom to Treasure Hunter game! \nThe objective is to dig up as much treasure as possible before being caught in a trap. \nSimply click on a square to uncover it.", "Treasure Hunter",JOptionPane.INFORMATION_MESSAGE);
BorderLayoutDemo f = new BorderLayoutDemo();
f.setTitle("Treasure Hunter");
f.setSize(400,400); //让窗体大小
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null); //让窗体居中显示
}
}
结队编程
结对对象博客网址:http://www.cnblogs.com/cdcode/
实验楼git库:http://git.shiyanlou.com/cd88882
步骤 |
耗时 |
百分比 |
需求分析 |
20min |
20% |
设计 |
50min |
50% |
代码实现 |
10min |
10% |
测试 |
5min |
5% |
分析总结 |
10min |
10% |