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

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

实验要求

1.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号。本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试。

2.使用JUnit学习Java,以 TDD的方式研究学习StringBuffer。提交你的单元测试用例和测试通过的截图,截图要加上学号水印。测试自己会不会写JUnit测试用例。

3.对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解设计模式。用自己的学号%6进行取余运算,根据结果进行代码扩充。

4.提交:单元测试代码和运行成功截图及码云上代码链接,截图要加上学号水印。任务:以TDD的方式开发一个复数类Complex。

实验内容

面向对象程序设计-1

  • 安装Junit: 选择File->Settings,选择Plugins,搜索JUnit,单击Install JetBrains plugin,安装后如下图:

  • 把测试代码放在test中,设置环境变量Mark Directory as->Test Sources Root

  • 下载 junit.jar包,选择File->Project StructureDependancies->JARs or Directories,添加junit.jar,右击测试代码选择Run 'MyTuilTest' ,红色代码部分恢复正常。

  • 产品代码:

  • 正常情况,错误情况,边界情况:

  • 测试通过:

面向对象程序设计-2

  • 产品代码:

  • 测试通过:

面向对象程序设计-3

  • 1.OCP(Open-Closed Principle,开放-封闭原则)

OCP是OOD中最重要的一个原则,OCP的内容是:

软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。

基于OCP,利用面向对象中的多态性(Polymorphic),更灵活地处理变更拥抱变化,OCP可以用以下手段实现:(1)抽象和继承,(2)面向接口编程。

  • 2.DIP的内容是:

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。

抽象不应该依赖于细节。细节应该依赖于抽象。

通过接口或者抽象类,DIP在应用中通过依赖注入的方式实现解耦,重用低级模块,重用实现,解除依赖。

  • 让系统支持Byte类,并在MyDoc类中添加测试代码表明添加正确:
// Server Classes
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=3;
    }
    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 pd;
    Document(Factory pf){
        pd = pf.CreateDataObject();
    }
    public void DisplayData(){
        pd.DisplayValue();
    }
}
//Test class
public class MyDoc {
    static Document d,e;
    public static void main(String[] args) {
        d = new Document(new IntFactory());
        e = new Document(new ByteFactory());
        d.DisplayData();
        e.DisplayData();
    }
}

  • 部分代码截图:

  • 测试结果:

面向对象程序设计-4

  • 任务:以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)

  • 产品代码:
import java.lang.Integer;
import java.util.Objects;
public class Complex {
    double RealPart;
    double ImagePart;
    public double getRealPart(){
        return RealPart;
    }
    public double getImagePart(){
        return ImagePart;
    }
    public Complex(){
        RealPart = 0;
        ImagePart = 1;
    }
    public Complex(double R,double I){
        RealPart = R;
        ImagePart = I;
    }
    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 s = new String();
        if (ImagePart > 0){
            s = getRealPart() + "+" + getImagePart() + "i";
        }
        if (ImagePart == 0){
            s = getRealPart() + "";
        }
        if(ImagePart < 0){
            s = getRealPart() + "" + getImagePart() + "i";
        }
        if(RealPart == 0){
            s = getImagePart() + "i";
        }
        return s;
    }
    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,RealPart*a.ImagePart + ImagePart*a.RealPart);
    }
    Complex ComplexDiv(Complex a) {
        return new Complex((RealPart * a.ImagePart + ImagePart * a.RealPart) / (a.ImagePart * a.ImagePart + a.RealPart * a.RealPart), (ImagePart * a.ImagePart + RealPart * a.RealPart) / (a.RealPart * a.RealPart + a.RealPart * a.RealPart));
    }
}

  • 测试通过:

面向对象程序设计-5

  • 知识点:

面向对象(Object-Oriented)的三要素包括:封装、继承、多态。面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。OOA根据抽象关键的问题域来分解系统,关注是什么(what)。OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。
OOD中建模会用图形化的建模语言UML(Unified Modeling Language),UML是一种通用的建模语言,我们实验中使用umbrello进行建模,Windows中推荐大家使用 StarUML。
过程抽象的结果是函数,数据抽象的结果是抽象数据类型(Abstract Data Type,ADT),类可以作具有继承和多态机制的ADT。数据抽象才是OOP的核心和起源。

  • 要求:

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

  • 由于我对UML用法掌握得还不到位,没有对实验二的代码进行建模,最后选择了书中编程题进行建模。

实验体会

本次实验对我来说难度较大,不仅是代码,还有下载安装软件等操作,虽然老师的教程非常完整,但我还是会遇到许多问题。在此感谢我的队友给予的帮助,一起加油!

原文地址:https://www.cnblogs.com/5306xyh/p/8854115.html