20155232 《Java程序設計》實驗三實驗報告

20155232 《Java程序設計》實驗三實驗報告

實驗內容

Java敏捷開發與XP實踐html

實驗內容

XP基礎java

XP核心實踐git

相關工具程序員

實驗步驟

(一)敏捷開發與XP

敏捷開發(Agile Development)是一種以人爲核心、迭代、按部就班的開發方法。「敏捷流程」是一系列價值觀和方法論的集合。算法

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

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

XP準則vim

  • 溝通 :XP認爲項目成員之間的溝通是項目成功的關鍵,並把溝通看做項目中間協調與合做的主要推進因素。
  • 簡單 :XP假定將來不能可靠地預測,在如今考慮它從經濟上是不明智的,因此不該該過多考慮將來的問題而是應該集中力量解決燃眉之急。
  • 反饋 :XP認爲系統自己及其代碼是報告系統開發進度和狀態的可靠依據。系統開發狀態的反饋能夠做爲一種肯定系統開發進度和決定系統下一步開發方向的手段。
  • 勇氣:表明了XP認爲人是軟件開發中最重要的一個方面的觀點。在一個軟件產品的開發中人的參與貫穿其整個生命週期,是人的勇氣來排除困境,讓團隊把局部的最優拋之腦後,達到更重大的目標。代表了XP對「人讓項目取得成功」的基本信任態度。
(二)編碼標準
  • 編程標準包含:具備說明性的名字、清晰的表達式、直截了當的控制流、可讀的代碼和註釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。

Java中的通常的命名規則有:數組

  • 要體現各自的含義
  • 包、類、變量用名詞
  • 方法名用動賓
  • 包名所有小寫,如:io,awt
  • 類名第一個字母要大寫,如:HelloWorldApp
  • 變量名第一個字母要小寫,如:userName
  • 方法名第一個字母要小寫:setName

實驗三 敏捷開發與XP實踐-1app

  • 在IDEA中使用工具(Code->Reformate Code)把下面代碼從新格式化,再研究一下Code菜單,找出一項讓本身感受最好用的功能。提交截圖,加上本身學號水印。
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));
}
}
  • image
(三)版本控制
  • XP的集體全部制意味着每一個人都對全部的代碼負責;這一點,反過來又意味着每一個人均可以更改代碼的任意部分。結對編程對這一實踐貢獻良多:藉由在不一樣的結對中工做,全部的程序員都能看到徹底的代碼。集體全部制的一個主要優點是提高了開發程序的速度,由於一旦代碼中出現錯誤,任何程序員都能修正它。
    這意味着代碼要放到一個你們都能方便獲取的地方,咱們叫代碼倉庫。這引出另一個話題叫版本控制(Version Control)。

實驗三 敏捷開發與XP實踐-2編輯器

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

  • 圖一是將搭檔20155232宣言加入本身的項目中,在碼雲上的顯示。

  • 圖二是使用

git clone

將搭檔的代碼克隆下來,由於咱們兩個都是用虛擬機vim上傳代碼,因此我進入搭檔的根目錄中使用

find -name Complex.java

找到ComplexTest.java將代碼拷貝到idea中進行JUnit測試。

  • 圖三是本來的測試用例經過的截圖。

  • 圖四是我添加進去的測試用例成功的截圖,出現green bar。

  • 圖五是將代碼粘貼到vim中,使用

git add .

git commmit -m " "

git push origin master

進行上傳以後,使用

git log

的截圖。

  • 圖六在碼雲上也顯示了相關信息。
(四)重構

重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。

  • 一個完整的重構流程包括:
  1. 從版本控制系統代碼庫中Check out code
  2. 讀懂代碼(包括測試代碼)
  3. 發現bad smell
  4. Refactoring
  5. 運行全部的Unit Tests
  6. 往代碼庫中Check in code
  • 將結對夥伴添加到項目中,個人結對夥伴的博客是20155215宣言

  • 實驗三 敏捷開發與XP實踐-3
    參考 , Eclipse的內容替換成IDEA
    完成重構內容的練習,下載搭檔的代碼,至少進行三項重構,提交重構後代碼的截圖,加上本身的學號水印。提交搭檔的碼雲項目連接。

  • 在vim中進入搭檔的目錄中,找到須要改寫的原始代碼:
    image

  • 將其複製粘貼到idea中,進行重構:

  1. Refactor中的Rname
    重構。

2.用Refactor
中的Encapsulate Field...
再次重構。
image

3.繼續用Extract Method...
對最後輸出信息的語句進行重構
image
image

4.在Code
中選擇Generate
,給Role類產生一個toString方法
image

5.重構後的代碼及運行結果以下:
image
image

6.運行以下:
image

7.在搭檔的項目下,進行git push 上傳
image

8.在熙搭檔的項目下,運行git log
查看上傳記錄:

image

  • 實驗三 敏捷開發與XP實踐-4

參考以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準。

提交學習成果碼雲連接和表明性成果截圖,要有學號水印。

1.體驗加解密---凱撒密碼

加密過程:c≡m+k mod n (其中n爲基本字符個數)

一樣,解密過程可表示爲:
m≡c+k mod n (其中n爲基本字符個數)
image
該程序既可用於加密又可用於解密。只要執行:

java Caesar 明文(要加密的字符串) 密鑰(移動的位數)

在密鑰前面加上負號,將運行解密。

加密:image
解密:
image
加密Helloworld
image
解密Helloworld
image

2.Java對稱加密-DES算法

本實例給出Java中建立對稱密鑰的步驟,並經過對象序列化方式保存在文件中。
image
運行java Skey_DES,在當前目錄下將生成文件key1.dat,其中包含的密鑰能夠用於使用Triple-DES算法的加密和解密。
image
先建立文件輸出流對象,在其參數中指定文件名,如keykb1.dat。而後執行文件輸出流的write( )方法將第2步中獲得的字節數組中的內容寫入文件。

import java.io.*;
import java.security.*;
public class Skey_kb{
    public static void main(String args[]) throws Exception{
        FileInputStream f=new FileInputStream("key1.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        Key k=(Key)b.readObject( );
        byte[ ] kb=k.getEncoded( );
        FileOutputStream  f2=new FileOutputStream("keykb1.dat");
       f2.write(kb);
        // 打印密鑰編碼中的內容
        for(int i=0;i<kb.length;i++){
                 System.out.print(kb[i]+",");
        }
   }
}

輸入java Skey_kb 運行程序,在程序的當前目錄中將產生文件名爲keykb1.dat的文件,屏幕輸出以下:
image
此即程序中建立的密鑰的編碼內容,若是用文本編輯器打開keykb1.dat,看到的不是上面的數字而是相似下面的字符:

棄2 ?&驊 馤禖??僪*

3.Java非對稱加密-RSA算法

輸入java Skey_RSA運行程序,當前目錄下將生成兩個文件:Skey_RSA_pub.dat和Skey_RSA_priv.dat,前者保存着公鑰,後者保存着私鑰。
image

import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Enc_RSA{
   public static void main(String args[]) throws Exception{
        String s="Hello World!";
        // 獲取公鑰及參數e,n
        FileInputStream f=new FileInputStream("Skey_RSA_pub.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        RSAPublicKey  pbk=(RSAPublicKey)b.readObject( );
        BigInteger e=pbk.getPublicExponent();
        BigInteger n=pbk.getModulus();
        System.out.println("e= "+e);
        System.out.println("n= "+n);
        // 明文 m
        byte ptext[]=s.getBytes("UTF8");
        BigInteger m=new BigInteger(ptext);
        // 計算密文c,打印
        BigInteger c=m.modPow(e,n);
        System.out.println("c= "+c);
       // 保存密文
        String cs=c.toString( );
        BufferedWriter out= 
             new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("Enc_RSA.dat")));
        out.write(cs,0,cs.length( ));
        out.close( );
       
   }
}

程序最後將密文c打印出來,並以字符串形式保存在文件中。

運行程序

輸入java Enc_RSA運行程序,獲得以下結果:
image
中顯示了公鑰中的參數以及加密的結果c,這些都是很大的整數,n和c多達上百位。程序運行後密文c以字符串形式保存在文件Enc_RSA.dat中。

RSA算法解密的結果m是一個很大的整數,爲了計算出其對應的字符串的值,先使用BigInteger類的toByteArray( )方法獲得表明該整型數的字節數組,而後將數組中每一個元素轉換爲字符,組成字符串。

import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;
import java.io.*;
public class Dec_RSA{
   public static void main(String args[]) throws Exception{
       //讀取密文
        BufferedReader in= 
                new BufferedReader(new InputStreamReader(
new FileInputStream("Enc_RSA.dat")));
        String ctext=in.readLine();
        BigInteger c=new BigInteger(ctext);
       //讀取私鑰
        FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");
        ObjectInputStream b=new ObjectInputStream(f);
        RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );
        BigInteger d=prk.getPrivateExponent();
       //獲取私鑰參數及解密 
        BigInteger n=prk.getModulus();
        System.out.println("d= "+d);
        System.out.println("n= "+n);
        BigInteger m=c.modPow(d,n);
       //顯示解密結果
        System.out.println("m= "+m);
        byte[] mt=m.toByteArray();
        System.out.println("PlainText is ");
        for(int i=0;i<mt.length;i++){
             System.out.print((char) mt[i]);
       }
    }
}

運行程序輸入java Dec_RSA運行程序,獲得以下結果:

image
其中顯示了私鑰中的參數以及解密的結果,其中整型的明文轉換後顯示出字符串「Hello World!」。

4.和結對的搭檔一塊兒將SEnc.java進行了一些修改:
image

PSP
步驟 耗時 百分比
需求分析 50分鐘 25.00%
設計 50分鐘 25.00%
代碼實現 60分鐘 30.00%
測試 20分鐘 10.00%
分析總結 20分鐘 10.00%
博客互評

20155311
20155319
20155215
20155226

相關文章
相關標籤/搜索