為了統(tǒng)一各種面向?qū)ο蠓椒ǖ男g(shù)語、概念和模型,1997年推出了統(tǒng)一建模語言(Unified Modeling Language,UML)。
它是面向?qū)ο蟮臉藴式UZ言,通過統(tǒng)一的語義和符號表示,使各種方法的建模過程和表示統(tǒng)一起來,現(xiàn)在已經(jīng)成為面向?qū)ο蠼5墓I(yè)標準。
(一)面向?qū)ο蟮幕靖拍?/h2>
識別面向?qū)ο蟮姆椒ǎ?/strong>
面向?qū)ο?= 對象(Object)+ 分類(Classification)+ 繼承(Inheritance)+ 通過消息的通信(Communication with Messages)
1. 對象
在面向?qū)ο蟮南到y(tǒng)中,對象是基本的運行時的實體,它既包括數(shù)據(jù)(屬性),也包括作用于數(shù)據(jù)的操作(行為)。
2. 消息
對象之間進行通信的一種構(gòu)造叫消息。
當一個消息發(fā)送給某個對象時,包含要求接收對象去執(zhí)行某些活動的信息。接收到信息的對象經(jīng)過解釋,然后予以響應(yīng)。這種通信機制稱為消息傳遞。
3. 類
一個類定義了一組大體上相似的對象。一個類包含的方法和數(shù)據(jù)描述一組對象的共同行為和屬性。
類是在對象之上的抽象,對象是類的具體化,是類的實例。
類可以分為三種:實體類、接口類(邊界類)和控制類。
4. 繼承
繼承是父類和子類之間共享數(shù)據(jù)和方法的機制。
一個父類可以有多個子類,父類描述了這些子類的公共屬性和方法,一個子類可以繼承它的父類(或祖先類)中的屬性和方法,這些屬性和操作在子類中不必定義,子類中還可以定義自己的屬性和方法。
5. 多態(tài)
在收到消息時,對象要予以回應(yīng)。不同的對象收到同一消息可以產(chǎn)生完全不同的結(jié)果,這一現(xiàn)象稱為多態(tài)。
6. 動態(tài)綁定
綁定是一個把過程調(diào)用和響應(yīng)調(diào)用所需要執(zhí)行的代碼加以結(jié)合的過程。
在編譯時進行的綁定,叫靜態(tài)綁定;在運行時進行的綁定叫動態(tài)綁定。
動態(tài)綁定是和類的繼承以及多態(tài)相聯(lián)系的。在繼承關(guān)系中,子類是父類的一個特例,所以父類對象可以出現(xiàn)的地方,子類對象也可以出現(xiàn)。因此在運行過程中,當一個對象發(fā)送消息請求服務(wù)時,要根據(jù)接收對象的具體情況將請求的操作與實現(xiàn)的方法進行連接,即動態(tài)綁定。
(二)面向?qū)ο蠓治?/h2>
面向?qū)ο蠓治觯?code>OOA)的目的是為了獲得對應(yīng)用問題的理解。
面向?qū)ο蠓治霭奈鍌€活動:認定對象、組織對象、描述對象間的相互作用、確定對象的操作、定義對象的內(nèi)部信息。
1. 認定對象
在應(yīng)用領(lǐng)域中,按自然存在的實體確立對象。
在定義域中,首先將自然存在的“名詞”作為一個對象。
2. 組織對象
分析對象間的關(guān)系,將相關(guān)對象抽象成類,利用類的繼承性建立具有繼承性層次的類結(jié)構(gòu)。
3. 對象間的相互作用
描述出各對象在應(yīng)用系統(tǒng)中的關(guān)系,如一個對象是另一個對象的一部分,一個對象與其他對象間的通信關(guān)系等。這樣可以完整地描述每個對象的環(huán)境,由一個對象解釋另一個對象,以及一個對象如何生成另一個對象,最后得到對象的界面描述。
4. 基于對象的操作
基于對象的操作,有從對象直接標識的簡單操作,如創(chuàng)建、增加和刪除等;也有更復(fù)雜的操作,如將幾個對象的信息連接起來。
一般而言,避免對象太復(fù)雜比較好,當連接的對象太復(fù)雜時,可將其標識為新對象。
(三)面向?qū)ο笤O(shè)計
面向?qū)ο笤O(shè)計(OOD)是將面向?qū)ο蠓治觯?code>OOA)所創(chuàng)建的分析模型轉(zhuǎn)化為設(shè)計模型,其目標是定義系統(tǒng)構(gòu)造藍圖。
1. 面向?qū)ο笤O(shè)計的活動
面向?qū)ο笤O(shè)計在復(fù)用面向?qū)ο蠓治瞿P偷幕A(chǔ)上,包含與面向?qū)ο蠓治鰧?yīng)如下五個活動:
- 識別類及對象
- 定義屬性
- 定義服務(wù)
- 識別關(guān)系
- 識別包
面向?qū)ο笤O(shè)計應(yīng)該盡可能隔離實現(xiàn)條件對系統(tǒng)的影響,對不可隔離的因素按實現(xiàn)條件調(diào)整面向?qū)ο蠓治瞿P汀?/p>
2. 面向?qū)ο笤O(shè)計原則
-
單一責任原則(
SRP)
當需要修改某個類的時候原因有且僅有一個,讓一個類只做一種類型責任。 -
開發(fā)-封閉原則(
OCP)
類、模塊、函數(shù)等應(yīng)該是可以擴展的,即開放的;但是不可修改的,即封閉的。 -
里氏替換原則(
LSP)
子類型必須能夠替換他們的基類型。 -
依賴倒置原則(
DIP)
抽象不應(yīng)該依賴于細節(jié),細節(jié)應(yīng)該依賴于抽象。即,高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象。 -
接口分離原則(
ISP)
不應(yīng)該強迫客戶依賴于它們不用的方法。即,依賴于抽象,不要依賴于具體,同時在抽象級別不應(yīng)該有對于細節(jié)的依賴。
上述五項是面向?qū)ο蠓椒ㄖ械奈宕笤瓌t,除了這五項外,還提出了以下幾項設(shè)計原則:
-
重用發(fā)布等價原則(
REP)
重用的粒度就是發(fā)布的粒度。 -
共同封閉原則(
CCP)
包中所有的類對于同一類性質(zhì)的變化應(yīng)該是共同封閉的。 -
共同重用原則(
CRP)
一個包中的所有類應(yīng)該是共同重用的。 -
無環(huán)依賴原則(
ADP)
在包的依賴關(guān)系中不允許存在環(huán)。 -
穩(wěn)定依賴原則(
SDP)
朝著穩(wěn)定的方向進行依賴。 -
穩(wěn)定抽象原則(
SAP)
包的抽象程度應(yīng)該和其穩(wěn)定程度一致。
(四)面向?qū)ο蟪绦蛟O(shè)計
面向?qū)ο蟪绦蛟O(shè)計(OOP)的實質(zhì)是選用一種面向?qū)ο蟪绦蛟O(shè)計語言(OOPL),采用對象、類及其相關(guān)概念所進行的程序設(shè)計。
1. 類
類具有實例化功能,包括實例生成和實例消除。
類的特征:
- 同一個類的不同實例具有相同的數(shù)據(jù)結(jié)構(gòu),承受的是同一方法集合所定義的操作,因而具有規(guī)律相同的行為
- 同一個類的不同實例可以持有不同的值,因而可以具有不同的狀態(tài)
- 實例的初始狀態(tài)可以在實例化時確定
2. 繼承和類層次結(jié)構(gòu)
孤立的類只能描述實體集合的特征同一性,而客觀世界中實體集合的劃分通常還要考慮實體特征方面有關(guān)聯(lián)的相似性,在面向?qū)ο蟪绦蛟O(shè)計中使用繼承來解決這一問題。
當執(zhí)行一個子類的實例生成方法時,首先在類層次結(jié)構(gòu)中從該子類沿繼承路徑上溯到它的一個基類,然后自頂向下執(zhí)行該子類所有父類的實例生成方法;最后執(zhí)行該子類實例生成方法的函數(shù)體。
3. 對象、消息傳遞和方法
對象是類的實例。
消息傳遞源是一種與通信有關(guān)的概念,對象被看成用傳遞消息的方式互相聯(lián)系的通信實體,它們既可以接收,也可以拒絕外界發(fā)來的消息。
發(fā)送一條消息至少應(yīng)給出一個對象的名字和要發(fā)送給這個對象的那條消息的名字。通常,消息的名字就是這個對象中外界可知的某個方法的名字。
4. 對象自身引用
對象自身引用在面向?qū)ο蟪绦蛟O(shè)計語言中有不同的名稱,在C++和Java中稱為this,在Object-C中稱為self。
對象自身引用的值使得方法體中引用的成員名與特定的對象相關(guān),對象自身引用的類型則決定了方法體被實際共享的范圍。
對象自身引用機制使得在進行方法的設(shè)計和實現(xiàn)時并不需要考慮與對象聯(lián)系的細節(jié),而是從更高一級的抽象層次,也就是類的角度來設(shè)計同類型對象的行為特征,從而使得方法在一個類及其子類的范圍內(nèi)具有共性。
5. 重置
重置或覆蓋是在子類中重新定義父類中已經(jīng)定義的方法,其基本思想是通過一種動態(tài)綁定機制的支持,使得子類在繼承父類接口定義的前提下用適合自己要求的實現(xiàn)去置換父類中的相應(yīng)實現(xiàn)。
6. 類屬類
類屬是程序設(shè)計語言中普遍注重的一種參數(shù)多態(tài)機制。
類屬類可以看成是類的模板。一個類屬類是關(guān)于一組類的一個特性抽象,它強調(diào)的是這些類的成員特征中與具有類型無關(guān)的那些部分,而與具體類型相關(guān)的那些部分則用變元來表示。
7. 無實例的類
在C++和Java中,抽象類就是無實例的類。
(五)面向?qū)ο鬁y試
程序調(diào)試步驟是從最底層開始的,從單元測試、綜合測試到系統(tǒng)測試。
- 單元測試是系統(tǒng)構(gòu)件的分體測試
- 將測試好的系統(tǒng)構(gòu)件接起來看它們之間相互作用的正確性稱為綜合測試
- 最后是整個系統(tǒng)的測試,包括軟件系統(tǒng)所在環(huán)境的測試
對面向?qū)ο筌浖臏y試可以分為下列四個層次進行:
- 算法層
測試類中定義的每個方法,基本上相當于傳統(tǒng)軟件測試中的單元測試。 - 類層
測試封裝在同一個類中的所有方法與屬性之間的相互作用,可以認為這是面向?qū)ο鬁y試中所特有的模塊測試。 - 模板層
測試一組協(xié)同工作的類之間的相互作用,大體上相當于傳統(tǒng)軟件測試中的集成測試。 - 系統(tǒng)層
把各個子系統(tǒng)組裝成完整的面向?qū)ο筌浖到y(tǒng),在組裝過程中同時進行測試。