java實驗二實驗報告
實驗內容
1. 初步掌握單元測試和TDD
2. 理解並掌握面向對象三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 了解設計模式
實驗要求
1.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什么啟示,有什么收獲,教訓等)。報告可以參考范飛龍老師的指導
3. 嚴禁抄襲,有該行為者實驗成績歸零,並附加其他懲罰措施。
4. 請大家先在實驗樓中的~/Code
目錄中用自己的學號建立一個目錄,代碼和UML圖要放到這個目錄中,截圖中沒有學號的會要求重做,然后跟着下面的步驟練習。
實驗步驟
(一)單元測試
用程序解決問題時,學會寫三種碼:偽代碼、產品代碼、測試代碼
例:們要在一個MyUtil
類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能
建立一個目錄:
(1)偽代碼:
百分制轉五分制:
如果成績小於60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
(2)產品代碼:


先寫測試代碼了。這種先寫測試代碼
,然后再寫產品代碼
的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:
- 明確當前要完成的功能,記錄成一個測試列表
- 快速完成編寫針對此功能的測試用例
- 測試代碼編譯不通過(沒產品代碼呢)
- 編寫產品代碼
- 測試通過
- 對代碼進行重構,並保證測試通過(重構下次實驗練習)
- 循環完成所有功能的開發
基於TDD,我們不會出現過度設計的情況,需求通過測試用例表達出來了,我們的產品代碼
只要讓測試通過就可以了。 Java中有單元測試工具JUnit來輔助進行TDD,我們用TDD的方式把前面百分制轉五分制的例子重寫一次,
具體操作如下圖:
二)面向對象三要素
(1)抽象
抽象一詞的本意是指人在認識思維活動中對事物表象因素的舍棄和對本質因素的抽取。抽象是人類認識復雜事物和現象時經常使用的思維工具,抽象思維能力在程序設計中非常重要,"去粗取精、化繁為簡、由表及里、異中求同"的抽象能力很大程度上決定了程序員的程序設計能力。 抽象就是抽出事物的本質特征而暫時不考慮他們的細節。對於復雜系統問題人們借助分層次抽象的方法進行問題求解;在抽象的最高層,可以使用問題環境的語言,以概括的方式敘述問題的解。在抽象的較低層,則采用過程化的方式進行描述。在描述問題解時,使用面向問題和面向實現的術語。 程序設計中,抽象包括兩個方面,一是過程抽象,二是數據抽象。
(2)封裝、繼承與多態
面向對象(Object-Oriented)的三要素包括:封裝、繼承、多態。面向對象的思想涉及到軟件開發的各個方面,如面向對象分析(OOA)、面向對象設計(OOD)、面向對象編程實現(OOP)。OOA根據抽象關鍵的問題域來分解系統,關注是什么(what)。OOD是一種提供符號設計系統的面向對象的實現過程,用非常接近問題域術語的方法把系統構造成“現實世界”的對象,關注怎么做(how),通過模型來實現功能規范。OOP則在設計的基礎上用編程語言(如Java)編碼。貫穿OOA、OOD和OOP的主線正是抽象。 OOD中建模會用圖形化的建模語言UML(Unified Modeling Language),UML是一種通用的建模語言,我們實驗中使用umbrello進行建模,Windows中推薦大家使用 StarUML。
過程抽象的結果是函數,數據抽象的結果是抽象數據類型(Abstract Data Type,ADT),類可以作具有繼承和多態機制的ADT。數據抽象才是OOP的核心和起源。
,封裝就是將數據與相關行為包裝在一起以實現信息就隱藏。Java中用類進行封裝,
封裝實際上使用方法(method)將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度,從而帶來模塊化(Modularity)和信息隱藏(Information hiding)的好處;接口(interface)是封裝的准確描述手段。 Dog
類通過使用類和訪問控制(private,public)隱藏了屬性color
,開放了接口setColor()
,getColor()
,bark()
和toString
。Dog
類是一個模塊,我們可以通過下面的代碼使用它,測試代碼與運行結果如下:




(三)設計模式初步
(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)設計模式實示例
-
- attern 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。
-
//偽代碼 類有虛部實部 復數的加法運算 復數的減法運算 復數的乘法運算 復數的除法運算
//產品代碼
-
2.自己的PSP(Personal Software Process)時間
步驟 耗時百分比 需求分別析 10% 設計 5% 代碼實現 50% 測試 20% 分析總結 15% 4.總結單元測試的好處
- 單元測試可以讓我們復習前幾周學過的內容,加深印象,知道本章學習內容的使用方法,了解相關知識的應用方面。周而復始的復習前面學過的知識,可以讓我們學的更加牢固,學的更加扎實。堅持敲代碼,也會使我們的編程思維變得更加嚴謹,思維更加慎密。
遇到的問題及解決方法
1.eclipse敲代碼時,總會忘記打分號,或者忘記切換輸入法就打分號了。時刻提醒自己,認真編寫。
2.設計復數類Complex偽代碼時不知道該如何弄,查閱資料,自己理解后,嘗試編寫除了代碼。
實驗收獲
本次實驗讓我了解到想用程序解決實際問題時,最好寫出三種代碼:偽代碼、產品代碼、測試代碼,這樣才能快速的寫出代碼,並且實用性強。
單元測試讓我復習了學過的知識,加深了印象。希望以后能通過實驗了解更多運用java解決實際問題的方法,學好Java。