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

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

  1. 單一責任原則(SRP
    當需要修改某個類的時候原因有且僅有一個,讓一個類只做一種類型責任。
  2. 開發(fā)-封閉原則(OCP
    類、模塊、函數(shù)等應(yīng)該是可以擴展的,即開放的;但是不可修改的,即封閉的。
  3. 里氏替換原則(LSP
    子類型必須能夠替換他們的基類型。
  4. 依賴倒置原則(DIP
    抽象不應(yīng)該依賴于細節(jié),細節(jié)應(yīng)該依賴于抽象。即,高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象。
  5. 接口分離原則(ISP
    不應(yīng)該強迫客戶依賴于它們不用的方法。即,依賴于抽象,不要依賴于具體,同時在抽象級別不應(yīng)該有對于細節(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)定的方向進行依賴。
  6. 穩(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試可以分為下列四個層次進行:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容