20175316 盛茂淞 2018-2019-2 《Java程序設計》實驗三《敏捷開發與XP實踐》 實驗報告

實驗內容與要求

1.XP基礎

極限編程(Extreme Programming,XP)是一種全新而快捷的軟件開發方法。XP團隊使用現場客戶、特殊計劃方法和持續測試來提供快速的反饋和全面的交流:html

  • XP是以開發符合客戶須要的軟件爲目標而產生的一種方法論
  • XP是一種以實踐爲基礎的軟件工程過程和思想
  • XP認爲代碼質量的重要程度超出人們通常所認爲的程度
  • XP特別適合於小型的有責任心的、自覺自勵的團隊開發需求不肯定或者迅速變化的軟件
    XP軟件開發的基石是XP的活動,包括:編碼、測試、傾聽、設計。java

    2.XP核心實踐

3.相關工具

敏捷開發與XP實踐-1

實驗目的與要求:

  • http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的內容替換成IDEA
  • 參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安裝alibaba 插件,解決代碼中的規範問題。
  • 在IDEA中使用工具(Code->Reformate Code)把下面代碼從新格式化,再研究一下Code菜單,找出一項讓本身感受最好用的功能。提交截圖,加上本身學號水印。
public class CodeStandard {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer();
buffer.append('S');
buf![](https://img2018.cnblogs.com/blog/1272669/201905/1272669-20190502160118003-975536005.png)

fer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString());
if(buffer.capacity()<20)
buffer.append("1234567");


for(int i=0; i<buffer.length();i++)
System.out.println(buffer.charAt(i));
}
}

實驗步驟

編程標準使代碼更容易閱讀和理解。編程標準包含:具備說明性的名字、清晰的表達式、直截了當的控制流、可讀的代碼和註釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。git

  • Settings ->Plugins -> Browse repositories...——安裝alibaba
  • 在項目名稱上單擊右鍵,在彈出菜單上選擇編碼規約掃描
  • 不規範的地方,有中文提示而且定位到了行,alibaba把問題分爲block/critical/major三個等級。根據報錯提示,進行了修改。算法

  • Code->Reformate Code
  • 從新格式化以後
    編程

  • 我發現Code->Surround with...功能很好用,例如咱們想改變本身代碼的部分邏輯結構,加個if語句,直接用這個功能就行了,先選擇範圍
  • Surround後
    app

敏捷開發與XP實踐-2

實驗目的與要求:

  • 在碼雲上把本身的學習搭檔加入本身的項目中,確認搭檔的項目加入本身後,下載搭檔實驗二的Complex代碼,加入很多於三個JUnit單元測試用例,測試成功後git add .; git commit -m "本身學號 添加內容";git push;
  • 提交搭檔項目git log的截圖,包含上面git commit的信息,並加上本身的學號水印信息。ide

    實驗內容

  • 搭檔代碼
public class Complex {
    double RealPart;
    double ImagePart;
    public Complex(){}
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }
    public boolean equals(Complex a){
        if(a.RealPart==this.RealPart&&a.ImagePart==this.ImagePart){
            return true;
        }
        else {
            return false;
        }
    }
    public String toString(){
        return "Complex{"+RealPart+","+ImagePart+"}";
    }
}
  • 加入很多於三個JUnit單元測試用例,而且測試成功
Complex:
public class Complex {
    double RealPart;
    double ImagePart;
    public Complex(){}
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }
    public boolean equals(Complex a){
        if(a.RealPart==this.RealPart&&a.ImagePart==this.ImagePart){
            return true;
        }
        else {
            return false;
        }
    }
    public String toString(){
        return "Complex{"+RealPart+","+ImagePart+"}";
    }
    Complex ComplexAdd(Complex a) {
        return new Complex(this.RealPart + a.RealPart,this.ImagePart + a.ImagePart);
    }
    Complex ComplexSub(Complex a){
        return new Complex(this.RealPart - a.RealPart,this.ImagePart - a.ImagePart);
    }
    Complex ComplexMulti(Complex a){
        return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
                this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
    }
    Complex ComplexDiv(Complex a){
        double change = a.RealPart*a.RealPart + a.ImagePart*a.ImagePart;
        Complex b = new Complex(a.RealPart / change, - a.ImagePart / change);
        return this.ComplexMulti(b);
    }
}
ComplexTest:
public class Complex {
    double RealPart;
    double ImagePart;
    public Complex(){}
    public Complex(double R,double I){
        RealPart=R;
        ImagePart=I;
    }
    public boolean equals(Complex a){
        if(a.RealPart==this.RealPart&&a.ImagePart==this.ImagePart){
            return true;
        }
        else {
            return false;
        }
    }
    public String toString(){
        return "Complex{"+RealPart+","+ImagePart+"}";
    }
    Complex ComplexAdd(Complex a) {
        return new Complex(this.RealPart + a.RealPart,this.ImagePart + a.ImagePart);
    }
    Complex ComplexSub(Complex a){
        return new Complex(this.RealPart - a.RealPart,this.ImagePart - a.ImagePart);
    }
    Complex ComplexMulti(Complex a){
        return new Complex(this.RealPart*a.RealPart-this.ImagePart*a.ImagePart,
                this.ImagePart*a.RealPart+this.RealPart*a.ImagePart);
    }
    Complex ComplexDiv(Complex a){
        double change = a.RealPart*a.RealPart + a.ImagePart*a.ImagePart;
        Complex b = new Complex(a.RealPart / change, - a.ImagePart / change);
        return this.ComplexMulti(b);
    }
}

上傳碼雲

  • git push
  • git log

敏捷開發與XP實踐-3

實驗目的與要求:

  • http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的內容替換成IDEA
  • 完成重構內容的練習,下載搭檔的代碼,至少進行三項重構,提交重構後代碼的截圖,加上本身的學號水印。提交搭檔的碼雲項目連接。工具

    實驗內容及結果截圖:

    重構方法:

  • refactor->Rename給類、包、方法、變量更名字
  • refactor->Encapsulate Field封裝
  • Source->Generate toString()toString()方法
  • refactor->Extract Method提煉出重複的代碼單元測試

    重構後代碼

class xmnew {
    private int num;
    private String name;
    private int java;

    public int getNum() {
        return num;
    }
    @Override
    public String toString() {
        return "xmnew{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", java=" + java +
                '}';
    }
    public void setNum(int num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getJava() {
        return java;
    }

    public void setJava(int java) {
        this.java = java;
    }
}
public class xmnewTest {

    public static void main(String[] args) {
        studentdark student = new studentdark();
        student.setName("caoge");
        student.setNum(5312);
        student.setJava(94);
        System.out.println("學號爲"+ student.getNum() +",姓名爲"+ student.getName() +"java成績爲"+ student.getJava());
    }
}

運行截圖

敏捷開發與XP實踐-4

實驗目的與要求:

  • 參考 http://www.cnblogs.com/rocedu/p/6683948.html,以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準。
  • 提交學習成果碼雲連接和表明性成果截圖,要有學號水印。學習

    實驗步驟:

  • 獲取密鑰生成器KeyGenerator kg=KeyGenerator.getInstance("DESede");
  • Java中KeyGenerator類中提供了建立對稱密鑰的方法。KeyGenerator類預約義了一個靜態方法getInstance( ),方法getInstance( )的參數爲字符串類型,指定加密算法的名稱。
  • 初始化密鑰生成器kg.init(168);該步驟通常指定密鑰的長度。咱們寫的是「DESede」,則能夠是112或168位,其中112位有效。
  • 生成密鑰SecretKey k=kg.generateKey( );密鑰可用於之後的加密和解密。
  • 經過對象序列化方式將密鑰保存在文件中
FileOutputStream f=new FileOutputStream("key1.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(k);
  • ObjectOutputStream類中提供的writeObject方法能夠將對象序列化,以流的方式進行處理。這裏將文件輸出流做爲參數傳遞給ObjectOutputStream類的構造器,這樣建立好的密鑰將保存在文件key1.data中。
  • 從文件中獲取密鑰
FileInputStream f=new FileInputStream("key1.dat");
ObjectInputStream b=new ObjectInputStream(f);
Key k=(Key)b.readObject( );
  • 建立密碼器
Cipher cp=Cipher.getInstance("DESede");
  • KeyGenerCipher類是一個工廠類,它不是經過new方法建立對象,而是經過其中預約義的一個靜態方法getInstance( )獲取Cipher對象。getInstance( )方法的參數是一個字符串,該字符串給出Cipher對象應該執行哪些操做。
  • 初始化密碼器
    cp.init(Cipher.ENCRYPT_MODE, k);該方法包括兩個參數,第一個參數指定密碼器準備進行加密仍是解密,若傳入Cipher.ENCRYPT_MODE則進入加密模式。第二個參數則傳入加密或解密所使用的密鑰,即第1步從文件中讀取的密鑰對象k。
  • 獲取等待加密的明文
String s="Hello World!";
byte ptext[]=s.getBytes("UTF8");
  • 執行加密
byte ctext[]=cp.doFinal(ptext);
  • 處理加密結果
FileOutputStream f2=new FileOutputStream("SEnc.dat");
f2.write(ctext);
  • 這裏將加密結果保存在文件Senc.dat中。

加密結果:

碼雲連接

https://gitee.com/SANFENs/Teamwork

實驗體會與總結

  • java課程已過去一半,可是java實驗仍是依然的靈活,讓咱們能夠在課下使用課餘時間來學習完成,這仍然是其餘實驗課無法比擬的,所以咱們須要把握住這種學習的機會,將java課學好,讓學習的過程更有意義。
相關文章
相關標籤/搜索