20169219 实验二 Java面向对象程序设计

实验二 Java面向对象程序设计

一、程序设计中临时变量的使用

任务:
//定义一个数组
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();

二、单元测试 提交最后三个测试用例都通过的截图

想用程序解决问题时,要会写三种码:

  • 伪代码
  • 产品代码
  • 测试代码

伪代码产品代码最自然的、最好的注释.伪代码可以用汉语写,推荐用英语写,伪代码与具体编程语言无关,不要写与具体编程语言语法相关的语句。

Java编程时,程序员对类实现的测试叫单元测试

测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。这里我们的测试输入是“50”,预期结果是“不及格”。

三、以 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"));
    }
}

四、让系统支持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();
        }
    }

五、以TDD的方式开发一个复数类Complex

六、StartUML作图

出现的问题

1、IDEA中使用JUnit安装插件JunitGenerator V2.0,
1)选择File->Setting打开设置对话框
2)在设置对话框中选择Plugins, 单击Browse Repositories按钮打开插件安装界面,而不是单击Install JetBrains plugin...
3)在插件安装对话框的搜索中输入junit,单击JunitGenerator V2.0,单击右边绿色的Install1按钮安装:
不然只能搜索到下面内容

2、在增加测试异常情况的用例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 "错误";
    }
}

3、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设置一个合理的初始化容量值,会提升程序的性能。

4、怎样写测试用例
JUnit4及其在IDEA中的使用
5、调试capacity时出现错误
容量不是随便写的,是设定的吗?根据提示修改就可以通过。

实验总结

步骤 耗时 百分比
需求分析 20min 12.5%
设计 30min 18.75%
代码实现 60min 37.5%
测试 20min 12.5%
总结分析 30min 18.75%

感想

多发现问题,多总结。

参考资料

StringBuffer的capacity()方法

JUnit4及其在IDEA中的使用

Intellj IDEA 简易教程

积极主动敲代码,使用JUnit学习Java

posted @ 2017-04-20 21:02  毛卫华  阅读(239)  评论(0编辑  收藏  举报