2018-2019-2 20175227張雪瑩《Java程序設計》實驗三 《敏捷開發與XP實踐》

2018-2019-2 20175227張雪瑩《Java程序設計》

實驗三 《敏捷開發與XP實踐》

實驗報告封面

  • 課程:Java程序設計 班級:1752班 姓名:張雪瑩 學號:20175227
  • 指導教師:婁嘉鵬 實驗日期:2019年4月29日
  • 實驗時間:--- 實驗序號:實驗三
  • 實驗名稱:敏捷開發與XP實踐
  • 實驗題目
  • 實驗要求
    • 完成實驗三 敏捷開發與XP實踐中的內容,參考Java密碼學算法相關內容
    • 其中Eclipse相關的內容參考Intellj IDEA簡易教程換成IDEA實現
    • 完成雲班課中的檢查點,也能夠先完成實驗報告,直接提交。注意不能只有截圖,要有知識點,原理,遇到的問題和解決過程等說明。實驗報告中一個檢查點要有多張截圖。
    • 發表實驗報告博客,標題「學期(如2018-2019-2) 學號(如20175300)實驗三《敏捷開發與XP實踐》實驗報告」

實驗步驟

  • 代碼規範
    • 要求:
      • 敏捷開發與XP實踐 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的內容替換成IDEA
      • 參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安裝alibaba 插件,解決代碼中的規範問題。
      • 在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));
      }
      }
    • IDEA中的插件,經過Jetbrains官方倉庫安裝:打開 Settings ->Plugins -> Marketplace在搜索框輸入alibaba便可看到Alibaba Java Code Guidelines插件,點擊Install進行安裝,而後重啓IDE生效:
      html

    • 在項目名稱上單擊右鍵,在彈出菜單上選擇編碼規約掃描
    • 在IDEA中使用工具(Code->Reformate Code)把下面代碼從新格式化
    • 下面簡單介紹一下Code菜單中選項的簡單用法:
      • Override Methods:重載方法/新建方法
      • Implement Methods:執行方法
      • Generate:建立類裏面任何字段的getter與setter方法
      • Surround with:將某條語句被if、for等等封裝語句括起
      • Move Statement Down/up:將語句下移到後一模塊以後
      • Move line down:調換語句順序
      • Comment with Line/Block Comment:兩種註釋
      • Reformat Code:將代碼按標準格式縮進
  • 結對編程
    • 要求:
      • 在碼雲上把本身的學習搭檔加入本身的項目中,確認搭檔的項目加入本身後,下載搭檔實驗二的Complex代碼,加入很多於三個JUnit單元測試用例,測試成功後git add .; git commit -m "本身學號 添加內容";git push;
      • 提交搭檔項目git log的截圖,包含上面git commit的信息,並加上本身的學號水印信息。
    • 結對編程是XP中的重要實踐。在結對編程模式下,一對程序員肩並肩、平等地、互補地進行開發工做。
    • 結對編程中有兩個角色:
      • 駕駛員(Driver)是控制鍵盤輸入的人。
      • 領航員(Navigator)起到領航、提醒的做用。
    • 邀請結對夥伴加入本身的倉庫
      • 打開本身的碼雲項目
      • 點擊管理->倉庫成員管理->添加倉庫成員->邀請用戶

  • 打開虛擬機,輸入git clone 搭檔碼雲連接
  • 轉到要添加代碼的搭檔目錄下進行atom Complex.javaatom ComplexTest.java

  • Complex代碼爲:
/**
 @author Xueying Zhang 20175227
 @date 2019/4/29 12:49.
*/
public class Complex{
   private double a;
   private double b;

   public Complex(double a, double b) {
       this.a = a;
       this.b = b;
   }

   public static double getRealPart(double a) {
       return a;
   }

   public static double getImagePart(double b) {
       return b;
   }

   public Complex ComplexAdd(Complex c) {
       return new Complex(a + c.a, b + c.b);
   }
   public Complex ComplexSub(Complex c) {
       return new Complex(a - c.a, b - c.b);
   }
   public Complex ComplexMulti(Complex c) {
       return new Complex(a * c.a - b * c.b, a * c.b + b * c.a);
   }
   public Complex ComplexDiv(Complex c) {
       return new Complex((a * c.b + b * c.a)/(c.b * c.b + c.a * c.a), (b * c.b + a * c.a)/(c.b * c.b + c.a * c.a));
   }

   public String toString() {
       String s = " ";
       if (b > 0) {
           s =  a + "+" + b + "i";
       }
       if (b == 0) {
           s =  a + "";
       }
       if (b < 0) {
           s = a + " " + b + "i";
       }
       return s;
   }
}
  • 須要測試的方法有:getRealPartgetImagePartComplexAddComplexSubComplexMultiComplexDiv
  • 測試代碼以下:
import junit.framework.TestCase;
import org.junit.Test;

public class ComplexTest extends TestCase {
   Complex com1=new Complex(1.0,2.0);
   Complex com2=new Complex(0.0,1.0);
   Complex com3=new Complex(1.0,0.0);
   Complex com4=new Complex(-1.0,-2.0);

   public void testgetRealPart()throws Exception{//測試getRealPart方法
       assertEquals(2.7,Complex.getRealPart(2.7));
       assertEquals(-2.7,Complex.getRealPart(-2.7));
       assertEquals(5.0,Complex.getRealPart(5.0));
       assertEquals(0.0,Complex.getRealPart(0.0));
   }
   public void testgetImagePart()throws Exception{//測試getImagePart方法
       assertEquals(2.7,Complex.getImagePart(2.7));
       assertEquals(-2.7,Complex.getImagePart(-2.7));
       assertEquals(5.0,Complex.getImagePart(5.0));
       assertEquals(0.0,Complex.getImagePart(0.0));
   }
   public void testComplexAdd()throws Exception{//測試ComplexAdd方法
       assertEquals("1.0+3.0i",com1.ComplexAdd(com2).toString());
       assertEquals("2.0+2.0i",com1.ComplexAdd(com3).toString());
       assertEquals("1.0+1.0i",com2.ComplexAdd(com3).toString());
       assertEquals("0.0",com1.ComplexAdd(com4).toString());
   }
   public void testComplexSub()throws Exception{//測試ComplexSub方法
       assertEquals("1.0+1.0i",com1.ComplexSub(com2).toString());
       assertEquals("0.0+2.0i",com1.ComplexSub(com3).toString());
       assertEquals("-1.0+1.0i",com2.ComplexSub(com3).toString());
       assertEquals("2.0+4.0i",com1.ComplexSub(com4).toString());
   }
   public void testComplexMulti()throws Exception{//測試ComplexMulti方法
       assertEquals("-2.0+1.0i",com1.ComplexMulti(com2).toString());
       assertEquals("1.0+2.0i",com1.ComplexMulti(com3).toString());
       assertEquals("0.0+1.0i",com2.ComplexMulti(com3).toString());
       assertEquals("3.0 -4.0i",com1.ComplexMulti(com4).toString());
   }
   public void testComplexDiv()throws Exception{//測試ComplexDiv方法
       assertEquals("1.0+2.0i",com1.ComplexDiv(com2).toString());
       assertEquals("2.0+1.0i",com1.ComplexDiv(com3).toString());
       assertEquals("1.0",com2.ComplexDiv(com3).toString());
       assertEquals("-0.8 -1.0i",com1.ComplexDiv(com4).toString());
   }
}
  • 運行示例(此處由虛擬機中atom更改成windows中IDEA編寫,由於方便運用junit單元測試)以下:
    java

  • 上傳至碼雲:
  • 重構
    • 要求
      • 實驗三 敏捷開發與XP實踐 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的內容替換成IDEA
      • 完成重構內容的練習,下載搭檔的代碼,至少進行三項重構,提交重構後代碼的截圖,加上本身的學號水印。提交搭檔的碼雲項目連接。
    • 概念:重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。
    • 前提:不改變軟件外部行爲;來確保重構的安全
    • 如何作到不改變軟件外部行爲?
      • 重構後的代碼要能經過單元測試
    • 修改軟件的四種動機:
      • 增長新功能;
      • 原有功能有BUG;
      • 改善原有程序的結構;
      • 優化原有系統的性能 。
    • 臭味道(Bad Smell)的代碼及其重構方法:
  • 完整的重構流程:
    • 從版本控制系統代碼庫中Check out code
    • 讀懂代碼(包括測試代碼)
    • 發現bad smell
    • Refactoring
    • 運行全部的Unit Tests
    • 往代碼庫中Check in code
  • 練習:
  • 重構前代碼:git

class XiyoujiRenwu{
        float height,weight;
        String head,ear;
        void speak(String s){
            head ="歪着頭";
            System.out.println(s);
        }
    }
    public class Example4_3{
        public static void main(String args[]){
            XiyoujiRenwu zhubajie,sunwukong;
            zhubajie = new XiyoujiRenwu();
            sunwukong = new XiyoujiRenwu();
            zhubajie.height = 1.80f;
            zhubajie.head = "大頭";
            zhubajie.ear = "一雙大耳朵";
            sunwukong.height = 1.62f;
            sunwukong.weight = 1000f;
            sunwukong.head = "秀髮飄飄";
            System.out.println("zhubajie的身高"+zhubajie.height);
            System.out.println("zhubajie的頭"+zhubajie.head);
            System.out.println("sunwukong的重量"+sunwukong.height);
            System.out.println("sunwukong.head"+sunwukong.head);
            zhubajie.speak("俺老豬我想娶媳婦");
            System.out.println("zhubajie如今的頭:"+zhubajie.head);
            sunwukong.speak("老孫我重1000斤,我想騙豬八戒揹我");
            System.out.println("sunwukong如今的頭:"+sunwukong.head);
        }
    }
  • 代碼中存在的問題:
    • 類命名方法未遵照駝峯規則
    • 成員變量未封裝
    • 類中方法未封裝
  • 重構後代碼

  • Java密碼學算法
    • 要求
      • 參考 http://www.cnblogs.com/rocedu/p/6683948.html,以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準。
      • 提交學習成果碼雲連接和表明性成果截圖,要有學號水印。
    • 安全問題能夠歸結爲安全的三個屬性(CIA金三角):
      • 機密性(Confidentiality)
      • 完整性(Integrity)
      • 可用性(Availability)
    • 密碼學: 主要是研究保密通訊和信息保密的學科, 包括信息保密傳輸和信息加密存儲等。密碼學包含密碼編碼學( Cryptography) 和密碼分析學(Cryptanalyst) 兩個分支。
    • 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平臺上進行用戶身份鑑別的功能。
    • 我與結對夥伴共同編寫凱撒密碼加解密算法代碼以下:
      • 初始代碼:
  • 規範代碼程序員

  • 代碼爲:算法

  • Caesar.java
/**
 * @author Xueying Zhang 20175227
 * @date 2019/4/29 19:46.
 */


public class Caesar {
    public static void main(String args[]) throws Exception{
        String s=args[0];
        int key=Integer.parseInt(args[1]);
        Movement m=new Movement();
        int n=s.length();
        String es="";
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(c >= 'a' && c <= 'z'){
                es=m.realizeMove(n,c,key,'a','z');
            }
            else if (c >= 'A' && c <= 'Z'){
                es=m.realizeMove(n,c,key,'A','Z');
            }
        }
        System.out.println(es);
    }
}
  • Movement.java
/**
 * @author Xueying Zhang 20175227
 * @date 2019/4/29 20:33.
 */
public class Movement {
    String es="";
    public  String  realizeMove(int n,char c,int key,char a,char b){
             //移動key%26位
             c+=key%26;
             if(c<a) {
                 c+=26;
                 //向左超界
             }
             if(c>b) {
                 c-=26;
                 //向右超界
             }
             es+=c;
         return es;
    }
}

  • 運行結果

實驗中遇到的問題和解決過程

  • 問題1:在實現第一步代碼規範時,下面提示須要註釋做者信息,我以前並無設置過,因而出現了上文截圖中系統默認的做者信息。
  • 問題1解決辦法:在IDEA中選Settings->Editor->File and Code Templates->Class在程序框中輸入:
/**
       *@author xxx
       *@date ${DATE} ${TIME}.
       */

再次從新新建class就能看見有做者信息註釋了:編程

感悟和收穫

  • 經過本次實驗,學習瞭如何使代碼規範,代碼重構,Java中密碼算法的實現等內容。
  • 我意識到平時本身的編程中有不少不規範的地方和缺乏註釋的地方,注意這些方面可使本身的程序可讀性更高。
  • 實驗二時,老師教授了不少關於編程的原則,使得個人思惟從會編程到便好程,可是對於更改「bad smell」程序時,在不知道可使用代碼重構的狀況下,這個任務會顯得很麻煩,重複工做不少;在這次實驗事後,有了效率更高的辦法解決該問題,同時也感覺到了IDEA功能的強大。
  • 本次實驗還get了碼雲倉庫新技能,能夠在倉庫中添加成員,這對於結對編程來講很方便,必定程度上提升告終對編程效率。

代碼託管

參考資料

  • https://blog.csdn.net/weixin_42254058/article/details/81219931
相關文章
相關標籤/搜索