標籤:
java的第二個實驗——JAVA物件導向程式設計
北京電子科技學院
實 驗 報 告
課程:Java程式設計 班級:1352 姓名:林涵錦 學號:20135213
成績: 指導教師:婁嘉鵬 實驗日期:2015.4.14
實驗密級: 預習程度: 實驗時間:19:30~21:50
儀器組次:13 必修/選修:選修 實驗序號:2
實驗名稱:JAVA物件導向程式設計
實驗目的與要求:
1. 初步掌握單元測試和TDD
2. 理解並掌握物件導向三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 瞭解設計模式
實驗儀器:
名稱 |
型號 |
數量 |
PC |
Acer |
1 |
虛擬機器 |
實驗樓 |
1 |
一、實驗內容
1. 初步掌握單元測試和TDD
2. 理解並掌握物件導向三要素:封裝、繼承、多態
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原則
5. 瞭解設計模式
二、實驗步驟
(一)單元測試
(1) 三種代碼
編程是智力活動,不是打字,編程前要把幹什麼、如何幹想清楚才能把程式寫對、寫好。與目前不少同學一說編程就開啟編輯器寫代碼不同,我希望同學們養成一個習慣,當你們想用程式解決問題時,要會寫三種碼:
• 虛擬碼
• 產品代碼
• 測試代碼
先寫測試代碼,然後再寫產品代碼的開發方法叫“測試驅動開發”(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的核心和起源。
OO三要素的第一個要素是封裝,封裝就是將資料與相關行為封裝在一起以實現資訊就隱藏。Java中用類進行封裝,比如一個Dog類:
封裝實際上使用方法(method)將類的資料隱藏起來,控制使用者對類的修改和訪問資料的程度,從而帶來模組化(Modularity)和資訊隱藏(Information hiding)的好處;介面(interface)是封裝的準確描述手段。 Dog類通過使用類和存取控制(private,public)隱藏了屬性color,開放了介面setColor(),getColor(),bark()和toString。Dog類是一個模組,我們可以通過下面的代碼使用它,測試代碼與運行結果如:(附學號。實在不懂要求code怎麼表示,直接檔案夾)
(三)設計模式初步
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,依賴倒置原則)
除SOLID原則外還有很多其它的物件導向原則。如:
- "組合替代繼承":這是說相對於繼承,要更傾向於使用組合;
- "笛米特法則":這是說"你的類對其它類知道的越少越好";
- "共同封閉原則":這是說"相關類應該打包在一起";
- "穩定抽象原則":這是說"類越穩定,越應該由抽象類別組成";
當然,這些原則並不是孤立存在的,而是緊密聯絡的,遵循一個原則的同時也就遵循了另外一個或多個原則;反之,違反了其中一個原則也很可能同時就違反了另外一個或多個原則。 設計模式是這些原則在一些特定情境的應用結果。因此,可以把設計模式看作"架構",把OOD原則看作"規範"。 在學習設計模式的過程中,要經常性的反思,這個設計模式體現了物件導向設計原則中的哪個或哪一些原則。
2、模式與設計模式
模式是某外在環境(Context) 下﹐對特定問題(Problem)的慣用解決之道(Solution)。模式必須使得問題明晰,闡明為什麼用它來求解問題,以及在什麼情況下有用,什麼情況下不能起作用。每個模式因其重複性從而可被複用,本身有自己的名字,有可傳授性,能移植到不同情景下。模式可以看作對一個問題可複用的專家級解決方案。
電腦科學中有很多模式:
• GRASP模式
• 分析模式
• 軟體體繫結構模式
• 設計模式:建立型,結構型,行為型
• 管理員模式: The Manager Pool 實現模式
• 介面設計互動模式
(附學號:)
3、設計模式實樣本
(1)設計模式(design pattern)提供一個用於細化軟體系統的子系統或組件,或它們之間的關係圖。
它描述通訊組件的公用再現結構,通訊組件可以解決特定語境中的一個設計問題。
設計模式背後是抽象和SOLID原則。
(2)設計模式有四個基本要素:
• Pattern name:描述模式,便於交流,存檔
• Problem:描述何處應用該模式
• Solution:描述一個設計的組成元素,不針對特例
• Consequence:應用該模式的結果和權衡(trade-offs)
(3)瞭解設計模式可能會存在的過度設計問題以及如何避免它。
(四)練習
1.使用TDD的方式設計關實現複數類Complex。
虛擬碼:
首先設計一個複數類complex,定義三個構造方法:
①沒有參數時預設為實部和虛部都為0;
②一個參數時預設為實數,即虛部為0,
③兩個參數時分別為實部和虛部
再定義兩個成員方法計算兩個複數的和與差.定義一個print()方法輸出複數的值,當虛部為0時不輸出虛部.
最後定義一個song類使用complex類,在這個類的主方法中建立兩個複數對象,分別計算這兩個複數的和與差並輸出.
產品代碼:
(之前在實驗樓中編寫,運行速度慢,然後直接在自己電腦運行了,實驗樓裡中文輸不了,所以之前改的用拼音)
運行:
三、實驗分析
1、我的PSP時間
步驟 |
耗時 |
百分比 |
需求分析 |
5 |
10% |
設計 |
10 |
20% |
代碼實現 |
24 |
50% |
測試 |
5 |
10% |
分析總結 |
5 |
10% |
2、遇到問題與解決方案:
(1)尋找各種表徵圖,因為表徵圖較小,難以找到。
解決:發現點開可以看大圖。
(2)eclipse提示Animal代碼有錯,Dog和Cat需要在檔案中被定義。
解決:將Animal和Dog、Cat放在不同的class檔案中編譯。
(3)由於網路訊號不好,虛擬機器運行非常慢,以致這次實驗非常耗費時間
解決:實驗過程在虛擬機器寫,練習直接用自己的電腦修改。
3、感想總結
用程式解決實際問題時,最好寫出三種代碼:虛擬碼、產品代碼、測試代碼,這樣的程式才有實際意義,方便使用。
而軟體的獨立單元將在與程式的其他部分相隔離的情況下進行測試,可以尋找錯誤、寫出高品質的代碼、提高編程水平。
這樣也可以使代碼可以放心修改和重構、使程式員從調用者而不是實現者的角度設計軟體模組。
java的第二個實驗——JAVA物件導向程式設計