首页 > 技术文章 > 20155225 实验二《Java面向对象程序设计》实验报告

clever-universe 2017-04-22 13:58 原文

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

一、单元测试

三种代码

知道了伪代码、产品代码、测试代码的关系和用途,并根据老师的例子,按测试代码调试了产品代码。

值得注意的是,测试用例要全面选择,特别是异常用例和边界用例。

TDD(Test Driven Devlopment,测试驱动开发)

安装了Java单元测试工具JUnit进行TDD。体会了TDD编码节奏。并且最终测试结果出现了绿条。

image

学会了使用JUnit学习Java,并用TDD的方式研究学习了StringBuffer,测试了StringBuffer的几个常用方法(append(),charAt(),capacity())。

image

二、面向对象三要素

抽象

封装、继承和多态

学会了使用StarUML进行建模,针对最后练习里设计复数类进行OOD设计。老师已经给出了Complex类的整体框架。我在StarUML中画出了Complex类的模型图。

image

三、设计模式初步

S.O.L.I.D原则

学习理解了S.O.L.I.D原则

  • SRP(Single Responsibility Principle,单一职责原则)
  • OCP(Open-Closed Principle,开放-封闭原则)
  • LSP(Liskov Substitusion Principle,Liskov替换原则)
  • ISP(Interface Segregation Principle,接口分离原则)
  • DIP(Dependency Inversion Principle,依赖倒置原则)

模式与设计模式

知道了模式的重要作用和设计模式在Java中的重要地位。

设计模式示例

根据老师给出的例子体会了OCP原则和DIP原则,初步理解了设计模式,并实例程序扩充,使其支持了short类。

image

四、练习

使用TDD方式设计实现复数类Complex

对Complex这个类的设计我体会比较深,虽然是根据老师给出的模板来的,但在充实模板的过程中,我体会到一个设计一个类的基本要素和方法。

遇到的问题:在重写toString()时,为了返回一个复数字符串,我首先想到的是进行字符串拼接。于是查找API文档,找到concat()方法,但concat()方法只能拼接字符串,而对于‘+’、‘i’,还要先转为字符串,于是我又在API文档中找到了类方法valueof(),但这样根本不行。最后我突然想到+就可以直接实现字符串连接,果然成功了!toString()代码如下:

 public String toString(){
        String s = new String(Double.toString(getterRealPart()));
        //  s.concat(Double.toString(getterRealPart()));
        if(getterImagePart()>0)
        s = s + '+';
        s = s + Double.toString(getterImagePart());
       // s.concat(Double.toString(getterImagePart()));
        s = s + 'i';
        return s;
    }

Complex类完整代码:

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

    public void setterRealPart(double realPart) {
        this.RealPart = realPart;
    }
    public void setterImagePart(double imagePart){
        this.ImagePart = imagePart;
    }
    public double getterRealPart(){
        return RealPart;
    }
    public double getterImagePart(){
        return ImagePart;
    }

    // 定义构造函数
    public Complex(){}
    public Complex(double R,double I){
        this.RealPart = R;
        this.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(getterRealPart()!=complex.getterRealPart()){
            return false;
        }
        if(getterImagePart()!=(complex.getterImagePart())){
            return false;
        }
        return true;
    }
    public String toString(){
        String s = new String(Double.toString(getterRealPart()));
        //  s.concat(Double.toString(getterRealPart()));
        if(getterImagePart()>0)
        s = s + '+';
        s = s + Double.toString(getterImagePart());
       // s.concat(Double.toString(getterImagePart()));
        s = s + 'i';
        return s;
    }

    // 定义公有方法:加减乘除
    Complex ComplexAdd(Complex a){
        Complex b = new Complex();
        b.ImagePart = this.ImagePart + a.ImagePart;
        b.RealPart = this.RealPart + a.RealPart;
        return b;
    }
    Complex ComplexSub(Complex a){
        Complex b = new Complex();
        b.ImagePart = this.ImagePart - a.ImagePart;
        b.RealPart = this.RealPart - a.RealPart;
        return b;
    }
    Complex ComplexMulti(Complex a){
        Complex b = new Complex();
        b.RealPart = this.RealPart * a.RealPart - this.ImagePart * a.ImagePart;
        b.ImagePart = this.RealPart * a.ImagePart + this.ImagePart * a.RealPart;
        return b;
    }
    Complex  ComplexDiv(Complex a) {
        Complex b = new Complex();
        b.RealPart = (this.RealPart * a.RealPart + this.ImagePart * a.ImagePart)/(a.RealPart*a.RealPart+a.ImagePart*a.ImagePart);
        b.ImagePart = (this.ImagePart * a.RealPart - this.RealPart * a.ImagePart)/(a.RealPart*a.RealPart+a.ImagePart*a.ImagePart);
        return b;
    }
}

最终每个方法都测试通过了。

image

PSP时间

步骤 耗时 百分比
需求分析 5 10%
设计 5 10%
代码实现 30 60%
测试 5 10%
分析总结 5 10%

单元测试的好处:

单元测试将复杂的问题分解了。只要我们能保证每一块积木是正确可用的,那我们砌出来的墙,建起来的楼必然也是牢靠的。

推荐阅读