軟件設(shè)計師考試 | 第七章 面向?qū)ο蠹夹g(shù) | 面向?qū)ο蠡A(chǔ)

為了統(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è)計原則

  1. 單一責(zé)任原則(SRP
    當(dāng)需要修改某個類的時候原因有且僅有一個,讓一個類只做一種類型責(zé)任咒钟。
  2. 開發(fā)-封閉原則(OCP
    類吹由、模塊、函數(shù)等應(yīng)該是可以擴展的盯腌,即開放的;但是不可修改的陨瘩,即封閉的腕够。
  3. 里氏替換原則(LSP
    子類型必須能夠替換他們的基類型。
  4. 依賴倒置原則(DIP
    抽象不應(yīng)該依賴于細(xì)節(jié)舌劳,細(xì)節(jié)應(yīng)該依賴于抽象帚湘。即,高層模塊不應(yīng)該依賴于低層模塊甚淡,二者都應(yīng)該依賴于抽象大诸。
  5. 接口分離原則(ISP
    不應(yīng)該強迫客戶依賴于它們不用的方法。即贯卦,依賴于抽象资柔,不要依賴于具體,同時在抽象級別不應(yīng)該有對于細(xì)節(jié)的依賴撵割。

上述五項是面向?qū)ο蠓椒ㄖ械奈宕笤瓌t贿堰,除了這五項外,還提出了以下幾項設(shè)計原則:

  1. 重用發(fā)布等價原則(REP
    重用的粒度就是發(fā)布的粒度啡彬。
  2. 共同封閉原則(CCP
    包中所有的類對于同一類性質(zhì)的變化應(yīng)該是共同封閉的羹与。
  3. 共同重用原則(CRP
    一個包中的所有類應(yīng)該是共同重用的。
  4. 無環(huán)依賴原則(ADP
    在包的依賴關(guān)系中不允許存在環(huán)庶灿。
  5. 穩(wěn)定依賴原則(SDP
    朝著穩(wěn)定的方向進(jìn)行依賴纵搁。
  6. 穩(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)行:

  1. 算法層
    測試類中定義的每個方法琐凭,基本上相當(dāng)于傳統(tǒng)軟件測試中的單元測試芽隆。
  2. 類層
    測試封裝在同一個類中的所有方法與屬性之間的相互作用,可以認(rèn)為這是面向?qū)ο鬁y試中所特有的模塊測試统屈。
  3. 模板層
    測試一組協(xié)同工作的類之間的相互作用胚吁,大體上相當(dāng)于傳統(tǒng)軟件測試中的集成測試。
  4. 系統(tǒng)層
    把各個子系統(tǒng)組裝成完整的面向?qū)ο筌浖到y(tǒng)愁憔,在組裝過程中同時進(jìn)行測試腕扶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吨掌,隨后出現(xiàn)的幾起案子半抱,更是在濱河造成了極大的恐慌,老刑警劉巖膜宋,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窿侈,死亡現(xiàn)場離奇詭異,居然都是意外死亡激蹲,警方通過查閱死者的電腦和手機棉磨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門江掩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來学辱,“玉大人,你說我怎么就攤上這事环形〔咂” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵抬吟,是天一觀的道長萨咕。 經(jīng)常有香客問我,道長火本,這世上最難降的妖魔是什么危队? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钙畔,結(jié)果婚禮上茫陆,老公的妹妹穿的比我還像新娘。我一直安慰自己擎析,他們只是感情好簿盅,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般桨醋。 火紅的嫁衣襯著肌膚如雪棚瘟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天喜最,我揣著相機與錄音偎蘸,去河邊找鬼。 笑死返顺,一個胖子當(dāng)著我的面吹牛禀苦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遂鹊,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼振乏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秉扑?” 一聲冷哼從身側(cè)響起慧邮,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舟陆,沒想到半個月后误澳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡秦躯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年忆谓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踱承。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡倡缠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茎活,到底是詐尸還是另有隱情昙沦,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布载荔,位于F島的核電站盾饮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懒熙。R本人自食惡果不足惜丘损,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望工扎。 院中可真熱鬧徘钥,春花似錦、人聲如沸定庵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猪落,卻和暖如春贞远,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笨忌。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工蓝仲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人官疲。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓袱结,卻偏偏與公主長得像,于是被迫代替她去往敵國和親途凫。 傳聞我的和親對象是個殘疾皇子垢夹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容