1. 程式人生 > >實驗三 敏捷開發與XP實踐

實驗三 敏捷開發與XP實踐

解決 最終 開發者 編碼 jpg 傳遞 spa 安裝 不足

實驗三 敏捷開發與XP實踐

課程:Java程序設計

班級:1652

姓名:孔月

學號:20165208

指導教師:婁嘉鵬

實驗日期:2018.4.28

實驗名稱:敏捷開發與XP實踐

實驗內容及要求:

  1. XP基礎
  2. XP核心實踐
  3. 相關工具

    實驗內容、步驟與體會

目錄:

  • (一)在IDEA中使用工具格式化代碼,並學習Code菜單的功能
  • (二)下載搭檔實驗二的Complex代碼,加入不少於三個JUnit單元測試用例
  • (三)下載搭檔的代碼,至少進行三項重構
  • (四)以結對的方式完成Java密碼學相關內容的學習,結合重構、git、代碼標準等

(一)在IDEA中使用工具格式化代碼,並學習Code菜單的功能

  • Alibaba Java Code Guidelines的安裝

    IDEA界面打開 Settings ->Plugins -> Browse repositories...,在搜索框輸入alibaba即可看到Alibaba Java Code Guidelines插件,點擊Install進行安裝,然後重啟IDEA生效。

    下載完成後開始進行代碼規範操作

以下為老師所給的源代碼

public class CodeStandard {
public static void main(String [] args){
StringBuffer buffer = new StringBuffer();
buffer.append(‘S‘);
buffer.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));
}
}
  • 復制到IDEA後,他會先自動進行格式化,後點擊菜單中的Code->Reformate Code進行代碼規範化。
  • 再通過在項目名稱上單擊右鍵,在彈出菜單上選擇編碼規約掃描進行阿裏巴巴代碼規範化

最終效果如下圖
技術分享圖片
技術分享圖片

Code菜單相關內容

  • Override Methods:重載基本類的方法
  • Implement Methods:完成當前類implements的(或者抽象基本類的)接口的方法
  • Generate:創建類裏面任何字段的 getter 與 setter 方法;
  • Surround With:使用if-else、try-catch、do-while等多種語句對代碼段進行包裝
  • Code->Comment with Line Comment
    此行改寫為註釋
  • Code->Comment with Block Comment此行添加註釋
  • Reformat Code:將代碼按標準格式縮進
  • show reformat file dialog:按照格式自動對齊
  • Optimize imports:優化imports,去除不必要的imports
  • Move Line/statement Down/Up:將某行、表達式向下、向上移動一行

相較來說對我最實用的是Reformat CodeCode->Comment with Block Comment

返回目錄

(二)下載搭檔實驗二的Complex代碼,加入不少於三個JUnit單元測試用例

import java.util.Scanner;
import java.lang.String;
public class Complex {
    double shibu;
    double xubu;
    public Complex(double shibu,double xubu){
        this.shibu=shibu;
        this.xubu=xubu;
    }

    public static double getShibu(double shibu) {
        return shibu;
    }

    public static double getXubu(double xubu) {
        return xubu;
    }
    public boolean equals(Object obj){
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Complex)) {
            return false;
        }
        Complex complex = (Complex) obj;
        if(complex.shibu != ((Complex) obj).shibu) {
            return false;
        }
        if(complex.xubu != ((Complex) obj).xubu) {
            return false;
        }

        return true;
    }

    Complex ComplexAdd(Complex a){
        double shibu2=shibu+a.shibu;
        double xubu2=xubu+a.xubu;
        return new Complex(shibu2,xubu2);
    }
    Complex ComplexSub(Complex b){
        double shibu2=shibu - b.shibu;
        double xubu2=xubu - b.xubu;
        return new Complex(shibu2,xubu2);
    }
    Complex ComplexMulti(Complex c){
        double shibu2=(shibu * c.shibu)-(xubu*c.xubu);
        double xubu2=(xubu * c.xubu)+(xubu * c.shibu);
        return new Complex(shibu2,xubu2);
    }
    Complex ComplexDiv(Complex d){
        double shibu2=(shibu * d.xubu+xubu * d.shibu) / (d.xubu * d.xubu+d.shibu * d.shibu);
        double xubu2=(xubu*d.xubu+shibu*d.shibu)/(d.shibu*d.shibu+ d.xubu*d.xubu);
        return new Complex(shibu2,xubu2);
    }
    public String toString(){
        String s="";
        if(xubu>0)
            s=shibu+"+"+xubu+"i";
        if(xubu<0)
            s=shibu+xubu+"i";
        if (xubu==0)
            s=""+shibu;
        return s;
    }
}

以上為搭檔的產品代碼,根據其寫下了測試代碼

import junit.framework.TestCase;
import org.junit.Test;

public class ComplexTest extends TestCase {
    Complex c1 = new Complex(0, 3);
    Complex c2 = new Complex(-1, -1);
    Complex c3 = new Complex(2, 1);

    @Test
    public void testgetRealPart() throws Exception {
        assertEquals(-1.0, Complex.getShibu(-1.0));
        assertEquals(5.0, Complex.getShibu(5.0));
        assertEquals(0.0, Complex.getShibu(0.0));
    }

    @Test
    public void testgetImagePart() throws Exception {
        assertEquals(-1.0, Complex.getXubu(-1.0));
        assertEquals(5.0, Complex.getXubu(5.0));
        assertEquals(0.0, Complex.getXubu(0.0));
    }

    @Test
    public void testComplexComplexDiv() throws Exception {
        assertEquals("-1.5 -1.5i", c1.ComplexDiv(c2).toString());
        assertEquals("1.2+0.6i", c1.ComplexDiv(c3).toString());
        assertEquals("-0.6 -0.6i", c2.ComplexDiv(c3).toString());
    }
    @Test
    public void testComplexAdd() throws Exception {
        assertEquals("-1.0+2.0i", c1.ComplexAdd(c2).toString());
        assertEquals("2.0+4.0i", c1.ComplexAdd(c3).toString());
        assertEquals("1.0", c2.ComplexAdd(c3).toString());
    }
    @Test
    public void testComplexSub() throws Exception {
        assertEquals("1.0+4.0i", c1.ComplexSub(c2).toString());
        assertEquals("-2.0+2.0i", c1.ComplexSub(c3).toString());
        assertEquals("-3.0 -2.0i", c2.ComplexSub(c3).toString());
    }
    @Test
    public void testComplexMulti() throws Exception {
        assertEquals("3.0 -6.0i", c1.ComplexMulti(c2).toString());
        assertEquals("-3.0+9.0i", c1.ComplexMulti(c3).toString());
        assertEquals("-1.0 -3.0i", c2.ComplexMulti(c3).toString());
    }
}

測試過程中也有出現問題,我發現他的代碼出現了和我當時一樣的錯誤,即,在檢測時只能通過3個測試用例,根據反饋查錯發現原代碼在s=shibu+xubu+"i";中默認將前兩個變量先進行了求和運算,未起到原有目的,後改進為s=shibu+" "xubu+"i";即可進行運算。
測試代碼通過截圖如下
技術分享圖片
技術分享圖片

返回目錄

(三)下載搭檔的代碼,至少進行三項重構

我選擇的搭檔代碼為求組合數遞歸的,具體代碼如下:
public class aka20165211 {
    public static void main(String[] args) {
        int [] tmp=new int[args.length];
        for (int i=0;i<args.length;i++){
            tmp[i]=Integer.parseInt(args[i]);
        }
        if(tmp[0]<tmp[1]){
            System.out.println("error!");
        }
        else{
                System.out.println(C(tmp[0],tmp[1]));
            }
    }
    private static int C(int n,int m){
        if(m==1)
            return n;
        else if(m==n)
            return 1;
        else
            return C(n-1,m-1)+C(n-1,m);
    }
}

觀察後發現,代碼整體簡潔明了,主要有以下小問題

  • 類名不符合命名規則,無法通過類名得知代碼具體功能;
  • 代碼格式不規範
  • 除了以上需要重構的地方外我發現它的分類標準還存在一些小遺漏,更改填充後的效果如下圖。

最終運行效果如圖
技術分享圖片

技術分享圖片

返回目錄

(四)以結對的方式完成Java密碼學相關內容的學習,結合重構、git、代碼標準等

我們選擇的是MD5加密算法的編程實現,根據老師的博客中所寫的java.security包中的MessageDigest類提供了計算消息摘要的方法,首先生成對象,執行其update()方法可以將原始數據傳遞給該對象,然後執行其digest( )方法即可得到消息摘要。

我和我的結對夥伴在參考了老師的博客後,協作進行了此次實驗,具體代碼如下

import java.security.MessageDigest;

public class MD5 {
    public static String MD5(String key) throws Exception {
        byte[] cipher = key.getBytes();
        MessageDigest clear = MessageDigest.getInstance("MD5");
        clear.update(cipher);
        byte s[] = clear.digest();
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < s.length; i++) {
            int a = ((int) s[i]) & 0xff;
            if (a < 16) {
                str.append("0");
            }
            str.append(Integer.toHexString(a));
        }
        return str.toString();
    }

    public static void main(String args[]) throws Exception {
        String str1 = new String("dingyi");
        System.out.println("原始:" + str1);
        System.out.println("MD5後:" + MD5(str1));
        String str2 = new String("kongyue");
        System.out.println("原始:" + str2);
        System.out.println("MD5後:" + MD5(str2));
        String str3 = new String("abc");
        System.out.println("原始:" + str3);
        System.out.println("MD5後:" + MD5(str3));
    }
}

運行截圖如下
技術分享圖片

返回目錄

問題總結與體會

  • 問題1:如何將自己的搭檔加入到自己的項目中
  • 解決方法1:進入自己的項目頁面,點擊管理,添加項目成員,選擇開發者發送邀請。
  • 問題2:如何將自己的代碼上傳到結對夥伴的項目中,保證上傳者為自己
  • 解決方案:首先對於將結對夥伴的代碼克隆到自己的電腦中的操作為打開IDEA在功能欄中選擇File->New->Project from Version Control,克隆完成後在原有基礎上進行修改,修改完成後單擊選擇git,Commit file,選擇commit。
  • 體會:本次實驗相對來說比上一次的簡單些,讓我印象深刻的主要是後兩個實驗,實驗三是在我觀察分析結對夥伴的代碼時發現對方的代碼真的很簡潔明了,能被更正的地方很少,相較來說我本人的代碼則有很多地方需要更正與重構的,這次結對讓我認識到了自己的不足,同時也通過這次實驗讓我學到了很多有關代碼規範的要求,也矯正了寫代碼的一些不好的習慣。而實驗四則是要求寫一篇有關密碼學的代碼,按照計劃是我寫測試代碼,隊友寫產品代碼,然而按照單元測試的方法我的代碼不能成功運行,後更正為了在產品代碼中直接進行檢測最終進行輸出。
步驟 耗時 百分比
需求分析 15 min 11.1%
設計 30 min 22.2%
代碼實現 45 min 33.3%
測試 20 min 14.8%
分析總結 25 min 18.5%

實驗三 敏捷開發與XP實踐