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

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

一.实验内容:

1.初步掌握单元测试和TDD
2.理解并掌握面向对象三要素:封装、继承、多态
3.初步掌握UML建模
4.熟悉S.O.L.I.D原则
5.了解设计模式

二.实验步骤:

1.单元测试

1.在src目录中创建产品代码,在菜单中选择New--->Directory,新建一个目录test,把测试代码放在test目录中,右键单击项目.
2.png

2.再右键点击设置环境变量,选择Mark Directory--->Test Sources Root

3.png
3.根据实验内容代码进行测试.

8.png

测试都符合预期,这时提供产品代码。

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

步骤:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发
    10.png

11.png

22.png

测试结果

33.png

3.面向对象三要素

抽象:抽出事物的本质特征而暂不考虑细节,对于复杂的问题分层求解

  • 过程抽象:结果是函数
  • 数据抽象:结果是抽象数据类型

封装,继承与多态(面向对象的三要素)

  • 封装:将数据与相关行为包装在一起以实现信息隐藏,java中使用类进行封装,接口是封装准确描述手段
  • 继承:关键在于确认子类为父类的一个特殊类型,以封装为基础,继承可以实现代码复用,继承更重要的作用是实现多态
  • 多态:同一消息可以根据发送对象的不同而采用多种不同的行为方式

具体代码

abstract class Data {
    abstract public void DisplayValue();
}
class Integer extends  Data {
    int value;
    Integer() {
        value=100;
    }
    public void DisplayValue(){
        System.out.println (value);
    }
}
class Long extends Data{
    long value;
    Long(){
        value=1234567890;
    }
    public void DisplayValue(){
        System.out.println(value);
    }
}
abstract class Factory {
    abstract public Data CreateDataObject();
}
class IntFactory extends Factory {
    public Data CreateDataObject(){
        return new Integer();
    }
}
class LongFactory extends Factory{
    public Data CreateDataObject(){
        return new Long();
    }
}
class Document {
    Data pd;
    Document(Factory pf){
        pd = pf.CreateDataObject();
    }
    public void DisplayData(){
        pd.DisplayValue();
    }
}
//Test class
public class MyDoc {
    static Document d;
    static Document e;
    public static void main(String[] args) {
        d = new Document(new IntFactory());
        d.DisplayData();
        e=new Document(new LongFactory());                                                   //20175215
        e.DisplayData();

    }
}

运行截图

55.png

4.设计模式初步

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,依赖倒置原则)

设计模式

  • Pattern name:描述模式,便于交流,存档
  • Problem:描述何处应用该模式
  • Solution:描述一个设计的组成元素,不针对特例
  • Consequence:应用该模式的结果和权衡(trade-offs)

测试代码

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

public class ComplexTest extends TestCase {
    Complex a1 =new Complex(3.0,4.0);
    Complex a2 =new Complex( 2.0,-4.0);
    Complex a3 =new Complex(0.0,0.0);
    Complex a4 =new Complex(-3.0,0.0);
    Complex a5 =new Complex(-6.0,-0.8);
    @Test
    public void testgetRealPart()throws Exception{
        assertEquals(3.0,a1.getReal());
        assertEquals(2.0,a2.getReal());
        assertEquals(0.0,a3.getReal());
        assertEquals(-3.0,a4.getReal());
        assertEquals(-6.0,a5.getReal());
    }
    @Test
    public void testgetImagePart()throws Exception{
        assertEquals(4.0,a1.getImaginary());
        assertEquals(-4.0,a2.getImaginary());
        assertEquals(0.0,a3.getImaginary());
        assertEquals(0.0,a4.getImaginary());
        assertEquals(-0.8,a5.getImaginary());

    }
    @Test
    public void testtoString()throws Exception{
        assertEquals("3.0+4.0i",a1.toString());
        assertEquals("2.0-4.0i",a2.toString());
        assertEquals("0",a3.toString());
        assertEquals("-3.0",a4.toString());
        assertEquals("-6.0-0.8i",a5.toString());
    }
    @Test
    public void testComplexAdd()throws Exception{
        assertEquals("5.0",a1.ComplexAdd(a2).toString());
        assertEquals("2.0-4.0i",a2.ComplexAdd(a3).toString());
        assertEquals("-3.0",a3.ComplexAdd(a4).toString());
    }
    @Test
    public void testComplexSub()throws Exception{
        assertEquals("1.0+8.0i",a1.ComplexSub(a2).toString());
        assertEquals("-2.0+4.0i",a3.ComplexSub(a2).toString());
        assertEquals("3.0",a3.ComplexSub(a4).toString());
    }
    @Test
    public void testComplexMulti()throws Exception{
        assertEquals("22.0-4.0i",a1.ComplexMulti(a2).toString());
        assertEquals("0",a2.ComplexMulti(a3).toString());
        assertEquals("18.0+2.4i",a4.ComplexMulti(a5).toString());
    }
    @Test
    public void testComplexDiv()throws Exception{
        assertEquals("-0.2-1.2i",a1.ComplexDiv(a2).toString());
        assertEquals("0",a3.ComplexDiv(a2).toString());
    }
    @Test
    public void testequals()throws Exception{
        assertEquals(true,a1.equals(a1));
        assertEquals(false,a1.equals(a2));

    }
}

产品代码

import java.text.DecimalFormat;//引入DecimalFormat包取一位整数和一位小数

public class Complex {
    double Real=0;
    double Imaginary=0;
    public Complex(){}
    public Complex(double Real,double Imaginary){
        this.Real=Real;
        this.Imaginary=Imaginary;

    }
    public double getReal(){
        return Real;
    }
    public double getImaginary(){
        return Imaginary;
    }
    public String toString(){
        String s = "";
        double r=Real;
        double i=Imaginary;
        if(r==0&&i==0){
            s="0";
        }
        else if(r==0&&i!=0){
            s=i+"i";
        }
        else if(r!=0&&i<0){
            s=r+""+i+"i";
        }
        else if(r!=0&&i==0){
            s=r+"";
        }
        else
        {
            s=r+"+"+i+"i";
        }
        return s;
    }
    public boolean equals(Object obj){//重写equals方法,使其不用来对比字符序列
        if(this==obj){
            return true;
        }
        else
            return false;
    }
    DecimalFormat df = new DecimalFormat( "0.0");
    public Complex ComplexAdd(Complex a){
        return new Complex(Real+a.getReal(),Imaginary+a.getImaginary());
    }
    public Complex ComplexSub(Complex a){
        return new Complex(Real-a.getReal(),Imaginary-a.getImaginary());
    }
    public Complex ComplexMulti(Complex a){
        double r=Real*a.getReal()-Imaginary*a.getImaginary();
        double i =Imaginary*a.getReal()+Real*a.getImaginary();
        return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
    }
    public Complex ComplexDiv(Complex a){
        double r=(Real * a.Imaginary + Imaginary * a.Real) / (a.Imaginary * a.Imaginary + a.Real * a.Real);
        double i=(Imaginary * a.Imaginary + Real * a.Real) / (a.Real * a.Real + a.Real * a.Real);
        return new Complex(Double.valueOf(df.format(r)),Double.valueOf(df.format(i)));
    }
}

运行截图

66.png

5.建模

  • 使用StarUML对实验二中的代码进行建模,发类图的截图,加上学号水印
  • 类图中只少两个类
  • 类,继承,接口实现,组合在UML中表达
    77.png

遇到的问题

在寻找junit.jar时不在默认任文件夹里,通过搜索来解决.
G5{A9MQ3PX)48RIV1IAA8CA.png

22.png

posted @ 2019-04-18 22:15  20175233  阅读(161)  评论(0)    收藏  举报