2018-2019-2-20175225 實驗三 《敏捷開發與XP實踐》實驗報告

1、實驗內容與步驟

1.安裝、使用alibaba插件規範代碼

- 在IDEA的setting中找到plugins並搜索alibaba,點擊install進行安裝


- 重啓IDEA後,在代碼中右擊點擊編碼規約掃描就可使用了
對老師給的示例代碼進行掃描後的結果以下:
java

規範後的代碼以下:git

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));
        }
    }
}

2.任務一:使用工具(Code->Reformate Code)格式化代碼,並瞭解code菜單的功能

- 使用工具(Code->Reformate Code)格式化代碼
     - 在code中選擇Reformate Code格式化代碼

- code菜單中的功能
     - Override Methods(ctrl+O):重載基本類的方法

- Surround With(Ctrl+Alt+T):使用if-else、for、while等語句包裝代碼段

- Comment with Line Comment(Ctrl+/):將本行變成註釋

任務二:下載搭檔實驗二的Complex代碼,加入很多於三個JUnit單元測試用例

- 搭檔的Complex代碼以下:
package shiyan3;
/**
 * @author zyr
 * @date  2019/4/30
*/
public class Complex {
    // 定義屬性並生成getter,setter
    double RealPart;
    double ImagePart;
    // 定義構造函數
    public Complex(){
        RealPart = 0;
        ImagePart = 1;
    }
    public Complex(double R,double I){
        ImagePart = I;
        RealPart = R;
    }

    //override Object
    public boolean Equals(Object obj){
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Complex)) {
            return false;
        }
        Complex complex = (Complex) obj;
        if(complex.RealPart != ((Complex) obj).RealPart) {
            return false;
        }
        if(complex.ImagePart != ((Complex) obj).ImagePart) {
            return false;
        }

        return true;
    }
    @Override
    public String toString()   {
        String string = "";
        if (ImagePart > 0)
            string =  RealPart + "+" + ImagePart + "i";
        if (ImagePart == 0)
            string =  RealPart + "";
        if (ImagePart < 0)
            string = RealPart + " " + ImagePart + "i";
        return string;
    }
    // 定義公有方法:加減乘除
    Complex ComplexAdd(Complex a) {
        double b=0,c=0;
        b = RealPart+a.RealPart;
        c = ImagePart+a.ImagePart;
        System.out.println("("+RealPart+"+"+ImagePart+"i) + ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
    Complex ComplexSub(Complex a) {
        double b=0,c=0;
        b = RealPart-a.RealPart;
        c = ImagePart-a.ImagePart;
        System.out.println("("+RealPart+"+"+ImagePart+"i) - ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
    Complex ComplexMulti(Complex a) {
        double b=0,c=0;
        b = RealPart*a.RealPart;
        c = ImagePart*a.ImagePart;
        System.out.println("("+RealPart+"+"+ImagePart+"i) * ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
    Complex ComplexDiv(Complex a) {
        if(a.RealPart==0||a.ImagePart==0) {
            System.out.println("被除數不能爲0,錯誤");
            return new Complex();
        }

        double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
        double b=0,c=0;
        b = (RealPart*a.RealPart+ImagePart*a.ImagePart)/d;
        c = Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d);
        System.out.println("("+RealPart+"+"+ImagePart+"i) / ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
}
- 要測試的類testAd、testSub、testMulti、testDiv
  - 測試代碼以下:
package shiyan3;

import junit.framework.TestCase;
import org.junit.Test;
public class ComplexTest1 extends TestCase {
    Complex complex = new Complex(1, 1);
    @Test
    public void testAdd() {
        assertEquals(new Complex(3.0, 3.0), complex.ComplexAdd(new Complex(2.0, 2.0)));
    }
    @Test
    public void testSub() {
        assertEquals(new Complex(-5.0, -2.0), complex.ComplexSub(new Complex(6.0, 3.0)));
    }
    @Test
    public void testMulti() {
        assertEquals(new Complex(3.0, 2.0), complex.ComplexMulti(new Complex(3.0, 2.0)));
    }
    @Test
    public void testDiv() {
        assertEquals(new Complex(1.0, 1.0), complex.ComplexDiv(new Complex(1.0, 1.0)));
        assertEquals(new Complex(0.0, 0.0), complex.ComplexDiv(new Complex(1.0, 0.0)));
        //邊緣測試
    }
}

將測試代碼傳到搭檔的碼雲,git log以下:
算法

4.任務三:重構

- 重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。
  - 修改軟件的四種動機:
     - 增長新功能
     - 原有功能有BUG
     - 改善原有程序的結構
     - 優化原有系統的性能
  - 須要重構的地方
     - 代碼重複
     - 方法過長
     - 參數列過長
     - 條件邏輯過分複雜
     - 分支語句
  - 一個完整的重構流程應包括
     - 從版本控制系統代碼庫中Check out code
     - 讀懂代碼(包括測試代碼)
     - 發現bad smell
     - Refactoring
     - 運行全部的Unit Tests
     - 往代碼庫中Check in code
  - 重構1:添加做者和日期

- 重構2:重寫Equals時的@override標誌

- 重構3:規範方法名


修改後的代碼app

package shiyan3;
/**
 * @author zyr
 * @date  2019/4/30
*/
public class Complex {
    // 定義屬性並生成getter,setter
    double RealPart;
    double ImagePart;
    // 定義構造函數
    public Complex(){
        RealPart = 0;
        ImagePart = 1;
    }
    public Complex(double R,double I){
        ImagePart = I;
        RealPart = R;
    }

    //override Object
    public boolean Equals(Object obj){
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Complex)) {
            return false;
        }
        Complex complex = (Complex) obj;
        if(complex.RealPart != ((Complex) obj).RealPart) {
            return false;
        }
        if(complex.ImagePart != ((Complex) obj).ImagePart) {
            return false;
        }

        return true;
    }
    @Override
    public String toString()   {
        String string = "";
        if (ImagePart > 0)
            string =  RealPart + "+" + ImagePart + "i";
        if (ImagePart == 0)
            string =  RealPart + "";
        if (ImagePart < 0)
            string = RealPart + " " + ImagePart + "i";
        return string;
    }
    // 定義公有方法:加減乘除
    Complex ComplexAdd(Complex a) {
        double b=0,c=0;
        b = RealPart+a.RealPart;
        c = ImagePart+a.ImagePart;
        System.out.println("("+RealPart+"+"+ImagePart+"i) + ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
    Complex ComplexSub(Complex a) {
        double b=0,c=0;
        b = RealPart-a.RealPart;
        c = ImagePart-a.ImagePart;
        System.out.println("("+RealPart+"+"+ImagePart+"i) - ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
    Complex ComplexMulti(Complex a) {
        double b=0,c=0;
        b = RealPart*a.RealPart;
        c = ImagePart*a.ImagePart;
        System.out.println("("+RealPart+"+"+ImagePart+"i) * ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
    Complex ComplexDiv(Complex a) {
        if(a.RealPart==0||a.ImagePart==0) {
            System.out.println("被除數不能爲0,錯誤");
            return new Complex();
        }

        double d = Math.sqrt(a.RealPart*a.RealPart)+Math.sqrt(a.ImagePart*a.ImagePart);
        double b=0,c=0;
        b = (RealPart*a.RealPart+ImagePart*a.ImagePart)/d;
        c = Math.round((RealPart*a.ImagePart-ImagePart*a.RealPart)/d);
        System.out.println("("+RealPart+"+"+ImagePart+"i) / ("+a.RealPart+"+"+a.ImagePart+") = "+b+"+"+c+"i");
        return  new Complex(b,c);
    }
}

4.任務四:以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準Java密碼學相關內容的學習

和搭檔對各類算法進行學習研究後,咱們選擇了MD5算法:ide

使用Java計算指定字符串的消息摘要,java.security包中的MessageDigest類提供了計算消息摘要的方法函數

  • 首先生成對象,執行其update()方法能夠將原始數據傳遞給該對象,而後執行其digest( )方法便可獲得消息摘要。具體步驟以下:工具

    • 生成MessageDigest對象:MessageDigest m=MessageDigest.getInstance("MD5");
    • 傳入須要計算的字符串:m.update(x.getBytes("UTF8" ));
    • 計算消息摘要:byte s[ ]=m.digest( );
    • 處理計算結果(必要的話可使用以下代碼將計算結果s轉換爲字符串)
    String result="";
    for (int i=0; i<s.length; i++){
       result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
    }
  • 產品代碼:性能

import java.io.UnsupportedEncodingException;
import java.security.*;

public class MD5Encrypt {
    public static void main(String args[]) throws Exception {
        String originalStr = args[0];
        MessageDigest m = null;
        try {
            m = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        try {
            m.update(originalStr.getBytes("UTF8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        byte byteStr[] = m.digest();
        GetResult getResult = new GetResult();
        for (int i = 0; i < byteStr.length; i++) {
            getResult.result += Integer.toHexString((0x000000ff & byteStr[i]) |
                    0xffffff00).substring(6);
        }
    }

    public static class GetResult {
        String result = "";
    }
}

  • 測試類
/*測試輸入輸出*/
String str = new String(originalStr);
System.out.println("明文:" + str);
System.out.println("密文:" + getResult.result);

代碼託管

實驗體會與總結

我經過本次實驗學會了如何規範、格式化代碼,如何將搭檔加入本身的碼雲項目並進行合做編寫代碼,如何重構以及Java密碼學相關知識。在本身上手實踐操做過程當中,加深了對平時不清楚的知識點的理解,也掌握了重構等新知識點。單元測試

相關文章
相關標籤/搜索