首页 > 技术文章 > 实验二

qinzhoaqi 2015-05-07 19:32 原文

(一)实验代码和截图

 

 

 

public class MyUtil {

   public static String percentage2fivegrade(int grade){

      if(grade<0)

        return "错误";

      if(grade<60)

        return "不及格";

      if(grade<70)

        return "及格";

      if(grade<80)

        return "中等";

      if(grade<90)

        return "良好";

      if(grade<=100)

        return "优秀";

      return "错误";

   }

}

 

 

 

 

 

import org.junit.Test;

 

import junit.framework.TestCase;

 

 

public class MyUtilTest extends TestCase {

 

   @Test

   public void testNormal() {

      assertEquals("不及格", MyUtil.percentage2fivegrade(55));

        assertEquals("及格", MyUtil.percentage2fivegrade(65));

        assertEquals("中等", MyUtil.percentage2fivegrade(75));

        assertEquals("良好", MyUtil.percentage2fivegrade(85));

        assertEquals("优秀", MyUtil.percentage2fivegrade(95));

 

   }

   @Test

   public void testBoundary() {

      assertEquals("不及格", MyUtil.percentage2fivegrade(0));

        assertEquals("及格", MyUtil.percentage2fivegrade(60));

        assertEquals("中等", MyUtil.percentage2fivegrade(70));

        assertEquals("良好", MyUtil.percentage2fivegrade(80));

        assertEquals("优秀", MyUtil.percentage2fivegrade(90));

        assertEquals("优秀", MyUtil.percentage2fivegrade(100));

   }

   @Test

   public void testException() {

      assertEquals("错误", MyUtil.percentage2fivegrade(105));

        assertEquals("错误", MyUtil.percentage2fivegrade(-55));

   }

}

 

 

 

(二)面向对象三要素

(2)多态和继承

面向对象(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的核心和起源。

OO三要素的第一个要素是封装,封装就是将数据与相关行为包装在一起以实现信息就隐藏。Java中用类进行封装,比如一个Dog类:

 

 

(三)设计模式初步

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

2、模式与设计模式

模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道(Solution)。模式必须使得问题明晰,阐明为什么用它来求解问题,以及在什么情况下有用,什么情况下不能起作用。每个模式因其重复性从而可被复用,本身有自己的名字,有可传授性,能移植到不同情景下。模式可以看作对一个问题可复用的专家级解决方法。

计算机科学中有很多模式:

•  GRASP模式

•  分析模式

•  软件体系结构模式

•  设计模式:创建型,结构型,行为型

•  管理模式: The Manager Pool 实现模式

•  界面设计交互模式

•  …

3、设计模式实示例

(1)设计模式(design pattern)提供一个用于细化软件系统的子系统或组件,或它们之间的关系图,它描述通信组件的公共再现结构,通信组件可以解决特定语境中的一个设计问题。

设计模式背后是抽象和SOLID原则。

(2)设计模式有四个基本要素:

•  Pattern name:描述模式,便于交流,存档

•  Problem:描述何处应用该模式

•  Solution:描述一个设计的组成元素,不针对特例

•  Consequence:应用该模式的结果和权衡(trade-offs)

(3)了解设计模式可能会存在的过度设计问题以及如何避免它。

 

(四)练习

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

public class Complex {

 

    private int sh,xu;

 

    Complex(){

 

         this.sh=0;

 

         this.xu=0;

 

    }

 

    Complex(int sh){

 

         this.sh=sh;

 

         this.xu=0;

 

    }

 

    Complex(int sh,int xu){

 

         this.sh=sh;

 

         this.xu=xu;

 

    }

 

    public void addFu(Complex p1,Complex p2){

 

         System.out.println("这两个复数的和为:");

 

         this.sh=p1.sh+p2.sh;

 

         this.xu=p1.xu+p2.xu;

 

         print();

 

    }

 

    public void minusFu(Complex p1,Complex p2){

 

         System.out.println("这两个复数的差为:");

 

         this.sh=p1.sh-p2.sh;

 

         this.xu=p1.xu-p2.xu;

 

         print();

 

    }

 

    public void outputFu(){

 

         System.out.println("复数的值为:");

 

         print();

 

    }

 

    public void print(){

 

         if(this.xu>0){

 

               System.out.println(this.sh+"+"+this.xu+"i");

 

         }else if(this.xu<0){

 

               System.out.println(this.sh+""+this.xu+"i");

 

         }else{

 

               System.out.println(this.sh);

 

         }

 

    }

 

}

//20135123秦兆琪

 

 

 

import junit.framework.TestCase;

 

 

public class Test extends TestCase {

 

    @org.junit.Test

    public void test() {

        Complex c=new Complex();

        Complex c1=new Complex(1,3);

        Complex c2=new Complex(9,-6);

        c.outputFu();

        c1.outputFu();

        c2.outputFu();

        c.addFu(c1,c2);

        c.minusFu(c1, c2);

       

        //20135114

    }

 

}

//20135123秦兆琪

 

 

 

2、实验报告中统计自己的PSP(Personal Software Process)时间

步骤

耗时

百分比

需求分析

40min

16%

设计

50min

21%

代码实现

1h

25%

测试

70min

30%

分析总结

20min

8%

3.总结

1.试验中遇到的问题:

a.实验楼进不去,进去后的网速太慢,严重影响做实验的进度,实验楼里不会创建Java文件。

解决:在自己电脑上做实验,不会的问题问同学。

b.实验四的代码构思和实现有困难

按照实验一二三的思路,运用继承,封装的方法构思代码思路,用tdd和单元测试的方法逐步测试代码。

推荐阅读