課程:Java程序設計 班級: 1351
姓名:王瑋怡 學號:20135116
成績: 指導教師:婁嘉鵬 實驗日期:2015.05.06
實驗密級: 預習程度: 實驗時間:14:00~20:00
儀器組次: 必修/選修:選修 實驗序號:2
實驗名稱:Java面向對象程序設計
實驗目的與要求:
1.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程
2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什么啟示,有什么收獲,教訓等)。報告可以參考范飛龍老師的指導
3. 嚴禁抄襲,有該行為者實驗成績歸零,並附加其他懲罰措施。
4. 請大家先在實驗樓中的~/Code目錄中用自己的學號建立一個目錄,代碼和UML圖要放到這個目錄中,截圖中沒有學號的會要求重做,然后跟着下面的步驟練習。
實驗儀器:
名稱 |
型號 |
數量 |
PC |
|
1 |
虛擬機 |
實驗樓 |
1 |
一、實驗內容:
1. 初步掌握單元測試和TDD
2. 理解並掌握面向對象三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 了解設計模式
二、實驗過程:
(一)單元測試
1.以“百分制轉五分制”為例,介紹三種代碼
(1)偽代碼 (2)產品代碼 (3)測試代碼
a.首先在虛擬機中建立一個以自己學號命名的文件夾,以存放自己實驗中的代碼、運行結果以及截圖
2.按照實驗說明里的要求,將代碼輸入,並運行出結果:
做以上內容時,沒有想到可以用學號命名。由於網絡信號不穩定,退出了實驗,以下內容為再次進入實驗樓后所做。
(2)TDD(Test Driven Devlopment, 測試驅動開發)
TDD的一般步驟如下:
- 明確當前要完成的功能,記錄成一個測試列表
- 快速完成編寫針對此功能的測試用例
- 測試代碼編譯不通過(沒產品代碼呢)
- 編寫產品代碼
- 測試通過
- 對代碼進行重構,並保證測試通過(重構下次實驗練習)
- 循環完成所有功能的開發
關於測試工具的使用:
打開Eclipse,單擊File->New->Java Project新建一個TDDDemo的Java項目;
在TDDDemo項目中,把鼠標放到項目名TDDDemo上,單擊右鍵,在彈出的菜單中選定New->Source Folder新建一個測試目錄test;
把鼠標放到test目錄上,單擊右鍵,在彈出的菜單中選定New->JUnit Test Case新建一個測試用例類MyUtilTest;
由此,根據給出的實驗代碼輸入,得出實驗結果:
(二)面向對象三要素
(1)抽象 (2)封裝、繼承、多態
用UML中的類圖來描述類Dog,首先在實驗樓的環境中打開shell,在命令行中輸入umbrello,打開UML建模軟件umbrello;
先單擊工具欄上的類圖標,再在class diagram(類圖)中單擊一下,會彈出一個聖誕框,輸入類名Dog;
把鼠標放到Dog類上,單擊右鍵,選擇Properties,在彈出的對話框中的Display中去掉Public Only選項;
把鼠標放到Dog類上,單擊右鍵,選擇New->Attribute,在彈出的對話框中的填好Type,Name,並選好Visibility;
把鼠標放到Dog類上,單擊右鍵,選擇New->Operation,在彈出的對話框中的填好Type,Name,並選好Visibility。
在UML 里,一個類的屬性能顯示它的名字,類型,初始化值,屬性也可以顯示private,public,protected。 類的方法能顯示它們的方法名,參數,返回類型,以及方法的private,public,protected屬性。其中:
- +表示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,依賴倒置原則)
OCP是OOD中最重要的一個原則,OCP的內容是:
- software entities (class, modules, function, etc.) should open for extension,but closed for modification.
- 軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。
三、遇到的問題及解決方法
出現的問題:在單元測試的編寫中,由於網絡信號不穩定,經常出現斷網、卡機等問題,只能等待網絡恢復,或者重新開啟虛擬機重新進行實驗,因此也耽誤了很多時間
另外一大問題就是,測試代碼的編寫過程中因為不太熟悉程序的編寫,最后是自己對照着產品代碼來寫的測試代碼,所以測試代碼出現了很多問題,花費了很多時間去修改。有的編寫代碼最終還是無法順利運行。
四、實驗收獲
這次實驗盡管花了很多時間,但是我也收獲了很多。首先,通過這次實驗,我對虛擬機的使用更加熟悉,也更加適應這種實驗模式。單元測試也幫助我提升了自己的能力,一步一步地引導我學會處理可能出現的種種問題,同時也教會我以后在編寫程序的時候要考慮到各種可能性,以提高代碼的安全性。
通過這次實驗,我還接觸到了很多以前沒有聽說過的知識,例如TDD,雖然陌生,處理起來比較吃力,但對我來說還是比較開眼界的。我覺得通過每一次的java實驗,不僅提高了我的學習能力,更培養了持之以恆的意識,雖然有些困難,仍然盡力去做,可能最后還是沒有結果,但是也會去努力一下。
五、練習題
//偽代碼
//復數類
類有虛部實部
復數的加法運算
復數的減法運算
復數的乘法運算
復數的除法運算
//產品代碼
public class ComplexDemo {
// main方法
public static void main(String[] a) {
Complex b = new Complex(2, 5);
Complex c = new Complex(3, -4);
System.out.println(b + "+" + c + "=" + b.add(c));
System.out.println(b + "-" + c + "=" + b.minus(c));
System.out.println(b + "*" + c + "=" + b.multiply(c));
System.out.println(b + "/" + c + "=" + b.divide(c));
}
}
// Complex類
class Complex {
private double m;// 實部
private double n;// 虛部
public Complex(double m, double n) {
this.m = m;
this.n = n;
}
// add
public Complex add(Complex c) {
return new Complex(m + c.m, n + c.n);
}
// minus
public Complex minus(Complex c) {
return new Complex(m - c.m, n - c.n);
}
// multiply
public Complex multiply(Complex c) {
return new Complex(m * c.m - n * c.n, m * c.n + n * c.m);
}
// divide
public Complex divide(Complex c) {
double d = Math.sqrt(c.m * c.m) + Math.sqrt(c.n * c.n);
return new Complex((m * c.m + n * c.n) / d, Math.round((m * c.n - n * c.m) / d));
}
public String toString() {
String rtr_str = "";
if (n > 0)
rtr_str = "(" + m + "+" + n + "i" + ")";
if (n == 0)
rtr_str = "(" + m + ")";
if (n < 0)
rtr_str = "(" + m + n + "i" + ")";
return rtr_str;
}
}
//測試代碼
public static ComplexTest{
public static void main(String[] args){
class Complex {
private double m;// 實部
private double n;// 虛部
public Complex(double m, double n) {
this.m = m;
this.n = n;
}
public String toString() {
String rtr_str = "";
if (n > 0)
rtr_str = "(" + m + "+" + n + "i" + ")";
if (n == 0)
rtr_str = "(" + m + ")";
if (n < 0)
rtr_str = "(" + m + n + "i" + ")";
return rtr_str;
}
}
}
}
六、時間統計
步驟 |
耗時 |
百分比 |
需求分析 |
1h |
16.7% |
設計 |
1h | 16.7% |
代碼實現 |
2h | 33.2% |
測試 |
1h | 16.7% |
分析總結 |
1h | 16.7% |