課程: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:實在沒有足夠的網速駕馭實驗樓,就在自己電腦做了。

實驗内容一
(一)單元測試
(1) 三種代碼
程式設計前要把幹什麼、如何幹想清楚才能把程式寫對、寫好。想用程式解決問題時,要會寫三種碼:
僞代碼
産品代碼
測試代碼
需求:我們要在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
僞代碼:
百分制轉五分制:
如果成績小于60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
産品代碼:
我們用java語言翻譯一下僞代碼,就是可用的産品代碼
其用到的測試代碼如下
測試一:選取某一合法輸入值進行測試
測試結果
測試二:再測試一下-10這錯誤資料,發現運作-10的結果不對
測試三:邊界測試,即0,60,70,80,90,100
測試結果為
僅以60分為例:
(二)TDD(Test Driven Devlopment, 測試驅動開發)
先寫測試代碼,然後再寫産品代碼的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:
l 明确目前要完成的功能,記錄成一個測試清單
l 快速完成編寫針對此功能的測試用例
l 測試代碼編譯不通過(沒産品代碼呢)
l 編寫産品代碼
l 測試通過
l 對代碼進行重構,并保證測試通過(重構下次實驗練習)
l 循環完成所有功能的開發
以程式為例
測試結果出現了一個綠條(green bar),說明測試通過了。TDD的目标是"Clean Code That Works",TDD的slogan是"Keep the bar green, to Keep the code clean"。
(三)面向對象三要素
1.抽象
抽象就是抽出事物的本質特征而暫時不考慮他們的細節。對于複雜系統問題人們借助分層次抽象的方法進行問題求解;在抽象的最高層,可以使用問題環境的語言,以概括的方式叙述問題的解。在抽象的較低層,則采用過程化的方式進行描述。在描述問題解時,使用面向問題和面向實作的術語。 程式設計中,抽象包括兩個方面,一是過程抽象,二是資料抽象。
2.封裝、繼承與多态
面向對象(Object-Oriented)的三要素包括:封裝、繼承、多态。
過程抽象的結果是函數,資料抽象的結果是抽象資料類型。
封裝實際上使用方法(method)将類的資料隐藏起來,控制使用者對類的修改和通路資料的程度,進而帶來子產品化(Modularity)和資訊隐藏(Information hiding)的好處;接口(interface)是封裝的準确描述手段。
範例用的umbrello圖
封裝為基礎,繼承可以實作代碼複用,需要注意的是,繼承更重要的作用是實作多态。 面向對象中允許不同類的對象對同一消息做出響應,即同一消息可以根據發送對象的不同而采用多種不同的行為方式,我們稱此現象為多态性。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類
對應的代碼如下:
結果如圖
客戶如果要求系統支援Float類,這是一個合理的要求,要支援Float類,Document類要修改兩個地方,這違反了OCP原則,使用多态可以解決部分問題:
要支援Float類,Document類要修改構造方法,這還違反了OCP原則。封裝、繼承、多态解決不了問題了,這時需要設計模式了:
修改得代碼截圖
(五)練習
使用TDD的方式設計關實作複數類Complex。
l 複數的實部為0,虛部為0
l 複數的實部為0,虛部為對應數
l 複數的實部為對應數,實部為0
l 兩參數分别為實部與虛部
l 實作兩複數的加法、減法、乘法。
測試資料以及運作結果
總結時間:
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