20169219 實驗二 Java面向對象程序設計

實驗二 Java面向對象程序設計

1、程序設計中臨時變量的使用

任務:
//定義一個數組
int arr[] = {1,2,3,4,5,6,7,8};
//打印原始數組的值
for(int i:arr){
System.out.print(i + " ");
}
System.out.println();
// 添加代碼刪除上面數組中的5
...
//打印出 1 2 3 4 6 7 8 0
for(int i:arr){
System.out.print(i + " ");
}
System.out.println();
// 添加代碼再在4後面5
...
//打印出 1 2 3 4 5 6 7 8
for(int i:arr){
System.out.print(i + " ");
}
System.out.println();html

2、單元測試 提交最後三個測試用例都經過的截圖

想用程序解決問題時,要會寫三種碼:java

  • 僞代碼
  • 產品代碼
  • 測試代碼

僞代碼產品代碼最天然的、最好的註釋.僞代碼能夠用漢語寫,推薦用英語寫,僞代碼與具體編程語言無關,不要寫與具體編程語言語法相關的語句。程序員

Java編程時,程序員對類實現的測試叫單元測試編程

測試用例是爲某個特殊目標而編制的一組測試輸入、執行條件以及預期結果,以便測試某個程序路徑或覈實是否知足某個特定需求。這裏咱們的測試輸入是「50」,預期結果是「不及格」。
數組

3、以 TDD的方式研究學習StringBuffer

TDD(Test Driven Devlopment, 測試驅動開發)先寫測試代碼,而後再寫產品代碼的開發方法叫「測試驅動開發」(TDD)。編程語言

package exp2;

import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;

/**
 * Created by Veronica on 2017/4/20.
 */
public class StringBufferDemo01Test extends TestCase {
    StringBuffer a = new StringBuffer("StringBuffer01");//測試14個字符串
    StringBuffer b = new StringBuffer("StringBuffer01StringBuffer01");//測試28個字符串
    StringBuffer c = new StringBuffer("StringBuffer01StringBuffer01StringBuffer01");//測試42個字符串

    @Test
    public void tsetcharAt() throws Exception{
        assertEquals('S',a.charAt(0));
        assertEquals('B',a.charAt(6));
        assertEquals('1',b.charAt(11));
    }
    @Test
    public void testcapacity() throws Exception{
        assertEquals(30,a.capacity());
        assertEquals(44,b.capacity());
        assertEquals(58,c.capacity());
    }
    @Test
    public void testlength() throws Exception{
        assertEquals(14,a.length());
        assertEquals(28,b.length());
        assertEquals(42,c.length());
    }
    @Test
    public void testindexOf() throws Exception{
        assertEquals(0,a.indexOf("Str"));
        assertEquals(12,b.indexOf("01"));
        assertEquals(8,c.indexOf("ff"));
    }
}

4、讓系統支持Short類,並在MyDoc類中添加測試代碼代表添加正確

package exp2;

/**
 * Created by Veronica on 2017/4/20.
 */

    // Server Classes
    abstract class Data {
        abstract public void DisplayValue();
    }
    class Short extends  Data {
        short value;
        Short() {
            value=5;
        }
        public void DisplayValue(){
            System.out.println (value);
        }
    }
    // Pattern Classes
    abstract class Factory {
        abstract public Data CreateDataObject();
    }
    class ShortFactory extends Factory {
        public Data CreateDataObject(){
            return new Short();
        }
    }
    //Client classes
    class Document {
        Data pd;
        Document(Factory pf){
            pd = pf.CreateDataObject();
        }
        public void DisplayData(){
            pd.DisplayValue();
        }
    }
    //Test class
    public class MyDoc {
        static Document d;
        public static void main(String[] args) {
            d = new Document(new ShortFactory());
            d.DisplayData();
        }
    }

5、以TDD的方式開發一個複數類Complex

6、StartUML做圖

出現的問題

一、IDEA中使用JUnit安裝插件JunitGenerator V2.0,
1)選擇File->Setting打開設置對話框
2)在設置對話框中選擇Plugins, 單擊Browse Repositories按鈕打開插件安裝界面,而不是單擊Install JetBrains plugin...
3)在插件安裝對話框的搜索中輸入junit,單擊JunitGenerator V2.0,單擊右邊綠色的Install1按鈕安裝:
否則只能搜索到下面內容
ide

二、在增長測試異常狀況的用例testException和測試邊界狀況的用例testBoundary時,出現錯誤
函數

解決方法:根據提示可知是第21行代碼出現錯誤,把第21行代碼添加註釋,可運行測試經過,能夠肯定錯誤就是這行,
查看MyUtil類的代碼,可知(grade<60)爲不及格,改寫代碼測試經過性能

package exp2;
public class MyUtil {
    public static String percentage2fivegrade(int grade){
        if (grade<0)
            return "錯誤";
            //若是成績小於60,轉成「不及格」
         else if (grade < 60)
            return "不及格";
            //若是成績在60與70之間,轉成「及格」
        else if (grade < 70)
            return "及格";
            //若是成績在70與80之間,轉成「中等」
        else if (grade < 80)
            return "中等";
            //若是成績在80與90之間,轉成「良好」
        else if (grade < 90)
            return "良好";
            //若是成績在90與100之間,轉成「優秀」
        else if (grade <= 100)
            return "優秀";
            //若是成績大於100,轉成「錯誤」
        else
            return "錯誤";
    }
}

三、StringBuffer的capacity是怎樣計算的?單元測試

查資料知道,經過調用length()方法能夠獲得當前StringBuffer的長度。而經過調用capacity()方法能夠獲得總的分配容量,分配的容量是隨機的嗎

由代碼的運行結果能夠知道,當length爲12時,capacity爲16,我試着把字符串增長到16,結果顯示capacity的結果仍是16,當增長到17的時候,capacity的值變爲34。

/**
 * This implements the expansion semantics of ensureCapacity with no
 * size check or synchronization.
 */
 void expandCapacity(int minimumCapacity) {
     int newCapacity = (value.length + 1) * 2;
     if (newCapacity < 0) {
         newCapacity = Integer.MAX_VALUE;
     } else if (minimumCapacity > newCapacity) {
         newCapacity = minimumCapacity;
     }
     char newValue[] = new char[newCapacity];
     System.arraycopy(value, 0, newValue, 0, count);
     value = newValue;
 }

這段代碼解釋了StringBuffer的容量(capacity)分配。

StringBuffer在內部維護一個字符數組,當你使用缺省的構造函數來建立StringBuffer對象的時候, StringBuffer的容量被初始化爲16個字符,也就是說缺省容量就是16個字符。當StringBuffer達到最大容 量的時候,它會將自身容量增長到當前的2倍再加2,也就是(2*舊值+2)。

若是你使用缺省值,初始化以後接着往裏面追加字符,在你追加到第17個字符的時候它會將容量增長 到34(216+2),當追加到34個字符的時候就會將容量增長到70(234+2)。不管什麼時候只要StringBuffer 到達它的最大容量它就不得不建立一個新的字符數組而後從新將舊字符和新字符都拷貝一遍。因此給 StringBuffer設置一個合理的初始化容量值,會提高程序的性能。

四、怎樣寫測試用例
JUnit4及其在IDEA中的使用
五、調試capacity時出現錯誤
容量不是隨便寫的,是設定的嗎?根據提示修改就能夠經過。

實驗總結

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

感想

多發現問題,多總結。

參考資料

StringBuffer的capacity()方法

JUnit4及其在IDEA中的使用

Intellj IDEA 簡易教程

積極主動敲代碼,使用JUnit學習Java

相關文章
相關標籤/搜索