zoukankan      html  css  js  c++  java
  • 20155225 实验二《Java面向对象程序设计》实验报告

    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%

    单元测试的好处:

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

  • 相关阅读:
    js 提升
    omnipay支付--支付宝支付
    laravel 配置sql日志
    laravel monlog配置
    php openssl相关加密解密 验签代码
    laravel validator提示信息中文化
    opendevops_codo项目研究
    Python学习笔记
    shell编程总结
    关于JeeSite开源软件
  • 原文地址:https://www.cnblogs.com/clever-universe/p/6747680.html
Copyright © 2011-2022 走看看