課程:Java程序設計 班級:1652班 姓名:王高源 學號:20165225 指導教師:婁嘉鵬 實驗日期:2018年4月27日 實驗時間:3:35 - 5:15 實驗序號:實驗三 實驗名稱:敏捷開發與XP實踐 實驗內容: 1.XP基礎 2.XP核心實踐 3.相關工具 實驗要求: - 沒有Linux基礎的同窗建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程 - 完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如「查網絡」、「問同窗」、「看書」等一概得0分)以及分析(從中能夠獲得什麼啓示,有什麼收穫,教訓等)。報告能夠參考範飛龍老師的指導 - 嚴禁抄襲,有該行爲者實驗成績歸零,並附加其餘懲罰措施。
編程標準使代碼更容易閱讀和理解,甚至能夠保證其中的錯誤更少。編程標準包含:具備說明性的名字、清晰的表達式、直截了當的控制流、可讀的代碼和註釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。java
關於程序的縮進,在IDEA中比較智能,它會幫你自動進行縮進,這樣也使得程序的可讀性大大加強。git
Java中的通常命名規則:算法
1.要體現各自的含義sql
2.包、類、變量用名詞編程
3.方法名用動賓網絡
4.包名所有小寫,如:io,awtapp
5.第一個字母要大寫,如:HelloWorldApp編輯器
6.變量名第一個字母要小寫,如:userNameide
7.方法名第一個字母要小寫:setName函數
8.在團隊操做中,格式規範是爲提升效率掃清障礙的作法;命名規
9.範則具備很強靈活性,根據各團隊不一樣的狀況和習慣進行,不只是方便本身,更是方便團隊其餘成員。
結對編程:
結對編程中的兩個重要角色:駕駛員(Driver)是控制鍵盤輸入的人,領航員(Navigator)起到領航、提醒的做用。
駕駛員:寫設計文檔,進行編碼和單元測試等XP開發流程。領航員:審閱駕駛員的文檔、駕駛員對編碼等開發流程的執行;考慮單元測試的覆蓋率;思考是否須要和如何重構;幫助駕駛員解決具體的技術問題。
駕駛員和領航員不斷輪換角色,不要連續工做超過一小時,每工做一小時休息15分鐘。領航員要控制時間。
咱們常見的代碼以下:
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去格式化代碼。
代碼從新格式化後效果以下:
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)); } }
在碼雲上把本身的學習搭檔加入本身的項目中,確認搭檔的項目加入本身後,下載搭檔實驗二的Complex代碼,加入很多於三個JUnit單元測試用例,測試成功後git add .; git commit -m "本身學號 添加內容";git push;
完成重構內容的練習,下載搭檔的代碼,至少進行三項重構,提交重構後代碼的截圖,加上本身的學號水印。提交搭檔的碼雲項目連接。
以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準。提交學習成果碼雲連接和表明性成果截圖,要有學號水印。
搭檔代碼:
import java.lang.Integer; import java.util.Objects; public class Complex { //定義屬性並生成getter,setter double RealPart; double ImagePart; public double getRealPart(){ return RealPart; } public double getImagePart(){ return ImagePart; } //定義構造函數 public Complex(){ RealPart = 0; ImagePart = 1; } public Complex(double R,double I){ RealPart = R; ImagePart = I; } //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; } public String toString(){ String s = new String(); if (ImagePart > 0){ s = getRealPart() + "+" + getImagePart() + "i"; } if (ImagePart == 0){ s = getRealPart() + ""; } if(ImagePart < 0){ s = getRealPart() + "" + getImagePart() + "i"; } if(RealPart == 0){ s = getImagePart() + "i"; } return s; } //定義公有方法:加減乘除 Complex ComplexAdd(Complex a){ return new Complex(RealPart + a.RealPart,ImagePart + a.ImagePart); } Complex ComplexSub(Complex a){ return new Complex(RealPart - a.RealPart,ImagePart - a.ImagePart); } Complex ComplexMulti(Complex a){ return new Complex(RealPart*a.RealPart-ImagePart*a.ImagePart,RealPart*a.ImagePart + ImagePart*a.RealPart); } Complex ComplexDiv(Complex a) { return new Complex((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart), (ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart)); } }
import static org.junit.Assert.*; import org.junit.Test; import junit.framework.TestCase; public class ComplexTest extends TestCase { Complex complex = new Complex(1,1); @Test public void testAdd(){ assertEquals(new Complex(3.3,3.4), complex.ComplexAdd(new Complex(2.3,2.4))); } //測試加法 @Test public void testSub(){ assertEquals(new Complex(-5.3,-2.4), complex.ComplexSub(new Complex(6.3,3.4))); } //測試減法 @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))); //assertEquals(new Complex(0.0,0.0), complex.ComplexDiv(new Complex(3,4))); //邊緣測試 } @Test public void testequals(){ assertEquals(true, complex.equals(new Complex(1.0,1.0))); } //測試判斷相等 }
$ cd /home/shiyanlou/Code/shiyanlou_cs212 # 修改代碼文件 # 添加修改文件 $ git add 全部修改的文件 # 提交到環境中本地代碼倉庫 $ git commit -m '本次修改的描述' # push到git.shiyanlou.com,無需輸入密碼 $ git push
重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。重構最主要的目標就是清楚「有臭味道」的代碼,主要表現爲重複代碼。
咱們仍以搭檔的complex爲例:
-如圖選擇重構項目:
重構結果以下:
import java.sql.SQLOutput; public class vigenere { //輸入明文和密鑰,用輸入的密鑰對明文進行加密 public static void main(String[] args) { int i,j,sum,o; double q,w; int e=0; double rate; char[] c = new char[300]; char[] k1 = new char[300]; char[] k2=new char[100]; char word='a'; for (i=0;i<26;i++) { k2[i]=word; word++; } //輸入 System.out.print("enter a mingwen string:"); String m = MyInput.readString(); System.out.print("enter a key string:"); String k = MyInput.readString(); //構造密鑰對照表 for (i = 0; i < k.length(); i++) { if (k.charAt(i) >= 'a' && k.charAt(i) <= 'z') k1[i] = (char) (k.charAt(i) - 97); if (k.charAt(i) >= 'A' && k.charAt(i) <= 'Z') k1[i] = (char) (k.charAt(i) - 65); } //加密 for (i = 0; i < m.length(); i++) { if (m.charAt(i) >= 'a' && m.charAt(i) <= 'z') c[i] = (char) ((m.charAt(i) - 97 + k1[i % k.length()]) % 26 + 97); if (m.charAt(i) >= 'A' && m.charAt(i) <= 'Z') c[i] = (char) ((m.charAt(i) - 65 + k1[i % k.length()]) % 26 + 65); } //計算密文長度 o=i; System.out.println("密文單詞個數爲"+o); System.out.print("密文爲"); //輸出密文 for (i = 0; i < c.length; i++) { System.out.print(c[i]); } System.out.println(); System.out.println("如下是各字母出現的頻率"); //計算每一個字母出現的次數和頻率 for(j=0;j<=25;j++){ for(i=0;i<o;i++){ if(c[i]==k2[j]){ e++; } } System.out.printf(k2[j]+"出現次數爲"+e); q=e; w=o; rate=(q/w)*100; System.out.println("頻率爲"+rate+"%"); e=0; } //計算重合指數 for(i=0;i<o;i++){ for(j=1;j<o;j++){ if(c[i]==c[j]){ e++; } } } q=e; sum=0; for(i=o;i>0;i--){ sum=i+sum; } w=sum; rate=(q/w)*100; System.out.println("重合指數爲"+rate+"%"); } }
import java.io.*; public class MyInput { public static String readString() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1); String string = ""; try { string = br.readLine(); } catch (IOException ex) { System.out.println(ex); } return string; } }
截圖:
運行結果已放在藍墨雲中。
結果發現是本身粘貼的有點過了....
已解決:
步驟 | 耗時 | 百分比 |
---|---|---|
需求分析 | 20min | 12.5% |
設計 | 25min | 15.6% |
代碼實現 | 60min | 37.5% |
測試 | 35min | 21.9% |
分析總結 | 20min | 12.5% |
首先,結對學習真的很棒,還很省心。
其次,經過此次實驗,咱們都簡單瞭解了Java實現密碼學算法的方式,因爲Java龐大的通用API積累,使用起來確實比C語言這種面向過程的語言方便了很多。
最後,附:20165213-周啓航博客連接