天天看點

實驗二 Java面向對象程式設計 20135321

課程:Java程式設計   班級:1353    姓名:餘佳源  學号:20135321

成績:             指導教師:婁嘉鵬      實驗日期:2015-5-8

實驗密級:         預習程度:           實驗時間:3:15~6:45

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

實驗名稱:                Java面向對象程式設計                           

實驗目的與要求:                                                        

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

2. 了解并掌握面向對象三要素:封裝、繼承、多态                                                                        

3. 初步掌握UML模組化                                                       

4. 熟悉S.O.L.I.D原則編輯器》 課程                                              

5. 了解設計模式                                            

6.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》課程       

7.完成實驗、撰寫實驗報告,實驗報告以部落格方式發表在部落格園,注意實驗報告重點是運作結果,遇到的問題(工具查找,安裝,使用,程式的編輯,調試,運作等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什麼啟示,有什麼收獲,教訓等)。

8.嚴禁抄襲,有該行為者實驗成績歸零,并附加其他懲罰措施。查找,9.請大家先在實驗樓中的~/Code目錄中用自己的學号建立一個目錄,代碼和UML圖要放到這個目錄中,截圖中沒有學号的會要求重做,然後跟着下面的步驟練習。           

實驗儀器:

名稱 型号 數量
Laptop Acer Aspire V5-473G 1

PS:實在沒有足夠的網速駕馭實驗樓,就在自己電腦做了。

實驗二 Java面向對象程式設計 20135321

實驗内容一

(一)單元測試

(1) 三種代碼

程式設計前要把幹什麼、如何幹想清楚才能把程式寫對、寫好。想用程式解決問題時,要會寫三種碼:

僞代碼

産品代碼

測試代碼

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

僞代碼:

 百分制轉五分制:

   如果成績小于60,轉成“不及格”

   如果成績在60與70之間,轉成“及格”

   如果成績在70與80之間,轉成“中等”

   如果成績在80與90之間,轉成“良好”

   如果成績在90與100之間,轉成“優秀”

   其他,轉成“錯誤”

産品代碼:

我們用java語言翻譯一下僞代碼,就是可用的産品代碼

實驗二 Java面向對象程式設計 20135321

其用到的測試代碼如下

實驗二 Java面向對象程式設計 20135321

測試一:選取某一合法輸入值進行測試

測試結果

實驗二 Java面向對象程式設計 20135321

測試二:再測試一下-10這錯誤資料,發現運作-10的結果不對

實驗二 Java面向對象程式設計 20135321

測試三:邊界測試,即0,60,70,80,90,100

測試結果為

僅以60分為例:

實驗二 Java面向對象程式設計 20135321

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

先寫測試代碼,然後再寫産品代碼的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:

l  明确目前要完成的功能,記錄成一個測試清單

l  快速完成編寫針對此功能的測試用例

l  測試代碼編譯不通過(沒産品代碼呢)

l  編寫産品代碼

l  測試通過

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

l  循環完成所有功能的開發

以程式為例

實驗二 Java面向對象程式設計 20135321

測試結果出現了一個綠條(green bar),說明測試通過了。TDD的目标是"Clean Code That Works",TDD的slogan是"Keep the bar green, to Keep the code clean"。

實驗二 Java面向對象程式設計 20135321

(三)面向對象三要素

1.抽象

抽象就是抽出事物的本質特征而暫時不考慮他們的細節。對于複雜系統問題人們借助分層次抽象的方法進行問題求解;在抽象的最高層,可以使用問題環境的語言,以概括的方式叙述問題的解。在抽象的較低層,則采用過程化的方式進行描述。在描述問題解時,使用面向問題和面向實作的術語。 程式設計中,抽象包括兩個方面,一是過程抽象,二是資料抽象。

2.封裝、繼承與多态

面向對象(Object-Oriented)的三要素包括:封裝、繼承、多态。

過程抽象的結果是函數,資料抽象的結果是抽象資料類型。

封裝實際上使用方法(method)将類的資料隐藏起來,控制使用者對類的修改和通路資料的程度,進而帶來子產品化(Modularity)和資訊隐藏(Information hiding)的好處;接口(interface)是封裝的準确描述手段。

實驗二 Java面向對象程式設計 20135321
實驗二 Java面向對象程式設計 20135321

範例用的umbrello圖

實驗二 Java面向對象程式設計 20135321

封裝為基礎,繼承可以實作代碼複用,需要注意的是,繼承更重要的作用是實作多态。 面向對象中允許不同類的對象對同一消息做出響應,即同一消息可以根據發送對象的不同而采用多種不同的行為方式,我們稱此現象為多态性。Java中,多态是指不同的類對象調用同一個簽名的成員方法時将執行不同代碼的現象。多态是面向對象程式設計的靈活性和可擴充性的基礎。

(四)設計模式初步

(1)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,依賴倒置原則)

OCP是OOD中最重要的一個原則,OCP的内容是:

software entities (class, modules, function, etc.) should open for extension,but closed for modification.

軟體實體(類,子產品,函數等)應該對擴充開放,對修改封閉。

對擴充開放(Open For Extension )要求軟體子產品的行為必須是可以擴充的,在應用需求改變或需要滿足新的應用需求時,我們要讓子產品以不同的方式工作; 對修改封閉(Closed for Modification )要求子產品的源代碼是不可改動的,任何人都不許修改已有子產品的源代碼。

 基于OCP,利用面向對象中的多态性(Polymorphic),更靈活地處理變更擁抱變化,OCP可以用以下手段實作:抽象和繼承和面向接口程式設計。

(2)模式與設計模式

模式是某外在環境(Context) 下﹐對特定問題(Problem)的慣用解決之道。其中最重要的是設計模式。

• GRASP模式

• 分析模式

• 軟體體系結構模式

• 設計模式:建立型,結構型,行為型

• 管理模式: The Manager Pool 實作模式

• 界面設計互動模式

(3)設計模式實示例

設計模式四個基本元素

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

Problem:描述何處應用該模式

Solution:描述一個設計的組成元素,不針對特例

Consequence:應用該模式的結果和權衡

設計模式提供一個用于細化軟體系統的子系統或元件,或它們之間的關系圖,它描述通信元件的公共再現結構,通信元件可以解決特定語境中的一個設計問題。

我們通過例子來學習一個設計模式(抽象工廠模式),并了解設計模式可能會存在的過度設計問題以及如何避免它。 我們設計了一個文檔系統,如下圖UML類

實驗二 Java面向對象程式設計 20135321

對應的代碼如下:

實驗二 Java面向對象程式設計 20135321

結果如圖

實驗二 Java面向對象程式設計 20135321

客戶如果要求系統支援Float類,這是一個合理的要求,要支援Float類,Document類要修改兩個地方,這違反了OCP原則,使用多态可以解決部分問題:

實驗二 Java面向對象程式設計 20135321

要支援Float類,Document類要修改構造方法,這還違反了OCP原則。封裝、繼承、多态解決不了問題了,這時需要設計模式了:

實驗二 Java面向對象程式設計 20135321

修改得代碼截圖

實驗二 Java面向對象程式設計 20135321

(五)練習

使用TDD的方式設計關實作複數類Complex。

l  複數的實部為0,虛部為0

l  複數的實部為0,虛部為對應數

l  複數的實部為對應數,實部為0

l  兩參數分别為實部與虛部

l  實作兩複數的加法、減法、乘法。

實驗二 Java面向對象程式設計 20135321
實驗二 Java面向對象程式設計 20135321

測試資料以及運作結果

實驗二 Java面向對象程式設計 20135321

總結時間:

PSP時間統計

統計有誤差,總計3.5小時。

步驟 耗時 百分比
需求分析 25mins 12%
設計 30mins 14.3%
代碼實作 120mins 57.1%
測試
分析總結 5mins 2.3%

總結單元測試的好處:

1. 在單元測試中,設計的軟體的獨立單元将在與程式的其他部分相隔離的情況下通過測試代碼的測試來查找錯誤,進而寫出更高品質的産品代碼,提高程式設計的水準和技巧。

2. 單元測試代碼可以通過簡單的程式代碼行之間的復原功能在編譯和運作環境上做基于真實資料的測試,而不用擔心會産生不必要的資料,破壞到測試結果。

3. 更加明确開發的目的,避免出現重複或者過多冗長的工作,提升開發者的工作效率。

4. 将産品代碼和測試代碼分開,使程式員将軟體子產品寫得易于測試和調用,進而有利于被測代碼的使用,進而實作了一部分功能,更加友善使用者了解。

參考資料

1.《UML精粹》 2.《建構之法 (電子版)》,著者鄒欣Blog 3.《深入淺出設計模式》 4.《解析極限程式設計》 5.《單元測試之道》

1. 《代碼大全》

2. 《代碼的抽象三原則》

工具

1. JUnit

2. umbrello

3. StarUML