為了統(tǒng)一各種面向?qū)ο蠓椒ǖ男g(shù)語盈匾、概念和模型,1997年推出了統(tǒng)一建模語言(Unified Modeling Language,UML
)哮缺。
它是面向?qū)ο蟮臉?biāo)準(zhǔn)建模語言苟穆,通過統(tǒng)一的語義和符號表示,使各種方法的建模過程和表示統(tǒng)一起來稿黄,現(xiàn)在已經(jīng)成為面向?qū)ο蠼5墓I(yè)標(biāo)準(zhǔn)喊衫。
(一)面向?qū)ο蟮幕靖拍?/h2>
識別面向?qū)ο蟮姆椒ǎ?/strong>
面向?qū)ο?= 對象(Object)+ 分類(Classification)+ 繼承(Inheritance)+ 通過消息的通信(Communication with Messages)
1. 對象
在面向?qū)ο蟮南到y(tǒng)中,對象是基本的運行時的實體杆怕,它既包括數(shù)據(jù)(屬性)族购,也包括作用于數(shù)據(jù)的操作(行為)。
2. 消息
對象之間進(jìn)行通信的一種構(gòu)造叫消息陵珍。
當(dāng)一個消息發(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é)合的過程伦乔。
在編譯時進(jìn)行的綁定,叫靜態(tài)綁定董习;在運行時進(jìn)行的綁定叫動態(tài)綁定烈和。
動態(tài)綁定是和類的繼承以及多態(tài)相聯(lián)系的。在繼承關(guān)系中皿淋,子類是父類的一個特例招刹,所以父類對象可以出現(xiàn)的地方,子類對象也可以出現(xiàn)窝趣。因此在運行過程中疯暑,當(dāng)一個對象發(fā)送消息請求服務(wù)時,要根據(jù)接收對象的具體情況將請求的操作與實現(xiàn)的方法進(jìn)行連接哑舒,即動態(tài)綁定妇拯。
(二)面向?qū)ο蠓治?/h2>
面向?qū)ο蠓治觯?code>OOA)的目的是為了獲得對應(yīng)用問題的理解。
面向?qū)ο蠓治霭奈鍌€活動:認(rèn)定對象洗鸵、組織對象越锈、描述對象間的相互作用、確定對象的操作膘滨、定義對象的內(nèi)部信息甘凭。
1. 認(rèn)定對象
在應(yīng)用領(lǐng)域中,按自然存在的實體確立對象火邓。
在定義域中对蒲,首先將自然存在的“名詞”作為一個對象。
2. 組織對象
分析對象間的關(guān)系贡翘,將相關(guān)對象抽象成類蹈矮,利用類的繼承性建立具有繼承性層次的類結(jié)構(gòu)。
3. 對象間的相互作用
描述出各對象在應(yīng)用系統(tǒng)中的關(guān)系鸣驱,如一個對象是另一個對象的一部分泛鸟,一個對象與其他對象間的通信關(guān)系等。這樣可以完整地描述每個對象的環(huán)境踊东,由一個對象解釋另一個對象北滥,以及一個對象如何生成另一個對象,最后得到對象的界面描述闸翅。
4. 基于對象的操作
基于對象的操作再芋,有從對象直接標(biāo)識的簡單操作,如創(chuàng)建坚冀、增加和刪除等济赎;也有更復(fù)雜的操作,如將幾個對象的信息連接起來。
一般而言司训,避免對象太復(fù)雜比較好构捡,當(dāng)連接的對象太復(fù)雜時,可將其標(biāo)識為新對象壳猜。
(三)面向?qū)ο笤O(shè)計
面向?qū)ο笤O(shè)計(OOD
)是將面向?qū)ο蠓治觯?code>OOA)所創(chuàng)建的分析模型轉(zhuǎn)化為設(shè)計模型勾徽,其目標(biāo)是定義系統(tǒng)構(gòu)造藍(lán)圖。
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è)計原則
-
單一責(zé)任原則(
SRP
)
當(dāng)需要修改某個類的時候原因有且僅有一個,讓一個類只做一種類型責(zé)任咒钟。 -
開發(fā)-封閉原則(
OCP
)
類吹由、模塊、函數(shù)等應(yīng)該是可以擴展的盯腌,即開放的;但是不可修改的陨瘩,即封閉的腕够。 -
里氏替換原則(
LSP
)
子類型必須能夠替換他們的基類型。 -
依賴倒置原則(
DIP
)
抽象不應(yīng)該依賴于細(xì)節(jié)舌劳,細(xì)節(jié)應(yīng)該依賴于抽象帚湘。即,高層模塊不應(yīng)該依賴于低層模塊甚淡,二者都應(yīng)該依賴于抽象大诸。 -
接口分離原則(
ISP
)
不應(yīng)該強迫客戶依賴于它們不用的方法。即贯卦,依賴于抽象资柔,不要依賴于具體,同時在抽象級別不應(yīng)該有對于細(xì)節(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)定的方向進(jìn)行依賴纵搁。 -
穩(wěn)定抽象原則(
SAP
)
包的抽象程度應(yīng)該和其穩(wěn)定程度一致。
(四)面向?qū)ο蟪绦蛟O(shè)計
面向?qū)ο蟪绦蛟O(shè)計(OOP
)的實質(zhì)是選用一種面向?qū)ο蟪绦蛟O(shè)計語言(OOPL
)往踢,采用對象腾誉、類及其相關(guān)概念所進(jìn)行的程序設(shè)計。
1. 類
類具有實例化功能,包括實例生成和實例消除妄辩。
類的特征:
- 同一個類的不同實例具有相同的數(shù)據(jù)結(jié)構(gòu)惑灵,承受的是同一方法集合所定義的操作,因而具有規(guī)律相同的行為
- 同一個類的不同實例可以持有不同的值眼耀,因而可以具有不同的狀態(tài)
- 實例的初始狀態(tài)可以在實例化時確定
2. 繼承和類層次結(jié)構(gòu)
孤立的類只能描述實體集合的特征同一性英支,而客觀世界中實體集合的劃分通常還要考慮實體特征方面有關(guān)聯(lián)的相似性,在面向?qū)ο蟪绦蛟O(shè)計中使用繼承來解決這一問題哮伟。
當(dāng)執(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),對象自身引用的類型則決定了方法體被實際共享的范圍萎庭。
對象自身引用機制使得在進(jìn)行方法的設(shè)計和實現(xiàn)時并不需要考慮與對象聯(lián)系的細(xì)節(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試可以分為下列四個層次進(jìn)行:
- 算法層
測試類中定義的每個方法琐凭,基本上相當(dāng)于傳統(tǒng)軟件測試中的單元測試芽隆。 - 類層
測試封裝在同一個類中的所有方法與屬性之間的相互作用,可以認(rèn)為這是面向?qū)ο鬁y試中所特有的模塊測試统屈。 - 模板層
測試一組協(xié)同工作的類之間的相互作用胚吁,大體上相當(dāng)于傳統(tǒng)軟件測試中的集成測試。 - 系統(tǒng)層
把各個子系統(tǒng)組裝成完整的面向?qū)ο筌浖到y(tǒng)愁憔,在組裝過程中同時進(jìn)行測試腕扶。