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

1、實驗內容

  • 一、編碼標準:在IDEA中使用工具(Code->Reformate Code)把下面代碼從新格式化,再研究一下Code菜單,找出一項讓本身感受最好用的功能。提交截圖,加上本身學號水印。
  • 二、搭檔代碼檢驗:在碼雲上把本身的學習搭檔加入本身的項目中,確認搭檔的項目加入本身後,下載搭檔實驗二的Complex代碼,加入很多於三個JUnit單元測試用例,測試成功後git add .; git commit -m "本身學號 添加內容";git push;
  • 三、重構:完成重構內容的練習,下載搭檔的代碼,至少進行三項重構
  • 四、以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準。

2、實驗步驟

  • 1.編碼標準java

    • 在擴展包處搜索alibaba並下載,安裝完成後重啓:
      git

    • 在要進行規範的文件右鍵選擇 「編碼規約掃描」開始掃描:算法

  • 規範前給出的不規範內容提示以下:

  • 規範後的代碼以下:
    安全

  • Java中的通常的命名規則有:
    • 要體現各自的含義
    • 包、類、變量用名詞
    • 方法名用動賓
    • 包名所有小寫,如:io,awt
    • 類名第一個字母要大寫,如:HelloWorldApp
    • 變量名第一個字母要小寫,如:userNamege
    • 方法名第一個字母要小寫:setName
  • Code菜單中的一些功能
    • Override Methods(ctrl+O):重載基本類的方法網絡

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

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

    • Comment with Block Comment(Ctrl+Shift+/):將選中的代碼塊變成註釋工具

    • Move Statement Down ( 方法、代碼下移 ) 快捷鍵:Ctrl + Shift + 向下箭頭單元測試

    • Move Statement Up ( 方法、代碼上移 )快捷鍵: Ctrl + Shift + 向上箭頭


      學習

  • 2.測試搭檔代碼

    • 得到夥伴倉庫權限

      • 登錄夥伴的碼雲倉庫,在管理中選擇倉庫成員管理,—>添加倉庫成員—>邀請用戶,而後直接手機掃碼或者複製連接

    • 搭檔代碼以下:

package Experiment;

public class ComplexWZH {
    double realPart;
    double imagePart;
    public ComplexWZH() {}
    public ComplexWZH(double r, double i) {
        realPart = r;
        imagePart = i;
    }
    public double getRealPart() {
        return realPart;
    }
    public double getImagePart() {
        return imagePart;
    }
    @Override
    public boolean equals(Object obj) {
        if(this == obj) {
            return true;
        }
        if(obj == null) {
            return false;
        }
        if(getClass() != obj.getClass()) {
            return false;
        }
        if(!(obj instanceof ComplexWZH)) {
            return false;
        } else {
            ComplexWZH complexWZH = (ComplexWZH) obj;
            if (complexWZH.imagePart == ((ComplexWZH) obj).imagePart) {
                return true;
            }
            if (complexWZH.realPart == ((ComplexWZH) obj).realPart) {
                return true;
            }
        }
        return false;
    }
    @Override
    public  String toString() {
        String str = "";
        if (realPart == 0&& imagePart == 0) {
            str = "0.0";
        } else if (realPart == 0&& imagePart != 0) {
            str = imagePart + "" + "i";
        } else if (realPart != 0&& imagePart == 0) {
            str = realPart + "";
        } else if (realPart !=0&& imagePart > 0) {
            str = realPart + "" + "+" + imagePart + "i";
        } else if (realPart !=0&& imagePart < 0) {
            str = realPart + "" + imagePart + "i";
        }
        return str;
    }
    public ComplexWZH complexAdd(ComplexWZH a) {
        return new ComplexWZH(realPart + a.getRealPart(), imagePart + a.getImagePart());
    }
    public ComplexWZH complexSub(ComplexWZH a) {
        return new ComplexWZH(realPart - a.getRealPart(), imagePart - a.getImagePart());
    }
    public ComplexWZH complexMulti(ComplexWZH a) {
        return new ComplexWZH(realPart *a.getRealPart() - imagePart *a.getImagePart(), realPart *a.getImagePart() + imagePart *a.getRealPart());
    }
    public ComplexWZH complexDiv(ComplexWZH a) {
        if(a.getRealPart() == 0&&a.getImagePart() == 0) {
            System.out.println("除數不能爲0");
            return new ComplexWZH();
        }
        else {
            return new ComplexWZH((realPart *a.getRealPart() - imagePart *a.getImagePart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()),(realPart *a.getImagePart() + imagePart *a.getRealPart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()));
        }
    }
}
  • 對其中的全部方法均進行了測試

  • 測試代碼:

package Experiment;

import junit.framework.TestCase;
import org.junit.Test;
public class ComplexWZHTest extends TestCase {
 ComplexWZH a = new ComplexWZH(2.0,5.0);
 ComplexWZH b = new ComplexWZH(1.0,-4.0);
 ComplexWZH c = new ComplexWZH(-3.0,2.0);
 ComplexWZH d = new ComplexWZH(-4.0,-3.0);
 ComplexWZH e = new ComplexWZH(0.0,0.0);
 @Test
 public void testgetRealPart() throws Exception {
     assertEquals(2.0,a.getRealPart());
     assertEquals(1.0,b.getRealPart());
     assertEquals(-3.0,c.getRealPart());
     assertEquals(-4.0,d.getRealPart());
     assertEquals(0.0,e.getRealPart());
 }
 @Test
 public void testgetImagePart() throws Exception {
     assertEquals(5.0,a.getImagePart());
     assertEquals(-4.0,b.getImagePart());
     assertEquals(2.0,c.getImagePart());
     assertEquals(-3.0,d.getImagePart());
     assertEquals(0.0,e.getImagePart());
 }
 @Test
 public void testequals() throws Exception {
     assertEquals(true,a.toString().equals(a.toString()));
     assertEquals(false,b.toString().equals(c.toString()));
     assertEquals(false,d.toString().equals(e.toString()));
 }
 @Test
 public void testtoString() throws Exception {
     assertEquals("2.0+5.0i",a.toString());
     assertEquals("1.0-4.0i",b.toString());
     assertEquals("-3.0+2.0i",c.toString());
     assertEquals("-4.0-3.0i",d.toString());
     assertEquals("0.0",e.toString());
 }
 @Test
 public void testComplexAdd() throws Exception {
     assertEquals("3.0+1.0i",a.ComplexAdd(b).toString());
     assertEquals("-7.0-1.0i",c.ComplexAdd(d).toString());
     assertEquals("-4.0-3.0i",d.ComplexAdd(e).toString());
 }
 @Test
 public void testComplexSub() throws Exception {
     assertEquals("1.0+9.0i",a.ComplexSub(b).toString());
     assertEquals("1.0+5.0i",c.ComplexSub(d).toString());
     assertEquals("-3.0+2.0i",c.ComplexSub(e).toString());
 }
 public void testComplexMulti() throws Exception {
     assertEquals("22.0-3.0i",a.ComplexMulti(b).toString());
     assertEquals("18.0+1.0i",c.ComplexMulti(d).toString());
     assertEquals("0.0",b.ComplexMulti(e).toString());
 }
 public void testComplexDiv() throws Exception {
     assertEquals("-1.4666666666666666+0.2i",a.ComplexDiv(b).toString());
     assertEquals("2.5714285714285716+0.14285714285714285i",c.ComplexDiv(d).toString());
     assertEquals("0.0",a.ComplexDiv(e).toString());
 }
}
  • 測試結果:

  • 將測試好的代碼push至夥伴的碼雲並git log

  • 3.重構
    • 對代碼進行以下重構
      • 重寫方法加上@Override進行註解

      • 在代碼前添加建立者的相關信息

      • 方法名、參數名、成員變量、局部變量都統一使用LowerCamelCase,必須聽從駝峯形式,重構前提示

    • 重構後代碼:
/**
 * ComplexWZH
 * @author 林郅聰
 * @date 2019/5/1
 */
package Experiment;

@SuppressWarnings({"ALL", "AlibabaLowerCamelCaseVariableNaming"})
public class ComplexWZH {
    @SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
    double realPart;
    double imagePart;
    public ComplexWZH() {}
    public ComplexWZH(double r, double i) {
        realPart = r;
        imagePart = i;
    }
    public double getRealPart() {
        return realPart;
    }
    public double getImagePart() {
        return imagePart;
    }
    @Override
    public boolean equals(Object obj) {
        if(this == obj) {
            return true;
        }
        if(obj == null) {
            return false;
        }
        if(getClass() != obj.getClass()) {
            return false;
        }
        if(!(obj instanceof ComplexWZH)) {
            return false;
        } else {
            ComplexWZH complexWZH = (ComplexWZH) obj;
            if (complexWZH.imagePart == ((ComplexWZH) obj).imagePart) {
                return true;
            }
            if (complexWZH.realPart == ((ComplexWZH) obj).realPart) {
                return true;
            }
        }
        return false;
    }
    @Override
    public  String toString() {
        String str = "";
        if (realPart == 0&& imagePart == 0) {
            str = "0.0";
        } else if (realPart == 0&& imagePart != 0) {
            str = imagePart + "" + "i";
        } else if (realPart != 0&& imagePart == 0) {
            str = realPart + "";
        } else if (realPart !=0&& imagePart > 0) {
            str = realPart + "" + "+" + imagePart + "i";
        } else if (realPart !=0&& imagePart < 0) {
            str = realPart + "" + imagePart + "i";
        }
        return str;
    }
    public ComplexWZH complexAdd(ComplexWZH a) {
        return new ComplexWZH(realPart + a.getRealPart(), imagePart + a.getImagePart());
    }
    public ComplexWZH complexSub(ComplexWZH a) {
        return new ComplexWZH(realPart - a.getRealPart(), imagePart - a.getImagePart());
    }
    public ComplexWZH complexMulti(ComplexWZH a) {
        return new ComplexWZH(realPart *a.getRealPart() - imagePart *a.getImagePart(), realPart *a.getImagePart() + imagePart *a.getRealPart());
    }
    public ComplexWZH complexDiv(ComplexWZH a) {
        if(a.getRealPart() == 0&&a.getImagePart() == 0) {
            System.out.println("除數不能爲0");
            return new ComplexWZH();
        }
        else {
            return new ComplexWZH((realPart *a.getRealPart() - imagePart *a.getImagePart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()),(realPart *a.getImagePart() + imagePart *a.getRealPart())/(a.getRealPart()*a.getRealPart()-a.getImagePart()*a.getImagePart()));
        }
    }
}

-4.Java密碼學相關內容

  • Java安全體系結構總共分爲4個部分:
  • JCAJava Cryptography Architecture, Java加密體系結構):JCA提供基本的加密框架, 如證書、 數字簽名、消息摘要和密鑰對產生器。
  • JCEJava Cryptography Extension, Java加密擴展包): JCEJCA的基礎上做了擴展, 提供了各類加密算法、 消息摘要算法和密鑰管理等功能。JCE的實現主要在javax.crypto包( 及其子包) 中
  • JSSEJava Secure Sockets Extension, Java安全套接字擴展包):JSSE提供了基於SSLSecure Sockets Layer,安全套接字層) 的加密功能。 在網絡的傳輸過程當中, 信息會通過多個主機(頗有可能其中一臺就被竊聽) , 最終傳送給接收者, 這是不安全的。這種確保網絡通訊安全的服務就是由JSSE來提供的。
  • JAASJava Authentication and Authentication Service, Java鑑別與安全服務):JAAS提供了在Java平臺上進行用戶身份鑑別的功能。

  • 凱撒密碼

    • 對凱撒密碼進行了驗證,並對代碼進行了重構

    • 運行結果

    • 重構後結果
    • Java對稱加密—DES算法

    • 密鑰的產生

    • 加密Hello World

    • 對密文進行解密

    • Java非對稱加密—RSA算法

    • 公私鑰的產生

    • 加密Hello World

    • 對密文進行解密

    • 使用密鑰協定建立共享密鑰—DH算法

    • A和B分別產生本身的公鑰和私鑰

    • 建立共享密鑰

    • Java摘要算法—MD5

3、實驗中遇到的問題

  • 問題:在實現DH算法時,但願把用戶A和B的產生的公鑰和私鑰分別存放至兩個目錄中,但實際上不能作到放至同一個包下,在out文件中運行時會自動存放至根目錄下,沒法真正實現博客中所說的我的用戶的管理
  • 解決方法:暫無

4、夥伴評價

夥搭檔學習熱情很高,一直督促我學習,過程當中也幫助我不少,是很好的學習夥伴。

5、碼雲連接

個人碼雲連接:連接
夥伴的碼雲連接:連接

相關文章
相關標籤/搜索