JAVA課程實驗報告 實驗二 Java物件導向程式設計

來源:互聯網
上載者:User

標籤:

北京電子科技學院(BESTI)

             

課程:Java程式設計  班級:1353  姓名:韓玉琪  學號:20135317

成績:             指導教師:婁嘉鵬    實驗日期:2015.5.6

實驗密級:         預習程度:         實驗時間:15:50--20:50

儀器組次:         必修/選修: 選修            實驗序號:2

實驗名稱:實驗二 Java物件導向程式設計                                          

實驗目的與要求:

1. 初步掌握單元測試和TDD                               

2. 理解並掌握物件導向三要素:封裝、繼承、多態    

3. 初步掌握UML建模                                         

4. 熟悉S.O.L.I.D原則                                       

5. 瞭解設計模式                                              

 

實驗儀器:

名稱

型號

數量

PC

Lenovo

1

實驗樓環境

/

1

Eclipse

/

1

 

 

一、實驗內容及步驟

(一)單元測試

1、 三種代碼

需求:我們要在一個MyUtil類中解決一個百分製成績轉成“優、良、中、及格、不及格”五級製成績的功能。

(1)虛擬碼

 

(2)產品代碼

 

(3)測試代碼

 

因為是自己寫的代碼,沒有照著提示一步步做,所以,沒有出現很多問題。

2、TDD(Test Driven Devlopment, 測試驅動開發)

(1)概念:先寫測試代碼,然後再寫產品代碼的開發方法叫“測試驅動開發”(TDD)。

(2)TDD的一般步驟如下:

•  明確當前要完成的功能,記錄成一個測試清單

•  快速完成編寫針對此功能的測試案例

•  測試代碼編譯不通過(沒產品代碼呢)

•  編寫產品代碼

•  測試通過

•  對代碼進行重構,並保證測試通過(重構下次實驗練習)

•  迴圈完成所有功能的開發

(3)優勢:基於TDD,我們不會出現過度設計的情況,需求通過測試案例表達出來了,我們的產品代碼只要讓測試通過就可以了。

(4)將百分制轉五分制改寫成TDD

代碼階層:

 

運行:

 

假設開始沒有將100考慮進去(錯誤情況):

 

(5)TDD的編碼節奏是:

•  增加測試代碼,JUnit出現紅條

•  修改產品代碼

•  JUnit出現綠條,任務完成

(二)物件導向三要素

1、抽象

(1)“去粗取精、化繁為簡、由表及裡、異中求同”的能力

(2)過程抽象、資料抽象

2、封裝、繼承與多態

(1)物件導向的三要素:封裝、繼承、多態。

(2)物件導向的思想涉及到軟體開發的各個方面,如物件導向分析(OOA)、物件導向設計(OOD)、物件導向編程實現(OOP)。OOA根據抽象關鍵的問題域來分解系統,關注是什麼(what)。貫穿OOA、OOD和OOP的主線正是抽象。

OOD中建模會用圖形化的建模語言UML(Unified Modeling Language),UML是一種通用的建模語言。

(3)封裝

封裝實際上使用方法(method)將類的資料隱藏起來,控制使用者對類的修改和訪問資料的程度,從而帶來模組化(Modularity)和資訊隱藏(Information hiding)的好處;介面(interface)是封裝的準確描述手段。

3、例

(1)Dog類通過使用類和存取控制(private,public)隱藏了屬性color,開放了介面setColor(),getColor(),bark()和toString。Dog類是一個模組,我們可以通過下面的代碼使用它,測試代碼與運行結果如下:

 

 

(2)我們可以用UML中的類圖來描述類Dog:

 

在UML 裡,一個類的屬效能顯示它的名字,類型,初始化值,屬性也可以顯示private,public,protected。 類的方法能顯示它們的方法名,參數,傳回型別,以及方法的private,public,protected屬性。其中:•    +表示public •    #表示 protected •    -表示 private

使用UML可以讓我們不必關注細節。

(3)這時的測試類別:

 

注意:UML類圖要展示類之間的靜態關係,AnimalTest類依賴Dog類和Cat類,UML中依賴用帶箭頭的直線表示。

對應代碼:

 

(3)Dog類和Cat類都有Color屬性和相應的set和get方法,明顯違反了前面提到的DRY原則,我們可以通過繼承解決這個問題,把Color屬性和相應方法放到父類Animal中,如以下UML較圖所示:

(注意UML類圖中繼承的標記法,是用一個帶三角的直線指向父類)

 

以封裝為基礎,繼承可以實現代碼複用,需要注意的是,繼承更重要的作用是實現多態。多態是物件導向程式設計的靈活性和可擴充性的基礎。

我們再看看上一個類圖,我們可以進一步抽象,把Dog類中的bark()和Cat類中的meow()抽象成一個抽象方法shout(),Dog類和Cat類中覆蓋這個方法,如以下UML圖所示:

 

代碼運行:

 

(三)設計模式初步

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。

(1)虛擬碼

 

(2)產品代碼

//複數列印、相加、相減

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);

         }

    }

}

(3)測試代碼

 

(4)編寫代碼時遇到的問題

(開始的時候沒有把功能抽取出來,寫的很多,然後抽取了print功能就少了很多。)

最開始設計的虛擬碼是這樣的:

 

然後設計的代碼測試出來是這樣的:

 

虛數部分如果為負數列印出來“+ -”兩個符號。所以將兩種情況分開就好了。

2、實驗報告中統計自己的PSP(Personal Software Process)時間

步驟

耗時

百分比

需求分析

25min

18%

設計

35min

25%

代碼實現

30min

21%

測試

30min

21%

分析總結

20min

15%

3.總結單元測試的好處

(1)使可以放心的修改測試用代碼而不用擔心會影響設計的測試代碼。

(2)從調用者的角度看自己寫的代碼,與從編寫的角度還是不太一樣的,在編寫者的角度,就會想著如何方便迅速的完成整個代碼,但是從調用者的角度,就會考慮別人使用的時候是否方便,更注重測試和調用。

(3)測試本身是被測代碼的用法說明,替代了一部分代碼功能,迫使自己要將被測代碼設計得更加獨立地去完成某個或某幾個功能。

 

JAVA課程實驗報告 實驗二 Java物件導向程式設計

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.