20175211 《實驗三 敏捷開發與XP實踐》實驗報告

1、實驗內容

(1)編碼標準
(2)Git的使用
(3)重構
(4)Java密碼學相關內容的學習java

2、實驗步驟

(1)編碼標準

在IDEA中使用工具(Code->Reformate Code)把下面代碼從新格式化,再研究一下Code菜單,找出一項讓本身感受最好用的功能。提交截圖,加上本身學號水印。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));
}
}

快捷鍵ctrl + alt + L格式化代碼,效果以下(其實我直接粘貼複製進去Idea就自動幫我格式化了,神仙工具)
算法

(2)Git的使用以及添加Complex類測試代碼

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

倉庫添加成員,同時掃碼加入搭檔的項目
app

git clone url克隆倉庫,添加測試代碼工具

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

public class ComplexTest_Pair extends TestCase {
    Complex a = new Complex();
    Complex b = new Complex(2,-3);
    Complex c = new Complex(1.23,3.21);

    @Test
    public void testequals(){
        assertFalse(b.equals(a));
    }

    @Test
    public void testtoString(){
        assertEquals("0",a.toString());
        assertEquals("2.0-3.0i",b.toString());
        assertEquals("1.23+3.21i",c.toString());
    }

    @Test
    public void testComplexSub(){
        assertEquals("-0.77+6.21i",c.complexsub(b).toString());
        assertEquals("-2.0+3.0i",a.complexsub(b).toString());
    }

    @Test
    public void testComplexMul(){
        assertEquals("0",a.complexmulti(b).toString());
        assertEquals("12.09+2.73i",b.complexmulti(c).toString());
    }
}

(3)重構

完成重構內容的練習,下載搭檔的代碼,至少進行三項重構,提交重構後代碼的截圖,加上本身的學號水印。提交搭檔的碼雲項目連接。單元測試

使用編碼規約掃描,直接點擊下面的提醒,alt+enter自動修正
學習

(4)Java密碼學相關內容的學習

  • 體驗加解密-凱撒密碼
    • 加密:c=m+k mod n
    • 解密:m=c+k mod n
  • Java對稱加密-DES算法
    • 加密:
      • (1) 獲取密鑰生成器
        KeyGenerator kg=KeyGenerator.getInstance("DESede");
      • (2)初始化密鑰生成器
        kg.init(168);
        定長度時,若第一步密鑰生成器使用的是「DES」算法,則密鑰長度必須是56位;如果「DESede」,則能夠是112或168位,其中112位有效;如果「AES」,能夠是128, 192或256位;如果「Blowfish」,則能夠是32至448之間能夠被8整除的數;「HmacMD5」和「HmacSHA1」默認的密鑰長度都是64個字節。
      • (3) 生成密鑰
        SecretKey k=kg.generateKey( );
      • (4) 經過對象序列化方式將密鑰保存在文件中
      FileOutputStream f=new FileOutputStream("key1.dat");
      ObjectOutputStream b=new ObjectOutputStream(f);
      b.writeObject(k);
  • Java非對稱加密-RSA算法
    • (1) 建立密鑰對生成器
      KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
    • (2) 初始化密鑰生成器
      kpg.initialize(1024);
    • (3) 生成密鑰對
      KeyPair kp=kpg.genKeyPair( );
    • (4) 獲取公鑰和私鑰
    PublicKey pbkey=kp.getPublic( );
    PrivateKey prkey=kp.getPrivate( );
    生成密鑰

加密

解密
測試

  • 使用密鑰協定建立共享密鑰
    • 建立DH公鑰和私鑰
      • A生成的公鑰和私鑰
      • B生成的公鑰和私鑰
    • 建立共享密鑰
  • Java摘要算法- MD5

4、實驗過程當中遇到的問題及其解決方法

5、心得體會

此次試驗讓我感觸最深的是Java密碼學中關於「用」和「懂」的關係。沒想到林語堂先生還說過這麼一句話,我算是林語堂先生的小迷弟了,三觀受他影響很大。果真,個人想法又和林語堂先生同樣,我一直抱着要弄懂一個東西就要搞明白它的原理的想法。好比要研究物理現象就要知道背後的原理和公式。可是開始學習IT相關的東西后,我發現這樣的學習方法讓我愈來愈力不從心,由於我發現這方面的東西都是一層一層包裝起來的。C語言夠底層了,下面還有彙編,下面還有機器語言,再下面還有硬件,真的要從頭弄懂一臺計算機是怎麼運行的實在是一個龐大的工程。這只是舉一個例子,Java中也是這樣,有不少的庫能夠直接調用,可是有時候你沒辦法一個個搞懂它們的實現。
不得不說,先會用再去明白它的道理,雖然我以爲這樣不是最傳統的那種原理->應用的學習方法,可是平時我少不了這麼作,由於根本沒空去看一個個庫的具體實現。我想庫被建立的意義也就在於方便人們調用,而不用重複造輪子
還有,我仍是沒弄懂結對編程的好處在哪,至少就目前幾個小項目來看,徹底一我的的編程能力和思考能力是夠的,只要頭腦清晰,反而比兩我的效率高。個人結對隊友也很強,可是1+1也不過=2。可能還沒掌握精髓?可能就是不適合合做?

6、碼雲連接

7、結對成員連接

8、參考資料

相關文章
相關標籤/搜索