20145239杜文超 《Java程序设计》实验二 Java面向对象程序设计实验报告

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

实验内容

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

实验步骤

  • 单元测试

1.三种代码:伪代码、产品代码、测试代码。我们应该先写伪代码->再用特定编程语言翻译成产品代码->最后写测试代码,验证自己的代码有没有问题。

(1)伪代码

百分制转五分制:
如果成绩小于60,转成“不及格”
如果成绩在60与70之间,转成“及格”
如果成绩在70与80之间,转成“中等”
如果成绩在80与90之间,转成“良好”
如果成绩在90与100之间,转成“优秀”
其他,转成“错误”

(2)产品代码

public class MyUtil{
    public static String percentage2fivegrade(int grade){
        //如果成绩小于60,转成“不及格”
        if (grade < 60)
            return "不及格";
            //如果成绩在60与70之间,转成“及格”
        else if (grade < 70)
            return "及格";
            //如果成绩在70与80之间,转成“中等”
        else if (grade < 80)
            return "中等";
            //如果成绩在80与90之间,转成“良好”
        else if (grade < 90)
            return "良好";
            //如果成绩在90与100之间,转成“优秀”
        else if (grade < 100)
            return "优秀";
            //其他,转成“错误”
        else
            return "错误";
    }
}

 

(3)测试代码

用50分测试时:

public class MyUtilTest {
 public static void main(String[] args) {
    // 百分制成绩是50时应该返回五级制的“不及格”
    if(MyUtil.percentage2fivegrade(50) != "不及格")
        System.out.println("test failed!");
    else
        System.out.println("test passed!");
    }
}

增加对负分的判断后:

public class MyUtil3{
    public static String percentage2fivegrade(int grade){
        //如果成绩小于0,转成“错误”
        if ((grade < 0))
            return "错误";
            //如果成绩小于60,转成“不及格”
        else if (grade < 60)
            return "不及格";
            //如果成绩在60与70之间,转成“及格”
        else if (grade < 70)
            return "及格";
            //如果成绩在70与80之间,转成“中等”
        else if (grade < 80)
            return "中等";
            //如果成绩在80与90之间,转成“良好”
        else if (grade < 90)
            return "良好";
            //如果成绩在90与100之间,转成“优秀”
        else if (grade <= 100)
            return "优秀";
            //如果成绩大于100,转成“错误”
        else
            return "错误";
    }
}

测试边界情况:

public class MyUtilTest4{
    public static void main(String[] args) {
        //测试边界情况
        if(MyUtil2.percentage2fivegrade(0) != "不及格")
            System.out.println("test failed 1!");
        else if(MyUtil2.percentage2fivegrade(60) != "及格")
            System.out.println("test failed 2!");
        else if(MyUtil2.percentage2fivegrade(70) != "中等")
            System.out.println("test failed 3!");
        else if(MyUtil2.percentage2fivegrade(80) != "良好")
            System.out.println("test failed 4!");
        else if(MyUtil2.percentage2fivegrade(90) != "优秀")
            System.out.println("test failed 5!");
        else if(MyUtil3.percentage2fivegrade(100) != "优秀")
            System.out.println("test failed 6!");
        else
            System.out.println("test passed!");
    }
}

TDD

  • 先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)。
  • TDD的一般步骤如下:

    1、明确当前要完成的功能,记录成一个测试列表

    2、快速完成编写针对此功能的测试用例

    3、测试代码编译不通过(没产品代码呢)

    4、编写产品代码

    5、测试通过

    6、对代码进行重构,并保证测试通过(重构下次实验练习)

        

面向对象三要素

  • 面向对象(Object-Oriented)的三要素包括:封装、继承、多态。
  • 面向对象的思想涉及到软件开发的各个方面,如面向对象分析(OOA)、面向对象设计(OOD)、面向对象编程实现(OOP)。
  • OOA根据抽象关键的问题域来分解系统,关注是什么(what)。
  • OOD是一种提供符号设计系统的面向对象的实现过程,用非常接近问题域术语的方法把系统构造成“现实世界”的对象,关注怎么做(how),通过模型来实现功能规范。
  • OOP则在设计的基础上用编程语言(如Java)编码。贯穿OOA、OOD和OOP的主线正是抽象。

 

public class Dog {
    private String color;
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String bark(){
        return "汪汪";
    }
    public String toString(){
        return "The Dog's color is " + this.getColor() +", and it shouts "+ this.bark() + "!";
    }
}

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

初步掌握UML建模

我们可以用UML中的类图来描述类Dog,首先我们在实验楼的环境中打开shell,在命令行中输入umbrello,打开UML建模软件umbrello

练习

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

  • 伪代码

    复数类Complex
    
    复数=实部数+虚部数 i
    
    复数相加 = (实部+实部) + (虚部 + 虚部)i
    
    复数相减 = (实部-实部) + (虚部 - 虚部)i
    
    
    
    打印复数:
    
    虚部大于0  "实部"+"+"+"虚部"+"i"
    
    虚部小于0  "实部"+"虚部"+"i"
    
    虚部为0     "实部"
  • 产品代码

    publicclassComplexNumber
    {
        double r,i;
    
    
        public  ComplexNumber(){
            this.r=0;
            this.i=0;
        }
        public ComplexNumber(double r, double i){
            this.r=r;
            this.i=i;
        }
        public double GetRealPart(){
            returnthis.r;
        }
        public double GetImaginaryPart(){
            returnthis.i;
        }
        public void SetRealPart(double r){
            this.r=r;
        }
        public void SetImaginaryPart(double i){
            this.i=i;
        }
        public ComplexNumber ComplexAdd(ComplexNumber a,ComplexNumber b)
        {
            ComplexNumber temp = new ComplexNumber();
            temp.r = a.r + b.r;
            temp.i  = a.i  + b.i;
            return temp;
        }
        public ComplexNumber ComplexMinus(ComplexNumber a,ComplexNumber b)
        {
            ComplexNumber temp =new ComplexNumber();
            temp.r=a.r - b.r;
            temp.i =a.i - b.i;
            return temp;
        }
        public ComplexNumber ComplexMulti(ComplexNumber a,ComplexNumber b)
        {
            ComplexNumber temp = new ComplexNumber();
            temp.r = a.r*b.r-a.i*b.i;
            temp.i  = a.r*b.i+a.i*b.r;
            return temp;
        }
        public void ComplexAdd(ComplexNumber c){
            this.r=this.r+c.r;
            this.i=this.i+c.i;
        }
    
    
        public void ComplexMinus(ComplexNumber c){
            this.r=this.r-c.r;
            this.i=this.i-c.i;
        }
        public void ComplexMulti(ComplexNumber c)
        {
            double temp=this.r;
            this.r=this.r*c.r-this.i*c.i;
            this.i =temp*c.i+this.i*c.r;
        }
        public void printComplexNumber(){
            System.out.print(""+this.r+"+"+this.i+"i");
        }
    
    }
  • 测试代码

    import static junit.framework.Assert.*;import junit.framework.TestCase;import org.junit.Test;publicclass ComplexNumberTest extends TestCase {
        ComplexNumber c1 = newComplexNumber(3,5);
        ComplexNumber c2 = newComplexNumber(3,5);
        double a = 5;
        @TestpublicvoidtestAdd1() throws Exception {
            c1.ComplexAdd(c2);
            assertEquals(6.0, c1.getRealPart());
            assertEquals(10.0, c1.getImaginPart());
        }
        @TestpublicvoidtestAdd2() throws Exception {
            c1.ComplexAdd(a);
            assertEquals(8.0, c1.getRealPart());
            assertEquals(5.0, c1.getImaginPart());
        }
        @TestpublicvoidtestMinus1() throws Exception {
            c1.ComplexMinus(c2);
            assertEquals(0.0, c1.getRealPart());
            assertEquals(0.0, c1.getImaginPart());
        }
        publicvoidtestMinus2() throws Exception {
            c1.ComplexMinus(a);
            assertEquals(-2.0, c1.getRealPart());
            assertEquals(5.0, c1.getImaginPart());
        }
        @TestpublicvoidtestMulti1() throws Exception {
            c1.ComplexMulti(c2);
            assertEquals(9.0, c1.getRealPart());
            assertEquals(25.0, c1.getImaginPart());
        }
        publicvoidtestMulti2() throws Exception {
            c1.ComplexMulti(a);
            assertEquals(15.0, c1.getRealPart());
            assertEquals(5.0, c1.getImaginPart());
        }
    }

    测试代码运行结果:

 

实验心得体会

      本次实验一开始不懂TDD和UML的意思,以为是多么高深莫测的知识,后来在同学的帮助下一点一点实验,发现其实就是一种检验代码的方法和把java语言模块化,

而且运用好单元测试可以在未来的程序设计中让自己负责的模块功能定义尽量明确,最关键的是建立了测试代码的思维方式,还是有很多收获的。

 

PSP(Personal Software Process)

 

步骤耗时百分比
需求分析 5 mins 8%
设计 20 mins 33%
代码实现 20 mins 33%
测试 5 mins 8%
分析总结 10 mins 16%

 

posted on 2016-04-17 22:36  20145239杜文超  阅读(578)  评论(1编辑  收藏  举报

导航