課程:html |
Java程序設計java |
班級:程序員 |
1351編程 |
姓名:小程序 |
秦兆琪設計模式 |
學號:安全 |
20135123工具 |
|||||||||
成績:性能 |
|
指導教師:單元測試 |
婁家鵬 |
實驗日期: |
2015.6.1 |
|||||||||||
實驗密級: |
|
預習程度: |
|
實驗時間: |
3:20~5:00 |
|||||||||||
儀器組次: |
|
必修/選修: |
必修 |
實驗序號: |
實驗三 |
|||||||||||
實驗名稱: |
敏捷開發與XP實踐 |
|||||||||||||||
實驗內容:1. XP基礎2. XP核心實踐3. 相關工具
|
||||||||||||||||
實驗儀器:
|
||||||||||||||||
|
|
學習軟件工程的標準和流程,其中主要以敏捷開發流程爲主,而其中有一極限編程做爲學習流程的主要軟件開發方法。包括:編碼,測試,傾聽,設計,做爲學習者,我主要關注和研究了編碼標準、結對編程、代碼集體全部、測試、重構等。
軟件工程是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。軟件工程包括下列領域:軟件需求分析、軟件設計、軟件構建、軟件測試和軟件維護。 人們在開發、運營、維護軟件的過程當中有不少技術、作法、習慣和思想體系。軟件工程把這些相關的技術和過程統一到一個體系中,叫「軟件開發流程」。軟件開發流程的目的是爲了提升軟件開發、運營、維護的效率,並提升軟件的質量、用戶滿意度、可靠性和軟件的可維護性。 光有各類流程的思想是不夠的,咱們還要有一系列的工具來保證這些思想可以在實踐中有效率地運做。軟件開發很重要的一點不是看你能對多少理論講的頭頭是道,還要看你對相關工具應用的如何,好比Java中單元測試要和JUnit的應用結合起來,建模要和Umbrello或StarUML的應用結合起來。編程學習是一個習而學的過程。 一個常見的公式是:軟件工程=開發流程+工具 鄒欣老師給出的兩個公式:軟件=程序+軟件工程和軟件企業=軟件+商業模式
結對編程是我新認識的編程形式,整體來講就是兩我的進行一邊編程一邊測試的過程。我(20135123)王朝憲(20135114)組成了小組,進行了小遊戲和其餘小程序的開發。
在試驗中,我倆對於團隊精神和合做有了新的認識,相互決策,相互幫助,因爲實驗樓問題多,因此我和他分別敲了一部分代碼,再結合到一塊兒構成完整代碼。
(四)版本控制
XP的集體全部制意味着每一個人都對全部的代碼負責;這一點,反過來又意味着每一個人均可以更改代碼的任意部分。結對編程對這一實踐貢獻良多:藉由在不一樣的結對中工做,全部的程序員都能看到徹底的代碼。集體全部制的一個主要優點是提高了開發程序的速度,由於一旦代碼中出現錯誤,任何程序員都能修正它。 這意味着代碼要放到一個你們都能方便獲取的地方,咱們叫代碼倉庫。這引出另一個話題叫版本控制(Version Control)。
不管是對於團隊仍是個體,版本控制都提供了不少好處。
流行的版本控制工具備CVS,SVN,Git等,更多的能夠參考這裏。Git是Linus除了Linux操做系統外的另一個重要發明。
如下是實驗過程的截圖:
(五)重構
咱們先看看重構的概念:
重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動。
重構中一個很是關鍵的前提就是「不改變軟件外部行爲」,它保證了咱們在重構原有系統的同時,不會爲原系統帶來新的BUG,以確保重構的安全。如何保證不改變軟件外部行爲?重構後的代碼要能經過單元測試。如何使其更加易於閱讀、易於維護和易於變動 ?設計模式給出了重構的目標。
重構重要嗎?你看看Eclipse菜單中有個refactor菜單就知道了,重構幾乎是現代IDE的標配了:
如下是實驗過程截圖:
咱們要修改軟件,萬變不離其宗,無非就是四種動機:
第一種和第二種動機,都是源於客戶的功能需求,而第四種是源於客戶的非功能需求。軟件的外部質量,其衡量的標準就是客戶對軟件功能需求與非功能需求的滿意度。它涉及到一個企業、一個軟件的信譽度與生命力,所以爲全部軟件企業所高度重視。要提升軟件內部質量,毫無疑問就是軟件修改的第三個動機:改善原有程序的結構。它的價值是隱性的,並不體如今某一次或兩次開發中,而是逐漸體如今往後長期維護的軟件過程當中。 高質量的軟件,能夠保證開發人員(即便是新手)可以輕易看懂軟件代碼,可以保證往後的每一次軟件維護均可以輕易地完成(不論軟件經歷了多少次變動,維護了多少年),可以保證往後的每一次需求變動都可以輕易地進行(而不是傷筋動骨地大動)。要作到這幾點其實並不容易,它須要咱們持續不斷地對系統內部質量進行優化與改進。這,就是系統重構的價值。 下面一個重要問題是哪些地方須要重構?有臭味道(Bad Smell)的代碼。 什麼是臭味道?想象一下你打開冰箱門,出來一股臭味道你就知道冰箱裏有東西腐壞了,要清除了。
本次java項目選擇了「五子棋」,在試驗過程當中,使用到了GUI用戶界面顯示,並同時試寫了測試代碼。
經過不斷地磨合與協做,小遊戲成功的運行,並進行了試玩,效果良好,未發現結果錯誤。
實驗過程記錄:
package org.liky.game.frame;//20135114
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FiveChessFrame extends JFrame implements MouseListener, Runnable {
// 取得屏幕的寬度
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
// 取得屏幕的高度
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 背景圖片
BufferedImage bgImage = null;
// 保存棋子的座標
int x = 0;
int y = 0;
// 保存以前下過的所有棋子的座標
// 其中數據內容 0: 表示這個點並無棋子, 1: 表示這個點是黑子, 2:表示這個點是白子
int[][] allChess = new int[19][19];
// 標識當前應該黑棋仍是白棋下下一步
boolean isBlack = true;
// 標識當前遊戲是否能夠繼續
boolean canPlay = true;
// 保存顯示的提示信息
String message = "黑方先行";
// 保存最多擁有多少時間(秒)
int maxTime = 0;
// 作倒計時的線程類
Thread t = new Thread(this);
// 保存黑方與白方的剩餘時間
int blackTime = 0;
int whiteTime = 0;
// 保存雙方剩餘時間的顯示信息
String blackMessage = "無限制";
String whiteMessage = "無限制";
public FiveChessFrame() {
// 設置標題
this.setTitle("五子棋");
// 設置窗體大小
this.setSize(500, 500);
// 設置窗體出現位置
this.setLocation((width - 500) / 2, (height - 500) / 2);
// 將窗體設置爲大小不可改變
this.setResizable(false);
// 將窗體的關閉方式設置爲默認關閉後程序結束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 爲窗體加入監聽器
this.addMouseListener(this);
// 將窗體顯示出來
this.setVisible(true);
t.start();
t.suspend();
// 刷新屏幕,防止開始遊戲時出現沒法顯示的狀況.
this.repaint();
String imagePath = "";
try {
imagePath = System.getProperty("user.dir")
+ "/bin/image/background.jpg";
bgImage = ImageIO.read(new File(imagePath.replaceAll("\\\\", "/")));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void paint(Graphics g) {
// 雙緩衝技術防止屏幕閃爍
BufferedImage bi = new BufferedImage(500, 500,
BufferedImage.TYPE_INT_RGB);
Graphics g2 = bi.createGraphics();
g2.setColor(Color.BLACK);
// 繪製背景
g2.drawImage(bgImage, 1, 20, this);
// 輸出標題信息
g2.setFont(new Font("黑體", Font.BOLD, 20));
g2.drawString("遊戲信息:" + message, 130, 60);
// 輸出時間信息
g2.setFont(new Font("宋體", 0, 14));
g2.drawString("黑方時間:" + blackMessage, 30, 470);
g2.drawString("白方時間:" + whiteMessage, 260, 470);
// 繪製棋盤
for (int i = 0; i < 19; i++) {
g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);
g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);
}
// 標註點位
g2.fillOval(68, 128, 4, 4);
g2.fillOval(308, 128, 4, 4);
g2.fillOval(308, 368, 4, 4);
g2.fillOval(68, 368, 4, 4);
g2.fillOval(308, 248, 4, 4);
g2.fillOval(188, 128, 4, 4);
g2.fillOval(68, 248, 4, 4);
g2.fillOval(188, 368, 4, 4);
g2.fillOval(188, 248, 4, 4);
/*
* //繪製棋子 x = (x - 10) / 20 * 20 + 10 ; y = (y - 70) / 20 * 20 + 70 ;
* //黑子 g.fillOval(x - 7, y - 7, 14, 14); //白子 g.setColor(Color.WHITE) ;
* g.fillOval(x - 7, y - 7, 14, 14); g.setColor(Color.BLACK) ;
* g.drawOval(x - 7, y - 7, 14, 14);
*/
// 繪製所有棋子
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if (allChess[i][j] == 1) {
// 黑子
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
}
if (allChess[i][j] == 2) {
// 白子
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g2.setColor(Color.WHITE);
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
g2.setColor(Color.BLACK);
g2.drawOval(tempX - 7, tempY - 7, 14, 14);
}
}
}
g.drawImage(bi, 0, 0, this);
}
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {// TODO Auto-generated method stub/** System.out.println("X:"+e.getX()); System.out.println("Y:"+e.getY());*/if (canPlay == true) {x = e.getX();y = e.getY();if (x >= 10 && x <= 370 && y >= 70 && y <= 430) {x = (x - 10) / 20;y = (y - 70) / 20;if (allChess[x][y] == 0) {// 判斷當前要下的是什麼顏色的棋子if (isBlack == true) {