課程:Java程序設計????????? 班級: 1352???????
姓名:黃衛 ??????????????? 學號:20135221
成績:???????????? 指導教師:婁嘉鵬?????? 實驗日期:2015.05.05
實驗密級:???????? 預習程度:???????????? 實驗時間:8:30~12:30
儀器組次:??????? 必修/選修:選修?????? 實驗序號:2
實驗名稱:Java面向對象程序設計?????????????????????????????????????????????????????????
實驗目的與要求:
一、實驗內容
1. 初步掌握單元測試和TDD
2. 理解并掌握面向對象三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 了解設計模式
二、實驗要求
1.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什么啟示,有什么收獲,教訓等)。報告可以參考范飛龍老師的指導
3. 嚴禁抄襲,有該行為者實驗成績歸零,并附加其他懲罰措施。
4. 請大家先在實驗樓中的~/Code目錄中用自己的學號建立一個目錄,代碼和UML圖要放到這個目錄中,截圖中沒有學號的會要求重做,然后跟著下面的步驟練習。
三、實驗步驟
(一)單元測試
(1) 三種代碼
- 偽代碼
- 產品代碼
- 測試代碼
我們通過一個例子說明如何寫這三種代碼。
需求:我們要在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
//偽代碼:
百分制轉五分制:
如果成績小于60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
//產品代碼:
翻譯好的MyUtil.java如下:
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成績小于60,轉成“不及格”
if (grade < 60)
return "不及格";
//如果成績在60與70之間,轉成“及格”
else if (grade < 70)
return "及格";
//如果成績在70與80之間,轉成“中等”
else if (grade < 80)
return "中等";
//如果成績在80與90之間,轉成“良好”
else if (grade < 90)
return "良好";
//如果成績在90與100之間,轉成“優秀”
else if (grade < 100)
return "優秀";
//其他,轉成“錯誤”
else
return "錯誤";
}
}
//測試代碼:
public class MyUtilTest {
public static void main(String[] args) {
// 百分制成績是50時應該返回五級制的“不及格”
if(MyUtil.percentage2fivegrade(50) != "不及格")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}
(2) TDD(Test Driven Devlopment, 測試驅動開發)
先寫測試代碼,然后再寫產品代碼的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:
- 明確當前要完成的功能,記錄成一個測試列表
- 快速完成編寫針對此功能的測試用例
- 測試代碼編譯不通過(沒產品代碼呢)
- 編寫產品代碼
- 測試通過
- 對代碼進行重構,并保證測試通過(重構下次實驗練習)
- 循環完成所有功能的開發
基于TDD,我們不會出現過度設計的情況,需求通過測試用例表達出來了,我們的產品代碼只要讓測試通過就可以了。 Java中有單元測試工具JUnit來輔助進行TDD,我們用TDD的方式把前面百分制轉五分制的例子重寫一次,體會一下有測試工具支持的開發的好處。 打開Eclipse,單擊File->New->Java Project新建一個TDDDemo的Java項目:我們在TDDDemo項目中,把鼠標放到項目名TDDDemo上,單擊右鍵,在彈出的菜單中選定New->Source Folder新建一個測試目錄test,我們把鼠標放到test目錄上,單擊右鍵,在彈出的菜單中選定New->JUnit Test Case新建一個測試用例類MyUtilTest,
我們增加第一個測試用例testNormal,注意測試用例前一定要有注解@Test,測試用例方法名任意,輸入以下代碼:
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
@Test
public void testNormal() {
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("優秀", MyUtil.percentage2fivegrade(95));
}
}
輸入完畢
紅叉說明代碼存在語法錯誤,原因很簡單,MyUtil類還不存在,類中的percentage2fivegrade方法也不存在,我們在TDDDemo的src目錄中新建一個MyUtil的類,并實現percentage2fivegrade方法
現在測試代碼沒有語法錯誤了,我們把鼠標放到MyUtilTest.java上,單擊右鍵,選擇Run as->JUnit Test
測試結果出現了一個綠條(green bar),說明測試通過了。
TDD的編碼節奏是:
- 增加測試代碼,JUnit出現紅條
- 修改產品代碼
- JUnit出現綠條,任務完成
(二)面向對象三要素
(1)抽象
(2)封裝、繼承與多態
(三)設計模式初步
(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,依賴倒置原則)
(四)練習
1使用TDD的方式設計關實現復數類Complex。
2.實驗報告中統計自己的PSP(Personal Software Process)時間
??????
?? 步驟 ?? | ?? 耗時 ?? | ?? 百分比 ?? |
需求分析 | 30min | 12.5% |
設計 | 60min | 25% |
代碼實現 | 60min | 25% |
測試 | 60min | 25% |
分析總結 | 30min | 12.5% |
3. 實現要有偽代碼,產品代碼,測試代碼。
4.總結單元測試的好處
實驗截圖
?
?
?
?
?
?
(三)設計模式初步
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,依賴倒置原則)
OCP是OOD中最重要的一個原則,OCP的內容是:
software entities (class, modules, function, etc.) should open for extension,but closed for modification.
軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。
三、遇到的問題及解決方法
出現的問題:
1.在單元測試的編寫中,由于網絡信號不穩定,而且虛擬機運行非常慢,以致這次實驗非常耗費時間,只能慢慢一步一步截圖
2.這次實驗中由于得知實驗樓截圖只能截4張,因此選擇用自己的截圖工具進行截圖
3測試代碼的編寫過程中因為不太熟悉程序,編寫所以測試代碼出現了很多問題,花費了很多時間去修改。
四、實驗收獲
本次實驗讓我更進一步的了解了java這一門課程的難度,對于我這種“差生”可能學習起來還是有一點吃力的。
這次實驗讓我體會到了面向對象的編程工具和面向對象的編程工具之間的區別,面向對象我們通過封裝對象,可以通過建模的方式進行代碼編寫,這樣可以使我們將更大的精力用在類的設計而非代碼編寫上。
(三)設計模式初步
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,依賴倒置原則)
OCP是OOD中最重要的一個原則,OCP的內容是:
software entities (class, modules, function, etc.) should open for extension,but closed for modification.
軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。
三、遇到的問題及解決方法
出現的問題:
1.在單元測試的編寫中,由于網絡信號不穩定,而且虛擬機運行非常慢,以致這次實驗非常耗費時間,只能慢慢一步一步截圖
2.這次實驗中由于得知實驗樓截圖只能截4張,因此選擇用自己的截圖工具進行截圖
3測試代碼的編寫過程中因為不太熟悉程序,編寫所以測試代碼出現了很多問題,花費了很多時間去修改。
四、實驗收獲
本次實驗讓我更進一步的了解了java這一門課程的難度,對于我這種“差生”可能學習起來還是有一點吃力的。
這次實驗讓我體會到了面向對象的編程工具和面向對象的編程工具之間的區別,面向對象我們通過封裝對象,可以通過建模的方式進行代碼編寫,這樣可以使我們將更大的精力用在類的設計而非代碼編寫上。
(三)設計模式初步
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,依賴倒置原則)
OCP是OOD中最重要的一個原則,OCP的內容是:
software entities (class, modules, function, etc.) should open for extension,but closed for modification.
軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。
三、遇到的問題及解決方法
出現的問題:
1.在單元測試的編寫中,由于網絡信號不穩定,而且虛擬機運行非常慢,以致這次實驗非常耗費時間,只能慢慢一步一步截圖
2.這次實驗中由于得知實驗樓截圖只能截4張,因此選擇用自己的截圖工具進行截圖
3測試代碼的編寫過程中因為不太熟悉程序,編寫所以測試代碼出現了很多問題,花費了很多時間去修改。
四、實驗收獲
本次實驗讓我更進一步的了解了java這一門課程的難度,對于我這種“差生”可能學習起來還是有一點吃力的。
這次實驗讓我體會到了面向對象的編程工具和面向對象的編程工具之間的區別,面向對象我們通過封裝對象,可以通過建模的方式進行代碼編寫,這樣可以使我們將更大的精力用在類的設計而非代碼編寫上。