2017-2018-2 20165318 實驗三《Java面向對象程序設計》實驗報告

2017-2018-2 20165318 實驗三《Java面向對象程序設計》實驗報告

1、實驗報告封面

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

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

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

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

實驗內容算法

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

實驗要求編程

  1. 沒有Linux基礎的同窗建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
  2. 完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如「查網絡」、「問同窗」、「看書」等一概得0分)以及分析(從中能夠獲得什麼啓示,有什麼收穫,教訓等)。報告能夠參考範飛龍老師的指導
  3. 嚴禁抄襲,有該行爲者實驗成績歸零,並附加其餘懲罰措施。

2、實驗內容及步驟

<a name="FHML"></a>安全

目錄

<a name="1"></a>

(一)編碼標準

  • 安裝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));
        }
    }
}

返回目錄

<a name="1.1"></a>

任務一:在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:將某行、表達式向下、向上移動一行

返回目錄

<a name="2"></a>

(二)敏捷開發與XP

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

<a name="2.1"></a>

任務二:下載搭檔實驗二的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());
    }
}

返回目錄

<a name="3"></a>

(三)重構

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

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

  • 增長新功能;
  • 原有功能有BUG;
  • 改善原有程序的結構;
  • 優化原有系統的性能 。

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

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

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

<a name="3.1"></a>

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

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

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

程序修改入下:

返回目錄

<a name="4"></a>

練習

<a name="4.1"></a>

任務四:以結對的方式完成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算法

返回目錄

<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>

PSP需求分析

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

<a name="9"></a>

參考資料

Java 密碼學算法——婁老師的博客 實驗三 敏捷開發與XP實踐——婁老師的博客 Java代碼重構的幾種模式詳解 java 代碼重構(系列講解) IntelliJ IDEA使用技巧一覽表 返回目錄

相關文章
相關標籤/搜索