Java實驗二
課程:移動平臺應用開發實踐 班級: 9217
姓名:蔡斌思 學號:20159217
成績: 指導教師:婁嘉鵬 實驗日期:2015.10.11
實驗密級: 預習程度: 實驗時間:
儀器組次: 必修/選修:選修 實驗序號:1
實驗名稱:Java面向對象程序設計
實驗目的與要求:
1. 初步掌握單元測試和TDD
2. 理解并掌握面向對象三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 了解設計模式
實驗要求:
1.沒有Linux基礎的同學建議先學習《Linux基本入門(新版)》《Vim編輯器》課程
2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行 等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什么啟示,有什么收獲,教訓等)。報告可以參考范飛龍老 師的指導。
3. 嚴禁抄襲,有該行為者實驗成績歸零,并附加其他懲罰措施。
4. 請大家先在實驗樓中的~/Code目錄中用自己的學號建立一個目錄,代碼和UML圖要放到這個目錄中,截圖中沒有學號的會要求重做,然后跟著下面的步驟練 習。

實驗儀器:
|
名稱 |
型號 |
數量 |
|
PC |
|
1 |
|
虛擬機 |
實驗樓 |
1
|
實驗步驟:
(一)單元測試
(1)三種代碼:偽代碼、產品代碼、測試代碼
以“百分制轉五分制”為例,介紹三種代碼:
偽代碼(使用偽碼的目的是使被描述的算法可以容易地以任何一種編程語言實現,使用偽代碼, 不用拘泥于具體實現)
/*
百分制轉五分制:
如果成績小于60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
*/
產品代碼(把偽代碼寫成java語句的形式)

測試代碼(測試是為某個特殊目標而編制的一組測試輸入、執行條件以及預期結果,以便測試某個程序路徑或核實是否滿足某個特定需求)

在具體測試中,發現了兩個bug,一個是在判斷不及格時沒有要求大于等于零,另一個是沒有考慮100的情況。因此要添加grade<0的報錯以及修改grade<100為grade<=100。因此一般情況下測試代碼要比產品代碼要長一些。

(2)TDD(Test Driven Devlopment,測試驅動開發)
測試驅動開發(TDD):先寫測試代碼,再寫產品代碼,從而寫出來的代碼就是正確的
步驟如下:
明確當前要完成的功能,記錄成一個測試列表
快速完成編寫針對此功能的測試用例
測試代碼編譯不通過(無產品代碼?)
編寫產品代碼
對代碼進行重構,并保證測試通過(重構下次實驗練習)
循環完成所有功能的開發
Eclipse->File->New->Java Project新建一個TDDDemo的Java項目
TDDDemo->右鍵->New->Source Folder新建一個測試目錄test
Test->右鍵->New->JUnit Test Case新建一個測試用例類MyUtilTest并輸入代碼(由于沒有建立MyUtil類以及percentage2fivegrade方法,所以有紅字出現):

在TDDDemo的src目錄中新建MyUtil的類,并實現percentage2fivegrade方法:

我們把鼠標放到MyUtilTest.java上,單擊右鍵,選擇Run as->JUnit Test。測試結果出現了一個紅條(red bar),說明測試沒通過:

問題出現在第十行55期望結果是不及格,但是沒有具體的代碼,所以只能報出錯誤,因此要修改一下MyUtil.java,再次進行測試時,得到了綠條,說明測試已通過:

在這個基礎上我們對測試進行拓展優化,增加異常情況用例和邊界用例,出現錯誤后有增加了一條語句出現綠條:

TDD的編碼節奏是:
·增加測試代碼,JUnit出現紅條
·修改產品代碼
·JUnit出現綠條,任務完成
(二)面向對象三要素
(1)抽象
抽象是指人在認識思維活動中對事物表象因素的舍棄和對本質因素的抽取。包括兩個方面,一是過程抽象,二是數據抽象。過程抽象的結果是函數,數據抽象的結果是抽象數據類型(Abstract Data Type,ADT)
(2) 封裝,繼承與多態
面向對象三要素:封裝、繼承、多態。面向對象的思想涉及到軟件開發的各個方面,如面向對象分析(OOA)、面向對象設計(OOD)、面向對象編程實現(OOP)。OOA根據抽象關鍵的問題域來分解系統,關注是什么(what)。OOD是一種提供符號設計系統的面向對象的實現過程,用非常接近問題域術語的方法把系統構造成“現實世界”的對象,關注怎么做(how),通過模型來實現功能規范。OOP則在設計的基礎上用編程語言(如Java)編碼。貫穿OOA、OOD和OOP的主線正是抽象。
封裝實際上使用方法(method)將類的數據隱藏起來,控制用戶對類的修改和訪問數據的程度,從而帶來模塊化(Modularity)和信息隱藏(Information hiding)的好處;接口(interface)是封裝的準確描述手段。
首先嘗試一下封裝:


我們可以用UML中的類圖來描述類Dog,首先我們在實驗樓的環境中打開shell,在命令行中輸入umbrello,打開UML建模軟件umbrello.
UML建模之后的模型如下:

對應測試代碼和運行結果如下:

實踐發現Dog.java和Cat.java中有很多冗余的地方,所以重新定義了一下uml中繼承表示:

(三)設計模式初步
(1)S.O.L.I.D
面向對象三要素是“封裝、繼承、多態”,任何面向對象編程語言都會在語法上支持這三要素。如何借助抽象思維用好三要素特別是多態還是非常困難的,S.O.L.I.D類設計原則是一個很好的指導
基于OCP,利用面向對象中的多態性(Polymorphic),更靈活地處理變更擁抱變化,OCP可以用以下手段實現:(1)抽象和繼承,(2)面向接口編程
LSP的核心思想是父類型對象可以被子類型對象所取代
(2)模式與設計模式
模式是某外在環境下﹐對特定問題的慣用解決之道,其中最重要的是設計模式
(3)設計模式實示例
設計模式提供一個用于細化軟件系統的子系統或組件,或它們之間的關系圖,它描述通信組件的公共再現結構,通信組件可以解決特定語境中的一個設計問題
(四)練習
使用TDD方式設計并實現復數類Complex
偽代碼:
設計一個復數類,將復數的實部和虛部分別用變量表示。
通過實部和虛部分別相加減實現復數的相加減。
按照復數的格式將復數打印出來。
產品代碼:



|
步驟 |
耗時 |
百分比 |
|
需求分析 |
0.5h |
10% |
|
設計 |
1h |
20% |
|
代碼實現 |
1.5h |
30% |
|
測試 |
1h |
20% |
|
分析總結 |
1h |
20%
|
單元測試的好處:
經過單元測試的代碼,質量能夠得到保證。
單元測試發現的問題很容易定位。
修改代碼犯的錯,經過單元測試易發現。
(五)總結
實驗收獲:
這次實驗盡管花了很多時間,但是我也收獲了很多。首先,通過這次實驗,我對虛擬機的使用更加熟悉,也更加適應這種實驗模式,對于虛擬機內代碼編碼更加熟悉迅速。學習到單元測試這個方便快捷并且高質量的測試方式,同時實驗中一步一步地引導我學會處理可能出現的種種問題,同時也教會我以后在編寫程序的時候要考慮到各種可能性,以提高代碼的安全性。
出現的問題和解決方案:
首先由于內網原因,實驗樓的UML沒有安裝上,通過詢問老師并自己實踐,用update語句和--fix-missing語句成功安裝上。
其次由于網絡很慢,實驗樓內總是卡,所以浪費了很長的時間,解決方案是我在Windows下下了一個eclipse,然后用自己的eclipse進行編碼,節省了不必要的時間浪費,大大加快了速度。
posted on 2015-10-11 16:08 20159217蔡斌思 閱讀(216) 評論(0) 收藏 舉報
浙公網安備 33010602011771號