課程:Java程序設計 班級:1653班 姓名:孫曉暄 學號:20165318html
指導教師:婁嘉鵬 實驗日期:2018年4月27日java
實驗時間:13:45 - 3:25 實驗序號:實驗三git
實驗名稱:敏捷開發與XP實踐程序員
實驗內容:算法
實驗要求:編程
<a name="FHML"></a>安全
(一)編碼標準網絡
(二)敏捷開發與XPapp
(三)重構框架
<a name="1"></a>
打開 Settings
-> Plugins
-> Browse
repositories
...
在搜索框輸入alibaba
便可看到Alibaba Java Code Guidelines
插件,點擊Install
進行安裝,而後重啓IDE生效:
使用比較簡單:在項目名稱上單擊右鍵,在彈出菜單上選擇編碼規約掃描
:
出現下圖內容:
不規範的地方,有中文提示而且定位到了行,alibaba把問題分爲block/critical/major
三個等級,有些規則能夠一鍵修復。
Java中的通常的命名規則有:
規範後的代碼格式
import java.util.concurrent.Callable; 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)); } } }
<a name="1.1"></a>
IDEA中的Code菜單以下:
幾個比較經常使用的功能總結以下:
Override Methods
(Ctrl+O):重載基本類的方法;Implement Methods
(Ctrl+I):完成當前類 implements 的(或者抽象基本類的)接口的方法; Generate(Alt+Insert):建立類裏面任何字段的 getter 與 setter 方法;
Surround With
(Ctrl+Alt+T):使用if-else、try-catch、do-while等包裝代碼段;
Insert Live Template
(Ctrl-J):執行一些記不起來的 Live Template 縮寫;
Comment with Line Comment
(Ctrl+斜槓)/Comment with Block Comment
(Ctrl+Shift+斜槓):用 Ctrl+斜槓 與 Ctrl-Shift-/ 來註釋(或反註釋)代碼行與代碼塊。 用Ctrl+斜槓單行註釋標記(「 //… 」)來註釋(或反註釋)當前行或者選擇地代碼塊。而 Ctrl+Shift+斜槓則能夠用塊註釋標記(「 /* */」)把所選塊包圍起來。要反註釋一個代碼塊就在塊中任何一個地方按 Ctrl+Shift+斜槓 便可;
Reformat Code
(Ctrl+Alt+L):將代碼按標準格式縮進;
show reformat file dialog
:按照格式自動對齊
Optimize imports
:能夠優化imports,去除沒必要要的imports
Move Line/statement Down/Up
:將某行、表達式向下、向上移動一行
<a name="2"></a>
結對編程是XP中的重要實踐。在結對編程模式下,一對程序員肩並肩、平等地、互補地進行開發工做。他們並排坐在一臺電腦前,面對同一個顯示器,使用同一個鍵盤、同一個鼠標一塊兒工做。他們一塊兒分析,一塊兒設計,一塊兒寫測試用例,一塊兒編碼,一塊兒作單元測試,一塊兒作集成測試,一塊兒寫文檔等。 --引用自實驗三 敏捷開發與XP實踐
<a name="2.1"></a>
搭檔的Complex代碼以下:
須要測試的方法有:ComplexAdd()
,ComplexSub()
,ComplexMulti()
,ComplexDiv()
; 編寫測試代碼並上傳到搭檔碼雲項目上:
import junit.framework.TestCase; import org.junit.Test; import static org.junit.Assert.*; /** * Created by sxx on 2018/4/26. */ public class ComplexTest extends TestCase { Complex c1 = new Complex(0.0, 2.0); Complex c2 = new Complex(-1.0, -1.0); Complex c3 = new Complex(1.0,2.0); @Test public void testgetRealpart() throws Exception{ assertEquals(0.0,Complex.getRealPart(0.0)); assertEquals(-1.0,Complex.getRealPart(-1.0)); assertEquals(1.0,Complex.getRealPart(1.0)); } @Test public void testgetImagePart() throws Exception{ assertEquals(2.0,Complex.getImagePart(2.0)); assertEquals(-1.0,Complex.getImagePart(-1.0)); assertEquals(2.0,Complex.getImagePart(2.0)); } @Test public void testComplexAdd() throws Exception{ assertEquals("-1.0+1.0i",c1.ComplexAdd(c2).toString()); assertEquals("1.0+4.0i",c1.ComplexAdd(c3).toString()); assertEquals("0.0+1.0i",c2.ComplexAdd(c3).toString()); } @Test public void testComplexSub() throws Exception{ assertEquals("1.0+3.0i",c1.ComplexSub(c2).toString()); assertEquals("-1.0",c1.ComplexSub(c3).toString()); assertEquals("-2.0-3.0i",c2.ComplexSub(c3).toString()); } @Test public void testComplexMulti() throws Exception{ assertEquals("2.0-2.0i",c1.ComplexMulti(c2).toString()); assertEquals("-4.0+2.0i",c1.ComplexMulti(c3).toString()); assertEquals("1.0-3.0i",c2.ComplexMulti(c3).toString()); } @Test public void testComplexDiv() throws Exception{ assertEquals("-1.0-1.0i",c1.ComplexDiv(c2).toString()); assertEquals("0.4+0.8i",c1.ComplexDiv(c3).toString()); assertEquals("-0.6-0.6i",c2.ComplexDiv(c3).toString()); } }
<a name="3"></a>
重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。
咱們要修改軟件,萬變不離其宗,無非就是四種動機:
須要重構的地方: 代碼重複、方法過長、參數列過長、條件邏輯過分複雜、分支語句
一個完整的重構流程包括:
<a name="3.1"></a>
如上代碼存在如下幾個問題:
程序修改入下:
<a name="4"></a>
<a name="4.1"></a>
Java安全體系結構總共分爲4個部分:
JCA( Java Cryptography Architecture, Java加密體系結構):JCA提供基本的加密框架, 如證書、 數字簽名、消息摘要和密鑰對產生器。
JCE( Java Cryptography Extension, Java加密擴展包):JCE在JCA的基礎上做了擴展, 提供了各類加密算法、 消息摘要算法和密鑰管理等功能。JCE的實現主要在javax.crypto包( 及其子包) 中
JSSE( Java Secure Sockets Extension, Java安全套接字擴展包):JSSE提供了基於SSL( Secure Sockets Layer,安全套接字層) 的加密功能。 在網絡的傳輸過程當中, 信息會通過多個主機(頗有可能其中一臺就被竊聽) , 最終傳送給接收者, 這是不安全的。這種確保網絡通訊安全的服務就是由JSSE來提供的。
JAAS( Java Authentication and Authentication Service, Java鑑別與安全服務):JAAS提供了在Java平臺上進行用戶身份鑑別的功能。
進行了學習以後,我與搭檔選擇了實現凱撒密碼的加解密算法,並以結對的方式完成了代碼編寫的工做。
凱撒密碼算法:將字母表中的字母移動必定位置而實現加密。
具體步驟: (1)根據凱撒密碼特性設計算法 (2)傳入須要計算的字符串 (3)處理計算結果
僞代碼:
定義main方法 傳入參數 參數判斷,是否有非法輸入,如有,拋出異常 進行加解密,大小寫區分 輸出結果
public class Caesar { public static void main(String[] args) throws EadException { String s = args[0]; int key = Integer.parseInt(args[1]); String es = ""; for (int i = 0; i < (s.length()); i++) { char c = s.charAt(i); //自定義異常類 try { boolean exist = ((c > 64) && (c < 91)) || ((c > 96) && (c < 123) || c == 32 || c == 33); if (exist == false) { throw new EadException(s); } } catch (EadException e) { System.out.println(e.warnMess()); } //小寫字母 if (c >= 'a' && c <= 'z') { //移動key%26位 c += key % 26; //向左超界 if (c < 'a') { c += 26; } //向右超界 if (c > 'z') { c -= 26; } } //大寫字母 else if (c >= 'A' && c <= 'Z') { c += key % 26; if (c < 'A') { c += 26; } if (c > 'Z') { c -= 26; } } es += c; } System.out.println(es); } }
EadException.java
public class EadException extends Exception{ String message; public EadException(String sourceString){ message = "The input is not correct"; } public String warnMess(){ return message; } }
最初代碼:
運行結果:
代碼規範截圖:
重構截圖:
除了實現凱撒密碼算法以外,我還運行了其餘算法:
DES算法
RSA加密
RSA解密
MD5算法
<a name="5"></a>
**Q1:**在作重構相關內容的實驗時,因爲對重構的內容並非很是瞭解,小夥伴的代碼也大都是書上的代碼,找了好多,都沒有發現太多須要重構的地方。
**解決方法:**在學習了實驗三 敏捷開發與XP實踐——婁老師的博客,以及參考了Java代碼重構的幾種模式詳解 java 代碼重構(系列講解)後,我再次查看夥伴的代碼,找到了幾處能夠規範的地方。
**Q2:**在編譯運行MD5算法時,出現如下問題
**解決方法:**經過alibaba編碼掃描,我發現是代碼中有一處「;」使用成了中文的「;」致使編碼錯誤,改正該錯誤後,代碼就能夠正常運行了。
<a name="6"></a>
經過本次實驗,我主要學習到了代碼標準,代碼重構,Java中密碼學算法等內容。
代碼標準和重構的學習,使我注意到本身以前編寫代碼時的不少不規範之處,並且經過使用alibaba的實時編碼掃描,使我在編寫代碼的同時,注意規範代碼的標準格式,使寫出的代碼更加明瞭可觀,類名和變量名的規範,也使我在編寫代碼時,減小了許多沒必要要的註釋。
有了以前四則運算結對編程的鍛鍊,在本次實驗過程當中,我與個人小夥伴合做的比較融洽,節約了一些沒必要要的時間,結對編程效率有了必定的提升。
<a name="7"></a>
<a name="8"></a>
步驟 | 耗時 | 百分比 |
---|---|---|
需求分析 | 10min | 6% |
設計 | 20min | 11% |
代碼實現 | 70min | 40% |
測試 | 20min | 13% |
分析總結 | 50min | 30% |
<a name="9"></a>
Java 密碼學算法——婁老師的博客 實驗三 敏捷開發與XP實踐——婁老師的博客 Java代碼重構的幾種模式詳解 java 代碼重構(系列講解) IntelliJ IDEA使用技巧一覽表 返回目錄