• 2018-2019-2 20175320实验二《Java面向对象程序设计》实验报告


    2018-2019-2 20175320实验二《Java面向对象程序设计》实验报告

    一、实验步骤及内容

    (一)了解使用JUint,并对示例代码MyUtil进行测试

    1、先在IDEA中安装JUnit插件,并在IDEA中的项目中加入junit.jar包。
    2、创建类MyUtil,输入示例代码MyUtil,点击类名会出现一个灯泡状图标,在弹出的菜单中选择Create Test,并选择JUnit3的测试用例 。

    3、之后选中文件夹中的MyUtilTest类,编写测试用例,注意测试用例前一定要有注解@Test,如有代码标示为红色,则使用Alt+Enter并选择IDEA提供的解决办法。

    4、右键点击测试测试类进行测试,测试结果如果为红色字体,说明测试没通过,可以在测试结果的窗口中查看实际输出与期望输出,并可点击下方的蓝色字体找到是哪个测试没通过。

    5、排除错误之后,再进行测试,直到测试结果的字体为绿色。

    (二)使用JUnit学习Java,以 TDD的方式研究学习StringBuffer

    TDD即为 测试驱动开发,编写程序就好比建筑,先用工具制定好标准,按照标准逐步完成项目,最后所有标准符合了,工程就完成了,TDD就是就是这样一种开发方法,TDD一般步骤为:

    • 明确当前要完成的功能,记录成一个测试列表
    • 快速完成编写针对此功能的测试用例
    • 测试代码编译不通过
    • 编写产品代码
    • 测试通过
    • 对代码进行重构,并保证测试通过
    • 循环完成所有功能的开发
      而在本次实验中我们使用JUit,结合TDD原则来了解StringBuffer类的各种方法的作用。
      1、创建一个StringBufferDemo类,将老师提供的StringBufferDemo类的代码复制进去,也可使用空类。
      2、按第一阶段的步骤创建一个测试类,编写测试用例,并对StringBuffer类的charAt()、capacity()、indexOf()以及length()方法进行测试。
      3、在测试前想好期望输出的结果并写入测试用例,测试后,若测试不通过,则说明对StringBuffer类的某一方法的理解有误,找到出错的测试用例,结合实际的输出值对理解有误的方法进行学习。
      运行结果如下图:

    (三)初步理解设计模式,体会OCP原则和DIP原则的应用,并对抽象工厂进行扩充

    在面向对象的编程过程中我们需要注意三要素,其中包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。而实现三要素可以使用S.O.L.I.D原则:

    • SRP(单一职责原则)
    • OCP(开放-封闭原则)
    • LSP(替换原则)
    • ISP(接口分离原则)
    • DIP(依赖倒置原则)
      而本次实验我们通过设计模式中的抽象工厂来体会OCP原则和DIP原则,在不改变原有类的情况下对功能进行扩充,使示例程序支持Boolean类。在看过示例代码后,我了解到Data类的功能是抽象数据类型,Factory类是抽象创建数据类型的对象,在这基础上,我编写了添加了对Boolean类的支持,代码如下:
    abstract class Data {//抽象变量声明
        abstract public void DisplayValue();
    }
    class Integer extends Data {
        int value;
    
        Integer() {
            value = 100;
        }
    
        public void DisplayValue() {
            System.out.println(value);
        }
    }
    class Boolean extends Data {
        boolean value;
    
        Boolean() {
            value = true;
        }
    
        public void DisplayValue() {
            System.out.println(value);
        }
    }
    abstract class Factory {//抽象不同数据类型对象的创建
        abstract public Data CreateDataObject();
    }
    class BoolFactory extends Factory {//创建boolean数据类型的对象
        public Data CreateDataObject() {
            return new Boolean();
        }
    }
    class IntFactory extends Factory {
    
        public Data CreateDataObject() {
            return new Integer();
        }
    }
    class Document {
        Data pd;
    
        Document(Factory pf) {
            pd = pf.CreateDataObject();
        }
    
        public void DisplayData() {
            pd.DisplayValue();
        }
    }
    
    //Test class
    public class MyDoc {
        static Document d, a;
    
        public static void main(String[] args) {
            d = new Document(new IntFactory());
            a = new Document(new BoolFactory());
            d.DisplayData();
            a.DisplayData();
        }
    }
    
    

    运行结果如图:

    (四)以TDD的方式开发一个复数类Complex

    根据需求,复数类需要以下数据类型和方法:

    • 存放实部与虚部的浮点型变量
    • 设置以及获取复数类的实部与虚部值的set以及get方法
    • 重写比较两个复数是否相等的equals方法以及获取复数信息的toString方法
    • 进行加减乘除的方法
    • 两种不同的构造方法
      根据需求需求我先编写了测试代码,依据测试代码我完成了复数类的编写,Complex类的代码如下:
    import java.math.BigDecimal;
    
    public class Complex {
        double RealPart;
        double ImagePart;
    
        public Complex() {
    
        }
    
        public Complex(double R, double I) {
            RealPart = R;
            ImagePart = I;
        }
    
        public double getRealPart() {
            return RealPart;
        }
    
        public double getImagePart() {
            return ImagePart;
        }
    
        public void setImagePart(double i) {
            ImagePart = i;
        }
    
        public void setRealPart(double r) {
            RealPart = r;
        }
    
        public boolean equals(Object obj) {
            if (this.RealPart == ((Complex) obj).RealPart && this.ImagePart == ((Complex) obj).ImagePart) {
                return true;
            } else {
                return false;
            }
        }
    
        public String toString() {
            if (RealPart != 0.0) {
                if (ImagePart > 0.0) {
                    return RealPart + "+" + ImagePart + "i";
                }
                if (ImagePart < 0.0) {
                    return RealPart +""+ ImagePart + "i";
                } else {
                    return String.valueOf(RealPart);
                }
            } else {
                return ImagePart + "i";
            }
        }
    
        Complex ComplexAdd(Complex a) {
            return new Complex(a.RealPart + this.RealPart, a.ImagePart + this.ImagePart);
        }
    
        Complex ComplexSub(Complex a) {
            return new Complex(RealPart - a.RealPart, ImagePart - a.ImagePart);
        }
    
        Complex ComplexMulti(Complex a) {
            return new Complex(this.RealPart * a.RealPart - this.ImagePart * a.ImagePart, this.RealPart * a.ImagePart + ImagePart * a.RealPart);
        }
    
        Complex ComplexDiv(Complex a) {
            BigDecimal bg = new BigDecimal((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart));
            BigDecimal ag = new BigDecimal((ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart));
            return new Complex(ag.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue(),bg.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue());
        }
    }
    

    运行结果如图:

    (五)使用StarUML对实验二中的代码进行建模

    我选择了抽象工厂的相关代码绘制UML图,图片效果如下:

    二、实验时遇到的问题:

    • 问题1:在引入Test类后注释@Test任显示为红色。
    • 问题1解决方法:点击注释,再点击灯泡装图标,选择IDEA提供的解决方法即可。
    • 问题2:复数类的除法输出的浮点数的小数位过长。
    • 问题2解决方法:引入了math类库中的BigDecimal类,控制输出的数保留一位小数。

    三、实验感想

    本次实验中了解了如何使用JUit进行测试,并认识了TDD方式开发程序的方法,这对我以后测试程序很有帮助,而S.O.L.I.D原则规范了我的编程方法,让我认识到自己以前写的程序都是比较杂乱的。并通过对抽象工厂的范例我大致了解了应如何实现对拓展开放,本次实验使我有了不少的收获。
    附上PSP时间:

    步骤 耗时 百分比
    需求分析 20 15%
    设计 12 12%
    代码实现 35 27%
    测试 45 35%
    分析总结 15 11%
  • 相关阅读:
    shellscript 02 find & xargs
    PL/SQL exception
    PL/SQL 游标
    Eclipse
    【数据存储】操作资源文件
    【AsynTask】Android异步加载一张图品
    【数据存储】利用IO流操作文件
    【数据存储】DOM操作
    【特效】手指滑动:水波纹
    【数据存储】SAX操作
  • 原文地址:https://www.cnblogs.com/nameless-student/p/10733389.html
Copyright © 2020-2023  润新知