標籤:
課程:Java實驗 班級:201353 姓名:武西垚 學號:2015332
成績: 指導教師:婁佳鵬 實驗日期:15.05.05
實驗密級: 預習程度: 實驗時間:
儀器組次: 必修/選修:選修 實驗序號:2
實驗名稱:java物件導向程式設計
實驗目的與要求:
1. 初步掌握單元測試和TDD
2. 理解並掌握物件導向三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 瞭解設計模式
實驗要求
1.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
2.完成實驗、撰寫實驗報告,實驗報告以部落格方式發表在部落格園,注意實驗報告重點是運行結果,遇到的問題(工具尋找,安裝,使用,程式的編輯,調試,運行等)、解決辦法(空洞的方法如“查網路”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什麼啟示,有什麼收穫,教訓等)。報告可以參考範飛龍老師的指導
3. 嚴禁抄襲,有該行為者實驗成績歸零,並附加其他懲罰措施。
實驗儀器:
實驗內容、步驟與體會(附紙):
(一)單元測試
(1) 三種代碼
編程是智力活動,不是打字,編程前要把幹什麼、如何幹想清楚才能把程式寫對、寫好。與目前不少同學一說編程就開啟編輯器寫代碼不同,我希望同學們養成一個習慣,當你們想用程式解決問題時,要會寫三種碼:
(2) TDD(Test Driven Devlopment, 測試驅動開發)
(二)物件導向三要素
-
- +表示public
- #表示 protected
- -表示 private
(三)設計模式初步
(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)設計模式實樣本
- 設計模式(design pattern)提供一個用於細化軟體系統的子系統或組件,或它們之間的關係圖,它描述通訊組件的公用再現結構,通訊組件可以解決特定語境中的一個設計問題。
- (四)練習
- 使用TDD的方式設計關實現複數類Complex。
- 虛擬碼:
-
- 無輸入 --- 則複數的實部為0,虛部為0
- 僅輸入實部 --- 複數的實部為所輸入的實部,虛部為0
- 僅輸入虛部 --- 複數的實部為0,虛部為所輸入的虛部
- 實部虛部都輸入 --- 複數的實部與虛部對應相應輸入的實部虛部。
- 加法 --- 複數的實部與實部相加,虛部與虛部相加 ,即輸出p1.rePart+p2.rePart,p1.imPart+p2.imPart
- 減法 --- 複數的實部與實部相減,虛部與虛部相減 , 即輸出 p1.rePart-p2.rePart,p1.imPart-p2.imPart
產品代碼:
package Exercise;
public class Complex { double rePart,imPart; Complex() { this.rePart=0; this.imPart=0; } Complex(double rePart) { this.rePart=rePart; this.imPart=0; } Complex(double rePart,double imPart) { this.rePart=rePart; this.imPart=imPart; } Complex Jia(Complex p1,Complex p2) { Complex p =new Complex(p1.rePart+p2.rePart,p1.imPart+p2.imPart); return p; } Complex Jian(Complex p1,Complex p2) { Complex p =new Complex(p1.rePart-p2.rePart,p1.imPart-p2.imPart); return p; } void Print() { System.out.println("複數的值為:"); if(this.imPart!=0) System.out.println(this.rePart+"+"+this.imPart+"i"); else System.out.println(this.rePart); } }
測試代碼:
package Exercise;
public class Test { public static void main(String[] args) { Complex c=new Complex(); Complex c1=new Complex(2,7); Complex c2=new Complex(5,2); c1.Print(); c2.Print(); System.out.println("這兩複數和為:"); System.out.println((c.Jia(c1, c2).rePart+"+"+c.Jia(c1, c2).imPart+"i").toString()); System.out.println("這兩複數差為:"); System.out.println(c.Jian(c1, c2).rePart+"+"+c.Jian(c1, c2).imPart+"i"); } }
步驟 |
耗時 |
百分比 |
需求分析 |
5 |
6.25% |
設計 |
10 |
12.5% |
代碼實現 |
50 |
62.5% |
測試 |
10 |
12.5% |
分析總結 |
5 |
6.25% |
總結單元測試的好處:
1.單元測試能保證項目進度還能最佳化你的設計。
2.單元測試代碼可以通過簡單的交易回復功能在生產環境上做基於真實資料的測試而不用擔心會產生不必要的資料。
3. 單元測試能讓自己負責的模組功能定義盡量明確,模組內部的改變不會影響其他模組,而且模組的品質能得到穩定的、量化的保證。
遇到的問題:無
解決方案:
實驗總結:
本次實驗代碼較多,難度較大,花費了大量的時間,期間出現了各種大大小小的錯誤,但這也是對我的一次鍛煉,將對我未來的學習產生很大的協助。
JAVA第二次實驗