一、面向對象方法學概述
傳統的生命周期方法學在消除軟件非結構化、促進軟件開發工程化方面起了積極的作用,但仍有許多不足,存在的主要問題有:①生產率提高的幅度不能滿足需要; ②軟件重用程度很低; ③軟件很難維護; ④軟件往往不能真正滿足用戶需要。
傳統方法:系統是過程的集合 、過程與數據實體交互、 過程接受輸入產生輸出、數據與處理分離。
面向對象方法:系統是對象的集合 、對象與其它對象交互、 對象發送與響應消息、數據與處理方法封裝到對象。
面向對象的軟件工程的全面運用:①面向對象分析OOA 、②面向對象設計OOD、③面向對象編程OOP、④面向對象測試OOT、⑤面向對象軟件維護OOSM
之前講過的噴泉模型就是以對象為驅動:生存期各階段開發出來的“部件”都是類,各階段對各個類的信息進行細化,面向對象方法改進了生存期各個階段間的界面。
1、面向對象方法學的原則
①盡可能模擬人類習慣的思維方式,使開發軟件的方法與過程盡可能地接近人類認識世界解決問題的方法與過程;
②使描述問題的問題空間/問題域與實現解法的解空間/求解域在結構上盡可能一致。
2、面向對象方法學的要點
①客觀世界是由對象組成,任何事物都是對象,復雜對象可以由簡單對象組成。
②所有對象都劃分成各種對象類(簡稱類),每個類都定義了一組數據和一組方法。
③按照子類與父類的關系,將若干類組成一個層次結構的系統。
④對象彼此間僅能通過傳遞消息互相聯系。
3、面向對象方法學的優點
①與人類習慣的思維方法一致
②穩定性好? ?
③可重用性好? ?
④可維護性好?
⑤ 易開發大型軟件產品
二、面向對象的基本概念
面向對象 = 對象 + 分類+ 繼承+ 消息通信
面向對象方法是一種運用對象、類、繼承、消息傳遞、多態性等概念構造系統的軟件開發方法。
面向對象程序的每一個成份是對象,程序是通過新對象的建立和對象之間的通信執行的。
1、對象
面向對象開發模式的基本成份,是系統中描述客觀事物的一個實體。 是構成系統的一個基本單位,由一組屬性和一組對屬性進行操作的服務組成。
對象 = 對象名+ 屬性(數據)+ 操作(服務/方法)
屬性是對自身性質的抽象,通過執行操作來改變
操作是描述對象執行的功能,通過消息傳遞為其他對象使用
特點
①以數據為中心:操作圍繞對數據所需的處理來設置
②對象是主動的:對象是進行處理的主體
③實現了數據封裝:私有數據對外隱藏、不可見
④本質上具有并行性:不同對象獨立地處理自身的數據
⑤模塊獨立性好:對象內部各元素彼此結合緊密,內聚性強
2、類
具有相同特征(屬性)和行為(操作)的對象的集合構成了類。
類的定義包括一組數據屬性和一組合法操作。
類的定義可以視為一個具有類似特性與共同行為的對象的模板,可以用來產生對象。
在一個類中,每個對象都是類的實例,對象的狀態包含在實例的屬性中。
3、消息
消息是一個對象與另一個對象之間傳遞的信息,要求某個對象執行類中定義的某個操作。
消息的使用類似于函數調用,消息中指定了某一個對象名、一個操作名和一個參數表。
接收消息的對象執行消息中指定的操作,并將傳遞過來的實參與參數表中對應的形參結合起來。
4、繼承
類與類之間可能具有一般化和特殊化關系,這種關系下形成的一種層次關聯,即繼承。
繼承是父類和子類之間共享數據和方法的機制,子類自動地共享父類中定義的數據和方法。
5、多態
對象互相通信從而執行系統的功能,不同的對象對同一消息有不同的實現。
多態的實現受繼承的支持: ①利用類繼承的層次關系,把具有通用功能的消息存放在高層; ②實現該功能的不同的行為放在低層,在低層上生成的對象能夠給通用消息以不同的響應。
6、面向對象的特點
①抽象性:對象的數據抽象和行為抽象;
②封裝性:軟件開發的重要原則,有兩個含義;
③共享性: 同一類中所有實例共享數據結構和行為特征; 同一應用中所有實例通過繼承實現共享; 不同應用中所有實例通過復用實現共享。
三、面向對象建模技術OMT
模型是為了理解事物而對事物做出的一種抽象,是對事物的一種無歧義的書面描述。
建模的目的是為了減少復雜性,系統分析員應從不同角度抽象出目標系統的特性,使用精確的表示方法構造系統的模型。
面向對象方法最基本的原則,是按照人們習慣的思維方式,用面向對象觀點建立問題域的模型,開發出盡可能自然地表現求解方法的軟件。
模型化過程是一個迭代過程,通過不斷細化、完善,直至滿足真正需求,為開發工作奠定基礎。
面向對象方法開發軟件,通常需要建立以下三種形式的模型:
1、對象模型
也叫靜態模型,是OMT方法中最重要的部分,動態模型和功能模型依此而建立。
對象模型描述系統的靜態結構,包括構成系統的對象類,它們的屬性、操作及它們之間的關系。 通常,使用類圖建立對象模型。
類圖是對象模型的圖形表示
類與類之間的關系叫關聯,代表一組存在于兩個或多個對象類之間、具有相同結構和含義的具體連接。關聯可以是物理的,也可以是邏輯的。關聯有普通關聯、限定關聯、聚合關聯、泛化關聯。
普通關聯如
限定關聯的限定提高了語義精確性,增強了查詢能力,通常用在一對多或多對多的關聯關系中,可以簡化模型中的重數。 在類圖中,限定詞放在關聯關系末端的一個小方框內。如
為了說明關聯的性質,可能需要一些附加信息,可以引入一個關聯類來記錄這些信息。 在類圖中,關聯類通過一條虛線與關聯連接。
?連接屬性:用附加的屬性說明類間的聯系
聚合關聯
共享聚合(弱)
組合聚合(強)
?
?泛化關聯如
2、動態模型
要想對系統了解得比較清楚,應考察在任何時刻對象及其聯系的改變。
著重描述系統與時間相關的動態行為,即系統的控制邏輯。涉及時序和改變的狀況用動態模型來描述。
包括兩個圖:狀態圖和時序圖。
狀態圖是一個狀態和事件的網絡,側重描述每一類對象的動態行為:①狀態:對某一時刻屬性特征的概括;② 狀態遷移:這一類對象在何時、對發生的哪些事件,做出何種響應。
時序圖是一種交互圖,描述對象之間的動態合作關系以及合作過程中的行為次序;展現了完成某項行為的一組對象和對象間傳遞的消息的時間順序。
按時間順序對控制流建模,注重消息的順序,揭示了一個特定“場景”中對象的交互。場景也將“腳本”,是完成系統某個功能的一個事件序列。如移動電話系統的時序圖
激活:生命線上的長方框,對象接收消息開始活動,表明某時間點哪個對象在執行。
3、功能模型
表示系統的功能性質,指明系統應該“做什么”,因此更直接地反映用戶對目標系統的需求。
由多個數據流圖組成,說明從外部輸入,通過內部操作和存儲,直到外部輸出,整個的數據流情況。
用例模型描述系統的靜態使用情況,它定義了系統的功能,回答“系統應該為每類用戶做什么”。 描述從系統的外部執行者觀看到的系統功能,而非系統內部功能的具體實現。展現了一組用例、行為者/角色及它們之間的關系。用用例圖建立起來的系統模型,成為用例模型。需要識別角色(使用用例并與系統交互的任何人或物都是行為者,確定行為者對確定用例非常有用)和識別用例(從用戶角度觀察到的系統功能,即角色如何使用系統)。
用例之間的關系:①擴展(extend):通過向被擴展的用例添加動作來擴展用例。 被擴展的用例是一般用例,擴展的用例是特殊用例。②使用(use):由一個用例使用另一個用例。
用例建模
建模過程為:①定義系統; 找出系統邊界以外的行為者/角色;
②描繪用例,定義用例間的關系;
③繪制用例圖,編寫用例描述,確認模型。
四、面向對象分析
OOA(Object-Oriented Analysis)的目的是理解應用問題和用戶需求,準確定義問題域,建立問題域的精確模型。
OOA從分析陳述用戶需求的文件開始,是抽取和整理用戶需求,并建立問題域精確模型的過程,使用戶需求逐步精確化、一致化、完全化。
分析工作主要包含理解、表達和驗證。
1、基本過程
①問題域分析
②發現和定義對象與類
③識別對象的外部聯系
④建立系統的靜態結構模型
⑤建立系統的動態結構模型
2、五個層次
面向對象分析建立的系統模型以概念為中心,稱為概念模型,由一組相關的類組成。?
構造和評審OOA概念模型的活動由五個層次組成,即類與對象、結構、屬性、服務和主題層。
?(1)標識類與對象
類和對象是對與應用有關的概念的抽象,是說明應用問題的重要手段,是構成軟件系統的基本元素。
面向對象分析的第一個層次,這一層工作是整個分析模型的基礎。
類和對象的識別開始于搜索選定的問題陳述,標識可以表示問題領域概念的術語。
(2)標識屬性和實例連接
對象所保存的信息稱為它的屬性。
屬性層是對前面已識別的類和對象做進一步的說明。
類的屬性描述的是狀態信息。
每個對象的屬性值表達該對象的狀態值。
(3)標識服務和消息連接
對象收到消息后所能執行的操作,稱為對象可提供的服務。
服務層的目的:定義對象的行為和對象間的通信(消息連接),說明各種對象是如何共同協作以使系統運作起來的。
(4)標識結構
結構層用于標記對象間的繼承和組裝關系,是處理OOA模型復雜性的機制之一。 典型的結構有兩種:①一般化-特殊化結構(Gen-Spec) ②整體-部分結構(Whole-Part)
(5)識別主題
主題是把一組具有較強聯系的類組織在一起而得到的類的集合,用來建立系統的高層抽象視圖,表示OOA模型的整體框架。
通過劃分主題,將復雜的對象模型分解成幾個不同的范疇,有助于開發人員或用戶理解一個大而復雜的系統模型,有助于組織一個大項目的工作。
主題的劃分有一定的靈活性和隨意性。
在概念上可以認為,OOA大體按照下列順序進行:尋找類與對象,識別結構,識別主題,定義屬性,建立動態模型,建立功能模型,定義服務。
五、面向對象設計
OOD是用面向對象觀點建立求解域模型的過程,使軟件工程師能夠從實現的角度,確定從類中導出的對象,以及對象的相互關聯,描述了:①對象間的關系如何達到; ②行為如何實現; ③對象間通信如何實現。
1、過程
將已建立的OOA模型變成OOD模型,運用面向對象技術進行軟件設計,建立求解域模型,并補充一些與實現有關的部分。
逐漸擴充模型的過程,分兩個階段: ?系統設計(高層設計) 和 對象設計(低層設計)
系統設計
即高層設計,開發系統的體系結構,構造應用軟件的總體模型。
高層設計階段標識在計算機環境中解決問題所需要的概念,并增加一批需要的類,包括可使應用軟件與外部世界交互的類。
此階段的輸出是適合應用軟件要求的類、類間的關系、應用的子系統視圖規格說明。
對象設計
著重于對象及其相互交互的描述,是集中于類的詳細設計,細化屬性和方法。
在對象設計期間:創建屬性的數據結構和操作過程的詳細規約;定義屬性的可見性,精化對象接口以定義完整的消息模型的細節。
2、準則
優秀的設計是權衡了各種因素,使系統在其整個生命周期中的總開銷最小的設計。
①模塊化:對象就是模塊,把數據結構和操作方法結合在一起
②抽象:支持過程抽象和數據抽象(類)
③信息隱蔽:通過對象的封裝性實現
④弱耦合 強內聚
⑤可重用:盡量使用已有的類,創建新類時應考慮將來的重用性
兩種OOD的耦合
①交互耦合:對象間的耦合通過消息連接實現,應盡可能松散、盡量降低消息連接的復雜程度、 減少對象發送或接收的消息數
②繼承耦合:應提高繼承耦合程度,使特殊類盡量多繼承一般類
三種OOD的內聚
①服務內聚:一個服務應該完成一個且僅完成一個功能
②類內聚:一個類只有一個用途,它的屬性和服務是高內聚的
③一般-特殊內聚:設計出的一般-特殊結構,應該符合多數人的概念,應該是對相應的領域知識的正確抽取。
3、啟發規則
幫助軟件開發人員提高面向對象設計的質量。包括:
①設計結果應該清晰易懂
②一般-特殊結構的深度應適當
③設計簡單的類
④使用簡單的協議
⑤使用簡單的服務
⑥把設計變動減至最小
4、系統分解
大多數系統的面向對象設計模型在邏輯上分為四大部分,對應于目標系統的四個垂直切片:
兩種子系統間的交互方式:
①?客戶—供應商關系:作為“客戶”的子系統調用作為“供應商”的子系統,后者完成某些服務并返回結果。
②平等伙伴關系:每個子系統都可能調用其他子系統,每個子系統都必須了解其他子系統的接口。
5、設計類中的服務
OOA得出的對象模型,通常并不詳細描述類中的服務;OOD是擴充、完善和細化OOA模型的過程,設計類中的服務是它的一項重要工作內容。
(1)確定類中應有的服務
綜合考慮對象模型、動態模型和功能模型,將動態模型中對象的行為以及功能模型中的數據處理,轉換成由適當的類所提供的服務。
狀態圖描繪了對象的生命周期,狀態轉換是執行對象服務的結果。事件表現為消息,接收消息的對象必然有消息選擇符指定的服務。
功能模型指明了系統必須提供的服務,數據流圖中的處理與對象提供的服務相對應。
(2)設計實現服務的方法
設計實現服務的算法:①算法復雜度,通常選用復雜度較低(即效率較高)的算法,但也不要過分追求高效率,應以能滿足用戶需求為準。②容易理解和容易實現,往往與高效率矛盾,應該對這兩個因素適當折中。③易修改,盡可能預測將來可能做的修改,在設計時預先做準備。
選擇數據結構:在分析階段,僅需考慮系統中需要的信息的邏輯結構;在設計過程中,則需要選擇能夠方便、有效地實現算法的物理數據結構。
定義內部類和內部操作:在設計過程中,可能需要增添一些在需求陳述中沒有提到的類,這些新增加的類,主要用來存放在執行算法過程中所得出的某些中間結果。
六、面向對象實現
面向對象實現包括兩項工作: 把面向對象設計結果,翻譯成用某種程序設計語言書寫的面向對象程序;以及 測試并調試面向對象程序。
程序的質量基本上由面向對象設計的質量決定。
測試目標:用盡可能低的測試成本和盡可能少的測試方案發現盡可能多的錯誤。
1、程序設計語言
(1)面向對象語言的優點:一致的表示、可重用性、可維護性
(2)面向對象語言的技術特點:支持類與對象概念的機制 、實現整體-部分結構的機制 、實現一般-特殊結構的機制、 實現屬性和服務的機制、 類型檢查、 類庫、 效率 、持久保存對象 、參數化類 、開發環境
(3)選擇面向對象的語言:將來能否占主導地位 、可重用性、 類庫和開發環境 、其它因素
2、程序設計風格
(1)提高可重用性:提高方法的內聚 、減少方法的規模、 保持方法的一致性、 把策略與實現分開 、全面覆蓋 、盡量不使用全局信息 、利用繼承機制
(2)提高可擴充性: 封裝實現策略、 不要用一個方法遍歷多條關聯鏈 、避免使用多分支語句、 精心確定公有方法
(3)提高健壯性: 預防用戶的操作錯誤、 檢查參數的合法性 、不要預先確定限制條件、 先測試后優化
3、測試策略
從小規模測試開始,逐步過渡到大規模測試,就是從單元測試開始,逐步進入集成測試,最后進行確認測試和系統測試。
(1)面向對象的單元測試: 類和類的實例包裝了屬性和處理這些數據的操作; 最小的可測試單元是封裝起來的類和對象。
(2)面向對象的集成測試
基于線程的測試:把響應系統的一個輸入或一個事件所需要的一組了集成起來。分別集成并測試每個線程,同時應用回歸測試以保證沒有產生副作用。
基于使用的測試:首先測試幾乎不使用服務器類的那些類(稱為獨立類),測試完獨立類后,接下來測試使用獨立類的下一個層次的類(稱為依賴類)。對依賴類的測試一個層次一個層次繼續下去,直到整個系統構造完為止。
(3)面向對象的確認測試: 黑盒測試可以用來設計確認測試用例; 對于面向對象的軟件來說,主要還是根據動態模型和描述系統行為的腳本來設計確認測試用例。
4、設計測試用例
目前,面向對象的軟件測試用例的設計方法,還處于研究、發展階段。與傳統軟件測試不同,面向對象測試關注于設計適當的操作序列以檢查類的狀態。
(1)測試類的方法
?單元測試主要測試單個類和類中封裝的方法。
測試單個類的方法主要有:隨機測試、劃分測試和基于故障的測試。
(2)集成測試方法
對類間協作進行測試。
可以使用隨機測試方法和劃分測試方法,以及基于情景的測試和行為測試來完成。