標籤:
北京電子科技學院(BESTI)
實 驗 報 告
課程:Java程式設計 班級:1352 姓名:呂松鴻 學號:20135229
成績: 指導教師:婁嘉鵬 實驗日期:2015.5.6
實驗密級: 預習程度: 實驗時間:15:50--21:50
儀器組次:29 必修/選修: 選修 實驗序號:02
實驗名稱:實驗二 Java物件導向程式設計實驗內容
1. 初步掌握單元測試和TDD
2. 理解並掌握物件導向三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 瞭解設計模式實驗要求1.完成實驗、撰寫實驗報告,實驗報告以部落格方式發表在部落格園,注意實驗報告重點是
運行結果,遇到的
問題(工具尋找,安裝,使用,程式的編輯,調試,運行等)、
解決辦法(空洞的方法如“查網路”、“問同學”、“看書”等一律得0分)以及
分析(從中可以得到什麼啟示,有什麼收穫,教訓等)。
2.請大家先在實驗樓中的~/Code目錄中用自己的學號建立一個目錄,代碼和UML圖要放到這個目錄中,中沒有學號的會要求重做,然後跟著下面的步驟練習。
實驗儀器:
名稱 |
型號 |
數量 |
PC |
dell |
1 |
實驗樓環境 |
/ |
1 |
Eclipse |
/ |
1 |
一、實驗內容及步驟
(一)單元測試
(1) 三種代碼
1、 三種代碼
需求:我們要在一個MyUtil類中解決一個百分製成績轉成“優、良、中、及格、不及格”五級製成績的功能。
(1)虛擬碼
百分制轉五分制: 如果成績小於60,轉成“不及格” 如果成績在60與70之間,轉成“及格” 如果成績在70與80之間,轉成“中等” 如果成績在80與90之間,轉成“良好” 如果成績在90與100之間,轉成“優秀” 其他,轉成“錯誤”
(2)產品代碼
(3)測試代碼
2.TDD(Test Driven Devlopment, 測試驅動開發)
(1)概念:先寫測試代碼,然後再寫產品代碼的開發方法叫“測試驅動開發”(TDD)。
(2)TDD的一般步驟如下:
• 明確當前要完成的功能,記錄成一個測試清單
• 快速完成編寫針對此功能的測試案例
• 測試代碼編譯不通過(沒產品代碼呢)
• 編寫產品代碼
• 測試通過
• 對代碼進行重構,並保證測試通過(重構下次實驗練習)
• 迴圈完成所有功能的開發
(3)優勢:基於TDD,我們不會出現過度設計的情況,需求通過測試案例表達出來了,我們的產品代碼只要讓測試通過就可以了。
(4)將百分制轉五分制改寫成TDD
代碼階層:
建立一個測試案例類:
(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類圖要展示類之間的靜態關係,AnimalTest類依賴Dog類和Cat類,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)設計模式實樣本
設計模式有四個基本要素:
- Pattern name:描述模式,便於交流,存檔
- Problem:描述何處應用該模式
- Solution:描述一個設計的組成元素,不針對特例
- Consequence:應用該模式的結果和權衡(trade-offs)
Java類庫中大量使用設計模式:
- Factory:java.util.Calendar
- Compsite:java.awt.Container
- Decorator:java I/0
- Iterator:java.util.Enumeration
- Strategy:java.awt.LayoutManager
(四)練習1使用TDD的方式設計關實現複數類Complex。
(1)虛擬碼
複數類Complex
複數=實部數+虛部數 i
複數相加 = (實部+實部) + (虛部 + 虛部)i
複數相減 = (實部-實部) + (虛部 - 虛部)i
列印複數:
虛部大於0 "實部"+"+"+"虛部"+"i"
虛部小於0 "實部"+"虛部"+"i"
虛部為0 "實部"
(2)產品代碼
public class Complex {
private int shi,xu;
Complex(){
this.shi=0;
this.xu=0;
}
Complex(int shi){
this.shi=shi;
this.xu=0;
}
Complex(int shi,int xu){
this.shi=shi;
this.xu=xu;
}
public void addFu(Complex p1,Complex p2){
System.out.println("這兩個複數的和為:");
this.shi=p1.shi+p2.shi;
this.xu=p1.xu+p2.xu;
print();
}
public void minusFu(Complex p1,Complex p2){
System.out.println("這兩個複數的差為:");
this.shi=p1.shi-p2.shi;
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.shi+"+"+this.xu+"i");
}else if(this.xu<0){
System.out.println(this.shi+""+this.xu+"i");
}else{
System.out.println(this.shi);
}
}
}
(3)測試代碼
3.實驗報告中統計自己的PSP(Personal Software Process)時間
步驟 |
耗時 |
百分比 |
需求分析 |
1h |
18% |
設計 |
1h |
25% |
代碼實現 |
1.5h |
21% |
測試 |
1h |
21% |
分析總結 |
0.5h |
15% |
4.總結單元測試的好處
(1)可以放心的修改測試用代碼而不用擔心會影響設計的測試代碼。
(2)測試本身是被測代碼的用法說明,替代了一部分代碼功能,迫使自己要將被測代碼設計得更加獨立地去完成某個或某幾個功能。
參考資料
1.《UML精粹》
2.《構建之法 (電子版)》,著者鄒欣Blog
3.《深入淺出設計模式》
4.《解析極限編程》
5.《單元測試之道》
- 《代碼大全》
- 《代碼的抽象三原則》
工具
- JUnit
- umbrello
- StarUML
JAVA課程實驗報告 實驗二 Java物件導向程式設計