2017-2018-2 20165318 實驗三《Java物件導向程式設計》實驗報告

來源:互聯網
上載者:User

標籤:網路通訊   ref   規約   百分比   方式   ctrl   欄位   步驟   自訂異常類   

2017-2018-2 20165318 實驗三《Java物件導向程式設計》實驗報告一、實驗報告封面

課程:Java程式設計        班級:1653班        姓名:孫曉暄        學號:20165318

指導教師:婁嘉鵬                              實驗日期:2018年4月27日

實驗時間:13:45 - 3:25                    實驗序號:實驗三

實驗名稱:敏捷開發與XP實踐

實驗內容

  1. XP基礎
  2. XP核心實踐
  3. 相關工具

實驗要求

  1. 沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
  2. 完成實驗、撰寫實驗報告,實驗報告以部落格方式發表在部落格園,注意實驗報告重點是運行結果,遇到的問題(工具尋找,安裝,使用,程式的編輯,調試,運行等)、解決辦法(空洞的方法如“查網路”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什麼啟示,有什麼收穫,教訓等)。報告可以參考範飛龍老師的指導
  3. 嚴禁抄襲,有該行為者實驗成績歸零,並附加其他懲罰措施。
二、實驗內容及步驟

目錄
  • (一)編碼通訊協定
    • 任務一:在IDEA中使用工具(Code->Reformate Code)格式化代碼,並學習Code菜單的功能
  • (二)敏捷開發與XP
    • 任務二:下載搭檔實驗二的Complex代碼,加入不少於三個JUnit單元測試用例
  • (三)重構
    • 任務三:下載搭檔的代碼,至少進行三項重構
  • (四)練習
    • 任務四:以結對的方式完成Java密碼學相關內容的學習,結合重構、git、代碼標準等
  • (五)實驗過程中遇到的問題及解決方案
  • (六)實驗體會與總結
  • (七)代碼託管
  • (八)PSP需求分析
  • 參考資料

(一)編碼通訊協定
  • 安裝alibaba 外掛程式,解決代碼中的規範問題。具體流程如下:
  1. 開啟 Settings -> Plugins -> Browse repositories...

  2. 在搜尋方塊輸入alibaba即可看到Alibaba Java Code Guidelines外掛程式,點擊Install進行安裝,然後重啟IDE生效:

  3. 使用比較簡單:在項目名稱上單擊右鍵,在快顯功能表上選擇編碼規約掃描

出現內容:

不規範的地方,有中文提示並且定位到了行,alibaba把問題分為block/critical/major三個等級,有些規則可以一鍵修複。

Java中的一般的命名規則有:

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

規範後的代碼格式

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));        }    }}

返回目錄

任務一:在IDEA中使用工具(Code->Reformate Code)格式化代碼,並學習Code菜單的功能

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:將某行、運算式向下、向上移動一行

返回目錄

(二)敏捷開發與XP

結對程式設計是XP中的重要實踐。在結對程式設計模式下,一對程式員肩並肩、平等地、互補地進行開發工作。他們並排坐在一台電腦前,面對同一個顯示器,使用同一個鍵盤、同一個滑鼠一起工作。他們一起分析,一起設計,一起寫測試案例,一起編碼,一起做單元測試,一起做整合測試,一起寫文檔等。
--引用自實驗三 敏捷開發與XP實踐

任務二:下載搭檔實驗二的Complex代碼,加入不少於三個JUnit單元測試用例

搭檔的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());    }}

返回目錄

(三)重構

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

我們要修改軟體,萬變不離其宗,無非就是四種動機:

  • 增加新功能;
  • 原有功能有BUG;
  • 改善原有程式的結構;
  • 最佳化原有系統的效能 。

需要重構的地方:
代碼重複、方法過長、參數列過長、條件邏輯過度複雜、分支語句

一個完整的重構流程包括:

  1. 從版本控制系統程式碼程式庫中Check out code
  2. 讀懂代碼(包括測試代碼)
  3. 發現bad smell
  4. Refactoring
  5. 運行所有的Unit Tests
  6. 往程式碼程式庫中Check in code

任務三:下載搭檔的代碼,至少進行三項重構

如上代碼存在以下幾個問題:

  • 類名不符合命名規則;
  • 類中變數沒有被封裝;
  • 方法沒有被封裝;

程式修改入下:

返回目錄

練習

任務四:以結對的方式完成Java密碼學相關內容的學習,結合重構、git、代碼標準等

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方法傳入參數參數判斷,是否有非法輸入,若有,拋出異常進行加解密,大小寫區分輸出結果
  • 產品代碼:
    Caesaar.java

    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演算法

  • 檔案key1.dat中產生的密鑰

  • 儲存密鑰編碼並列印

  • 用DESede加密

  • 用DESede解密

RSA加密

RSA解密

MD5演算法

返回目錄

(五)實驗過程中遇到的問題及解決方案
  • Q1:在做重構相關內容的實驗時,由於對重構的內容並不是非常瞭解,小夥伴的代碼也大都是書上的代碼,找了好多,都沒有發現太多需要重構的地方。

  • 解決方案:在學習了實驗三 敏捷開發與XP實踐——婁老師的部落格,以及參考了Java代碼重構的幾種模式詳解
    java 代碼重構(系列講解)後,我再次查看夥伴的代碼,找到了幾處可以規範的地方。

  • Q2:在編譯運行MD5演算法時,出現以下問題

  • 解決方案:通過alibaba編碼掃描,我發現是代碼中有一處“;”使用成了中文的“;”導致編碼錯誤,改正該錯誤後,代碼就可以正常運行了。

返回目錄

(六)實驗體會與總結

通過本次實驗,我主要學習到了代碼標準,代碼重構,Java中密碼學演算法等內容。

代碼標準和重構的學習,使我注意到自己之前編寫代碼時的很多不規範之處,而且通過使用alibaba的即時編碼掃描,使我在編寫代碼的同時,注意規範代碼的標準格式,使寫出的代碼更加明了可觀,類名和變數名的規範,也使我在編寫代碼時,減少了許多不必要的注釋。

有了之前四則運算結對程式設計的鍛煉,在本次實驗過程中,我與我的小夥伴合作的比較融洽,節約了一些不必要的時間,結對程式設計效率有了一定的提高。

返回目錄

代碼託管

我的碼雲地址
搭檔的碼雲地址

PSP需求分析
步驟 耗時 百分比
需求分析 10min 6%
設計 20min 11%
代碼實現 70min 40%
測試 20min 13%
分析總結 50min 30%

參考資料

Java 密碼學演算法——婁老師的部落格
實驗三 敏捷開發與XP實踐——婁老師的部落格
Java代碼重構的幾種模式詳解
java 代碼重構(系列講解)
IntelliJ IDEA提示一覽表
返回目錄

2017-2018-2 20165318 實驗三《Java物件導向程式設計》實驗報告

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.