實驗三 敏捷開發與XP實踐

20155224 實驗三 敏捷開發與XP實踐 實驗報告


實驗報告封面:

課程: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));
        }
    }

image

  • 其實idea還有不少十分實用的功能,如:Surround With(Ctrl+Alt+T):可以使用if-else、try-catch、do-while等包裝代碼段,極大地簡化了咱們的編程時間:

image

(二)敏捷開發與XP

  • 在碼雲上把本身的學習搭檔加入本身的項目中,確認搭檔的項目加入本身後,下載搭檔實驗二的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)));
    }
    //測試判斷相等
}
  • 測試結果以下:

image

  • 搭檔加入碼雲項目:

image

  • git命令上傳代碼:
$ cd /home/shiyanlou/Code/shiyanlou_cs212
# 修改代碼文件
# 添加修改文件
$ git add 全部修改的文件
# 提交到環境中本地代碼倉庫
$ git commit -m '本次修改的描述'
# push到git.shiyanlou.com,無需輸入密碼
$ git push
  • 碼雲上傳截圖:

image

(三)重構

  • 重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。重構最主要的目標就是清楚「有臭味道」的代碼,主要表現爲重複代碼。

  • 咱們仍以搭檔的complex爲例:

-如圖選擇重構項目:

image

重構結果以下:

image

(四)練習

  • 維吉尼亞密碼:
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;
    }
}
  • 截圖:
    image

  • 運行結果已放在藍墨雲中。

(五)實驗過程當中遇到的問題及解決

  • clone鏈接超時:

image

  • 結果發現是本身粘貼的有點過了....

  • 已解決:

image

(六)PSP(Personal Software Process)時間

步驟 耗時 百分比
需求分析 20min 12.5%
設計 25min 15.6%
代碼實現 60min 37.5%
測試 35min 21.9%
分析總結 20min 12.5%

心得體會:

  • 首先,結對學習真的很棒,還很省心。

  • 其次,經過此次實驗,咱們都簡單瞭解了Java實現密碼學算法的方式,因爲Java龐大的通用API積累,使用起來確實比C語言這種面向過程的語言方便了很多。

  • 最後,附:20165213-周啓航博客連接

相關文章
相關標籤/搜索