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

Posted zicerain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20165218 实验二 Java面向对象程序设计相关的知识,希望对你有一定的参考价值。

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

课程:java程序设计

姓名:赵冰雨

学号:20165218

指导教师:娄嘉鹏

实验日期:2018.4.16

实验密级:Java开发环境的熟悉

实验内容、步骤与体会:

(一)单元测试

  • 实验要求

参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST

参考http://www.cnblogs.com/rocedu/p/6736847.html

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

  • 实验步骤
  1. 根据伪代码编写产品代码MyUtil.java
  2. 新建一个测试代码MyUtil.java
  3. 测试多种情况,包括正常情况,异常情况(负分或大于100的乘积),边界情况,并根据测试结果调整产品代码(以上是自己编写测试代码的过程)
  4. 新建测试文件夹test,并将其改成可作为源代码编译

  1. 在test文件夹下新建MyUtilTest.jva,输入代码:
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
    @Test
    public void testNormal() {
        assertEquals("不及格", MyUtil.percentage2fivegrade(55));
        assertEquals("及格", MyUtil.percentage2fivegrade(65));
        assertEquals("中等", MyUtil.percentage2fivegrade(75));
        assertEquals("良好", MyUtil.percentage2fivegrade(85));
        assertEquals("优秀", MyUtil.percentage2fivegrade(95));
    }
}
  1. 运行成功

  2. 出现语法错误时
    File->Project Structure

在IDEA安装地址下找到如下三个文件并添加即可


(二)面向对象的三要素

  • 实验要求

参考 积极主动敲代码,使用JUnit学习Java
http://www.cnblogs.com/rocedu/p/4837092.html)

参考http://www.cnblogs.com/rocedu/p/6736847.html

以 TDD的方式研究学习StringBuffer,提交你的单元测试用例和测试通过的截图

  • 实验步骤
  1. 编写测试用例代码
/**
 * Created by zby on 2018/4/16.
 */
public class StringBufferDemo {
    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());
        System.out.println(buffer.length());
    }
}
  1. 测试代码
import junit.framework.TestCase;
import org.junit.Test;

/**
 * Created by zby on 2018/4/16.
 */

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

import static org.junit.Assert.*;

public class StringBufferTest extends TestCase {
    StringBuffer string1 = new StringBuffer("hellojava");//测试9个字符
    StringBuffer string2 = new StringBuffer("To be or not to be");//测试18个字符
    StringBuffer string3 = new StringBuffer("Quando abbandonare ogni speranza");//测试32个字符

    @Test
    public void testCharAt() {
        assertEquals(\'h\', string1.charAt(0));
        assertEquals(\'e\', string2.charAt(4));
        assertEquals(\'a\', string3.charAt(7));
    }

    @Test
    public void testCapacity() {
        assertEquals(25, string1.capacity());
        assertEquals(34, string2.capacity());
        assertEquals(48, string3.capacity());
    }

    @Test
    public void testindexOf() {
        assertEquals(0, string1.indexOf("he"));
        assertEquals(9, string2.indexOf("not"));
        assertEquals(7, string3.indexOf("abbando"));
    }

    @Test
    public void testlength() {
        assertEquals(9, string1.length());
        assertEquals(18, string2.length());
        assertEquals(32, string3.length());
    }
}
  1. 如果显示测试失败(如下图),根据提示修改测试代码
  2. 测试成功

(三)设计模式初步

  • 实验内容

参考http://www.cnblogs.com/rocedu/p/6736847.html

对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式

用自己的学号%6进行取余运算,根据结果进行代码扩充:

0: 让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确,提交测试代码和运行结的截图,加上学号水印

  • 实验步骤
  1. 设计编写代码Data.javaMyDoc.java
/**
 * Created by zby on 2018/4/16.
 */
abstract class Data {
    abstract public void DisplayValue();
}

class Integer extends Data {
    int value;

    Integer() {
        value = 100;
    }

    public void DisplayValue() {
        System.out.println(value);
    }
}

class Byte extends Data {
    byte value;

    Byte() {
        value = (byte) 20165218;
    }

    public void DisplayValue() {
        System.out.println(value);
    }
}

// Pattern Classes
abstract class Factory {
    abstract public Data CreateDataObject();
}

class IntFactory extends Factory {
    public Data CreateDataObject() {
        return new Integer();
    }
}

class ByteFactory extends Factory {
    public Data CreateDataObject() {
        return new Byte();
    }
}

//Client classes
class Document {
    Data data;

    Document(Factory factory) {
        data = factory.CreateDataObject();
    }

    public void DisplayData() {
        data.DisplayValue();

    }
}
public class MyDoc {
    static Document d;

    public static void main(String[] args) {
        d = new Document(new ByteFactory());
        d.DisplayData();
    }
}

(四)练习

  • 实验内容

提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印

参考http://www.cnblogs.com/rocedu/p/6736847.html

任务:以TDD的方式开发一个复数类Complex,要求如下:

//伪代码
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex()
public Complex(double R,double I)

//Override Object
public boolean equals(Object obj)
public String toString()

// 定义公有方法:加减乘除
Complex ComplexAdd(Complex a)
Complex ComplexSub(Complex a)
Complex ComplexMulti(Complex a)
Complex ComplexDiv(Complex a)
  • 实验步骤
  1. 产品代码
/**
 * Created by zby on 2018/4/16.
 */
public class Complex {

    // 定义属性并生成getter,setter
    private double RealPart;
    private double ImagePart;

    // 定义构造函数
    public Complex() {

    }

    public Complex(double R, double I) {
        this.RealPart = R;
        this.ImagePart = I;
    }

    public double getRealPart() {
        return RealPart;
    }

    public void setRealPart(double realPart) {
        RealPart = realPart;
    }

    public double getImagePart() {
        return ImagePart;
    }

    public void setImagePart(double imagePart) {
        ImagePart = imagePart;
    }

    //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 string = "";
        if (ImagePart > 0)
            string = RealPart + "+" + ImagePart + "i";
        if (ImagePart == 0)
            string = RealPart + "";
        if (ImagePart < 0)
            string = RealPart + " " + ImagePart + "i";
        return string;
    }

    // 定义公有方法:加减乘除
    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, ImagePart * a.RealPart + RealPart * a.ImagePart);
    }

    Complex ComplexDiv(Complex a) {
        Complex d = new Complex();
        d.RealPart = (this.RealPart * a.RealPart + this.ImagePart * a.ImagePart) / (a.RealPart * a.RealPart + a.ImagePart * a.ImagePart);
        d.ImagePart = (this.ImagePart * a.RealPart - this.RealPart * a.ImagePart) / (a.RealPart * a.RealPart + a.ImagePart * a.ImagePart);
        return d;

    }
}

  1. 测试代码
/**
 * Created by zby on 2018/4/16.
 */

import org.junit.*;

import static org.junit.Assert.*;

public class ComplexTest {
    Complex a = new Complex(1, 2);
    Complex b = new Complex(1, -4);

    @Test
    public void testAdd() {
        assertEquals("2.0 -2.0i", a.ComplexAdd(b).toString());
        System.out.println(a.ComplexAdd(b));
    }

    @Test
    public void testSub() {
        assertEquals("0.0+6.0i", a.ComplexSub(b).toString());
        System.out.println(a.ComplexSub(b));
    }

    @Test
    public void testMulti() {
        assertEquals("9.0 -2.0i", a.ComplexMulti(b).toString());
        System.out.println(a.ComplexMulti(b));
    }

    @Test
    public void testDiv() {
        assertEquals("-0.4117647058823529+0.35294117647058826i", a.ComplexDiv(b).toString());
        System.out.println(a.ComplexDiv(b));
    }
}
  1. 测试结果

(五)UML图绘制

  • 实验内容

使用WhiteStarUML对实验二中的代码进行建模,发类图的截图,加上学号水印。

参考http://www.cnblogs.com/rocedu/p/6736847.html

  • 实验步骤
  1. 打开StarUML后,File->New新建一个文件
  2. 单击Class拖动到画布上,修改类的名称

回车确认

  1. 右键单击类,添加对象和方法(如图所示)

  2. 双击对象或方法的名字可修改,单击小加号可以添加一个新的对象或方法

  3. 点击对象或方法,Properties->Visibility,修改访问权限

  4. 完成


代码实现


PSP时间图

步骤 耗时 百分比
需求分析 20min 6%
设计 30min 9%
代码实现 90min 27.3%
测试 120min 36.4%
分析总结 70min 21%

分析单元测试的好处

  1. 帮助开发人员编写代码,提升质量、减少bug。
  2. 提升反馈速度,减少重复工作,提高开发效率。
  3. 保证你最后的代码修改不会破坏之前代码的功能。
  4. 让代码维护更容易。
  5. 有助于改进代码质量和设计。

参考资料

  1. 实验二《Java面向对象程序设计》的一点说明
  2. 为什么要编写单元测试?单元测试的优势及优点
  3. 实验二 Java面向对象程序设计
  4. Intellj IDEA 简易教程

以上是关于20165218 实验二 Java面向对象程序设计的主要内容,如果未能解决你的问题,请参考以下文章

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

20165218 2017-2018-2 《Java程序设计》第一周学习总结

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

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

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

20172304 实验二 《Java面向对象程序设计》 实验报告