軟件詳細(xì)設(shè)計(jì)第8章面向?qū)ο筌浖敿?xì)設(shè)計(jì)_第1頁(yè)
軟件詳細(xì)設(shè)計(jì)第8章面向?qū)ο筌浖敿?xì)設(shè)計(jì)_第2頁(yè)
軟件詳細(xì)設(shè)計(jì)第8章面向?qū)ο筌浖敿?xì)設(shè)計(jì)_第3頁(yè)
軟件詳細(xì)設(shè)計(jì)第8章面向?qū)ο筌浖敿?xì)設(shè)計(jì)_第4頁(yè)
軟件詳細(xì)設(shè)計(jì)第8章面向?qū)ο筌浖敿?xì)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩135頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第8章 面向?qū)ο筌浖敿?xì)設(shè)計(jì) 8.1 面向?qū)ο蠛?jiǎn)介8.2 面向?qū)ο蟮南嚓P(guān)概念8.3 鏈接與關(guān)聯(lián)8.4 聚合8.5 概括8.6 構(gòu)造分組8.7 小結(jié)8.1 面向?qū)ο蠛?jiǎn)介“面向?qū)ο?Object-Oriented,OO)”是指把一組相互之間沒(méi)有聯(lián)系的對(duì)象有效地集成在一起,這些對(duì)象都是將數(shù)據(jù)結(jié)構(gòu)和行為緊密地結(jié)合在一起的。這和傳統(tǒng)的程序設(shè)計(jì)不同,傳統(tǒng)的思想是將數(shù)據(jù)結(jié)構(gòu)和行為松散地連接在一起。當(dāng)然,這里存在著哪些特性是真正的面向?qū)ο蠓椒ǖ臓?zhēng)論。但不管怎么說(shuō),通常面向?qū)ο蠓椒ㄖ辽侔膫€(gè)方面:標(biāo)識(shí)、分類、多態(tài)和繼承。通過(guò)將抽象、封裝和模塊結(jié)合在一起的方法,可使面向?qū)ο蟮乃枷胴灤┯谡麄€(gè)軟件開(kāi)發(fā)生命周期中。為

2、了能使用計(jì)算機(jī)處理來(lái)自現(xiàn)實(shí)世界的事物,人們必須提取出事物的本質(zhì)特征。在研究現(xiàn)實(shí)世界事物的過(guò)程中,忽略問(wèn)題中與當(dāng)前目標(biāo)無(wú)關(guān)的部分,以便更充分地集中與當(dāng)前目標(biāo)有關(guān)的部分,這種方法就是抽象。現(xiàn)實(shí)世界中的事物是復(fù)雜的,所以不能試圖一步到位地理解完整的事物,而僅選擇它的一部分作為研究重點(diǎn),這是一種行之有效的方法。抽象是體現(xiàn)這一方法的有效工具,它是去除一個(gè)事物中對(duì)當(dāng)前目標(biāo)不重要的細(xì)節(jié),僅保留它的可描述的特征,從而形成的一個(gè)抽象數(shù)據(jù),同時(shí)它也是面向?qū)ο蟪绦蛟O(shè)計(jì)的起點(diǎn)和基礎(chǔ)。封裝的意義在于將數(shù)據(jù)抽象類型及其操作緊密地結(jié)合在一起,成為一個(gè)整體,從而使每個(gè)模塊的界面盡量少地暴露它的內(nèi)部工作。封裝將外部規(guī)格說(shuō)明從內(nèi)

3、部實(shí)現(xiàn)中分離出來(lái),外部規(guī)格說(shuō)明必須在開(kāi)發(fā)早期提出,而內(nèi)部實(shí)現(xiàn)則可以推遲。模塊化促進(jìn)了邏輯一致性、可理解性和對(duì)稱性。8.1.1 面向?qū)ο蟮母拍钣捎诿嫦驅(qū)ο蠓椒ㄒ呀?jīng)發(fā)展到計(jì)算機(jī)科學(xué)技術(shù)的許多領(lǐng)域,所以若想從一般意義上給出“面向?qū)ο蠓椒ā眹?yán)格而清晰的定義,使之對(duì)這些領(lǐng)域都能適用,是一件很困難的事。20世紀(jì)80年代初期以前的定義是:面向?qū)ο笫且环N新興的程序設(shè)計(jì)方法,或者是一種新的程序設(shè)計(jì)范型(Paradigm),其基本思想是使用對(duì)象、類、繼承、封裝、消息等基本概念來(lái)進(jìn)行程序設(shè)計(jì)。自20世紀(jì)80年代以來(lái),面向?qū)ο蠓椒ㄒ焉钊氲接?jì)算機(jī)軟件領(lǐng)域的幾乎所有分支,遠(yuǎn)遠(yuǎn)超出了程序設(shè)計(jì)語(yǔ)言和編程技術(shù)的范疇。但是,即使

4、在“計(jì)算機(jī)軟件”范圍內(nèi)定義什么是面向?qū)ο笠踩匀皇遣煌暾?,因?yàn)槊嫦驅(qū)ο蠓椒ㄟ€發(fā)展到計(jì)算機(jī)軟件以外的其他領(lǐng)域,如計(jì)算機(jī)體系結(jié)構(gòu)和人工智能等。由于本書(shū)是討論軟件開(kāi)發(fā)方面的問(wèn)題的,而面向?qū)ο蠓椒ㄒ言谄渲挟a(chǎn)生了巨大影響并發(fā)展為較為完整的理論與技術(shù)體系,所以就在這個(gè)范圍內(nèi)討論什么是面向?qū)ο蟆C嫦驅(qū)ο蟛粌H是一些具體的軟件開(kāi)發(fā)技術(shù)與策略,而且是一整套關(guān)于如何看待軟件系統(tǒng)與現(xiàn)實(shí)世界的關(guān)系,同時(shí)以什么觀點(diǎn)來(lái)研究問(wèn)題并進(jìn)行求解,以及如何進(jìn)行系統(tǒng)構(gòu)造的軟件方法學(xué)。概括地說(shuō),面向?qū)ο蠓椒ǖ幕舅枷胧菑默F(xiàn)實(shí)世界中客觀存在的事物(即對(duì)象)出發(fā)來(lái)構(gòu)造軟件系統(tǒng),并在系統(tǒng)構(gòu)造中盡可能地運(yùn)用人類的自然思維方式。開(kāi)發(fā)一個(gè)軟件是為了

5、解決某些問(wèn)題,這些問(wèn)題所涉及的業(yè)務(wù)范圍稱做該軟件的問(wèn)題域。面向?qū)ο蠓椒◤?qiáng)調(diào)直接以問(wèn)題域(客觀世界)中的事物為中心來(lái)思考問(wèn)題、認(rèn)識(shí)問(wèn)題,并根據(jù)這些事物的本質(zhì)特征,把它們抽象地表示為系統(tǒng)中的對(duì)象,作為系統(tǒng)的基本構(gòu)成單位。這可以使系統(tǒng)直接地映射問(wèn)題域,保持問(wèn)題域中的事物及其相互關(guān)系的本來(lái)面貌。另外,軟件開(kāi)發(fā)方法不應(yīng)該是超脫人類日常的思維方式,并與人類在長(zhǎng)期進(jìn)化過(guò)程中形成的各種行之有效的思想方法迥然不同的思想理論體系。如果說(shuō),在某些歷史階段出現(xiàn)的軟件開(kāi)發(fā)方法沒(méi)有從人類的思想寶庫(kù)中汲取較多的營(yíng)養(yǎng),只是建立在自身獨(dú)有的概念、符號(hào)、規(guī)則、策略的基礎(chǔ)之上,那只能說(shuō)明軟件科學(xué)本身尚處于比較幼稚的時(shí)期。結(jié)構(gòu)化方法

6、采用了許多符合人類思維習(xí)慣的原則與策略。面向?qū)ο蠓椒ǜ訌?qiáng)調(diào)運(yùn)用人類在日常邏輯思維中經(jīng)常采用的思想方法與原則,例如抽象、分類、繼承、聚合、封裝等。這使得軟件開(kāi)發(fā)者能更有效地思考問(wèn)題,并以其他人也能明白的方式把自己的觀點(diǎn)表達(dá)出來(lái)。具體地講,面向?qū)ο蠓椒ㄓ幸韵乱恍┲饕攸c(diǎn):(1) 從問(wèn)題域中客觀存在的事物出發(fā)來(lái)構(gòu)造軟件系統(tǒng),用對(duì)象作為對(duì)這些事物的抽象表示,并以此作為系統(tǒng)的基本構(gòu)成單位。(2) 事物的靜態(tài)特征(即可能用一些數(shù)據(jù)來(lái)表達(dá)的特征)用對(duì)象的屬性表示,事物的動(dòng)態(tài)特征(即事物的行為)用對(duì)象的服務(wù)表示。(3) 對(duì)象的屬性與服務(wù)結(jié)合為一體,成為一個(gè)獨(dú)立的實(shí)體,對(duì)外屏蔽其內(nèi)部細(xì)節(jié)(稱做封裝)。(4)

7、對(duì)事物進(jìn)行分類,把具有相同屬性和服務(wù)的對(duì)象歸一為類。類是這些對(duì)象的抽象描述,每個(gè)對(duì)象是它的類的一個(gè)實(shí)例。(5) 通過(guò)在不同程度上運(yùn)用抽象的原則(較多或較少地忽略事物之間的差異),可以得到較一般的類和較特殊的類。特殊類繼承一般類的屬性與服務(wù),面向?qū)ο蠓椒ㄖС謱?duì)這種繼承關(guān)系的描述與實(shí)現(xiàn),從而簡(jiǎn)化系統(tǒng)的構(gòu)造過(guò)程及其文檔。(6) 復(fù)雜的對(duì)象可以用簡(jiǎn)單的對(duì)象作為其構(gòu)成部分(稱做聚合)。(7) 對(duì)象之間通過(guò)消息進(jìn)行通信,以實(shí)現(xiàn)對(duì)象之間的動(dòng)態(tài)聯(lián)系。(8) 通過(guò)關(guān)聯(lián)表達(dá)對(duì)象之間的靜態(tài)關(guān)系。從以上幾點(diǎn)可以看到,在用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)的系統(tǒng)中,以類的形式進(jìn)行描述并通過(guò)對(duì)類的引用而創(chuàng)建的對(duì)象是系統(tǒng)的基本構(gòu)成單位。這些

8、對(duì)象對(duì)應(yīng)著問(wèn)題域中的各個(gè)事物,它們內(nèi)部的屬性與服務(wù)刻畫(huà)了事物的靜態(tài)特征和動(dòng)態(tài)特征。對(duì)象類之間的繼承關(guān)系、聚合關(guān)系、消息和關(guān)聯(lián)如實(shí)地表達(dá)了問(wèn)題域中事物之間實(shí)際存在的各種關(guān)系。因此,無(wú)論系統(tǒng)的構(gòu)成成分,還是通過(guò)這些成分之間的關(guān)系而體現(xiàn)的系統(tǒng)結(jié)構(gòu),都可直接地映射到問(wèn)題域。通過(guò)以上介紹讀者可以對(duì)“面向?qū)ο蟆庇幸粋€(gè)大致的了解?,F(xiàn)在可對(duì)“面向?qū)ο蠓椒ā弊魅缦露x:面向?qū)ο蠓椒ㄊ且环N運(yùn)用對(duì)象、類、繼承、封裝、聚合、消息傳送、多態(tài)性等概念來(lái)構(gòu)造系統(tǒng)的軟件開(kāi)發(fā)方法。面向?qū)ο蠓椒ǖ幕靖拍钆c原則、發(fā)展歷史與現(xiàn)狀以及它對(duì)改進(jìn)軟件開(kāi)發(fā)的重要意義等,將在以后各節(jié)中介紹。8.1.2 面向?qū)ο蠓椒ǖ臍v史及現(xiàn)狀面向?qū)ο蠓椒ㄆ?/p>

9、源于面向?qū)ο蟮木幊陶Z(yǔ)言。在編程語(yǔ)言這個(gè)領(lǐng)域,面向?qū)ο蠓椒ǖ恼Q生與發(fā)展經(jīng)歷了下述主要階段。面向?qū)ο蠓椒ǖ哪承└拍羁梢宰匪莸?0世紀(jì)50年代人工智做能的早期研究。但是人們一般把20世紀(jì)60年代由挪威計(jì)算中心開(kāi)發(fā)的Simula-67語(yǔ)言看做面向?qū)ο笳Z(yǔ)言發(fā)展史上的第一個(gè)里程碑。20世紀(jì)80年代中期到90年代,是面向?qū)ο笳Z(yǔ)言走向繁榮的階段。其主要表現(xiàn)是大批比較實(shí)用的面向?qū)ο缶幊陶Z(yǔ)言(Object-Oriented Programming Language,OOPL)的涌現(xiàn),例如C+、Objective-C、Object Pascal、CLOS (Common Lisp Object System)、Ei

10、ffel、Actor等。由于不斷有OOPL問(wèn)世,許多非OO語(yǔ)言都增加了OO概念與機(jī)制而發(fā)展為OO語(yǔ)言,這表明OOPL的繁榮仍在繼續(xù),也表明面向?qū)ο笫谴髣?shì)所趨。從20世紀(jì)80年代后期開(kāi)始,國(guó)際上有一批論述面向?qū)ο蟮姆治雠c設(shè)計(jì)(或面向?qū)ο蟮慕Ec設(shè)計(jì))的專著相繼問(wèn)世。這些著作的共同點(diǎn)是把面向?qū)ο蟮姆椒ㄔ诜治雠c設(shè)計(jì)階段的運(yùn)用提升到理論和工程的高度(而不僅僅是一些可供參考的指導(dǎo)思想),各自提出了一套較為完整但又各有差異的系統(tǒng)模型、表示法和實(shí)施策略。8.2 面向?qū)ο蟮南嚓P(guān)概念8.2.1 對(duì)象從一般意義上講,對(duì)象是現(xiàn)實(shí)世界中一個(gè)實(shí)際存在的事物,它可以是有形的(比如一輛汽車),也可以是無(wú)形的(比如一項(xiàng)計(jì)劃)

11、。對(duì)象是構(gòu)成世界的一個(gè)獨(dú)立單位,它具有自己的靜態(tài)特征和動(dòng)態(tài)特征。靜態(tài)特征即可以用某種數(shù)據(jù)來(lái)描述的特征,動(dòng)態(tài)特征即對(duì)象所表現(xiàn)出的行為或具有的功能?,F(xiàn)實(shí)世界中的任何事物都可以稱做對(duì)象,它是大量的、無(wú)處不在的。不過(guò),人們?cè)陂_(kāi)發(fā)一個(gè)系統(tǒng)時(shí),通常只是在一定的范圍(問(wèn)題域)內(nèi)考慮和認(rèn)識(shí)與系統(tǒng)目標(biāo)有關(guān)的事物,并用系統(tǒng)中的對(duì)象來(lái)抽象地表示它們。所以面向?qū)ο蠓椒ㄔ谔岬健皩?duì)象”這個(gè)術(shù)語(yǔ)時(shí),既可能泛指現(xiàn)實(shí)世界中的某些事物,也可能專指它們?cè)谙到y(tǒng)中的抽象表示,即系統(tǒng)中的對(duì)象。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)構(gòu)成。屬性和服務(wù)是構(gòu)成對(duì)象的兩個(gè)主要因素。其中屬性是用來(lái)描述對(duì)象靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng);服務(wù)是用來(lái)描

12、述對(duì)象動(dòng)態(tài)特征(行為)的一個(gè)操作序列,也可稱為操作或方法。一個(gè)對(duì)象可以有多項(xiàng)屬性和多項(xiàng)服務(wù)。一個(gè)對(duì)象的屬性和服務(wù)被結(jié)合成一個(gè)整體,對(duì)象的屬性值只能由這個(gè)對(duì)象的服務(wù)存取。根據(jù)以上的說(shuō)明,可以給出如下對(duì)象定義:對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)構(gòu)成。附屬定義:屬性:用來(lái)描述對(duì)象靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng)。服務(wù):用來(lái)描述對(duì)象動(dòng)態(tài)特征(行為)的一個(gè)操作序列。特例:(1) 有屬性,沒(méi)有服務(wù)。例如信息系統(tǒng)中的人員信息、物質(zhì)信息。(2) 有服務(wù),沒(méi)有屬性。例如操作系統(tǒng)中的屏幕中斷:disable();控制結(jié)束檢查:getclock(

13、)。對(duì)象有如下一些基本特點(diǎn):(1) 以數(shù)據(jù)為中心。操作圍繞對(duì)對(duì)象數(shù)據(jù)所需要做的處理來(lái)設(shè)置,不設(shè)置與這些數(shù)據(jù)無(wú)關(guān)的操作,而且操作的結(jié)果往往與當(dāng)時(shí)所處的狀態(tài)(數(shù)據(jù)的值)有關(guān)。(2) 對(duì)象是主動(dòng)的。它與傳統(tǒng)的數(shù)據(jù)有本質(zhì)的不同,不是被動(dòng)地等待對(duì)它進(jìn)行處理,相反,它是進(jìn)行處理的主體。為了完成某個(gè)操作,不能從外部直接加工它的私有數(shù)據(jù),而是必須通過(guò)它的公有接口向?qū)ο蟀l(fā)消息,請(qǐng)求它執(zhí)行它的某個(gè)操作,并處理它的私有數(shù)據(jù)。(3) 實(shí)現(xiàn)了數(shù)據(jù)封裝。對(duì)象好像是一只黑盒子,它的私有數(shù)據(jù)完全被封裝在盒子內(nèi)部,對(duì)外是隱藏的、不可見(jiàn)的,對(duì)私有數(shù)據(jù)的訪問(wèn)或處理只能通過(guò)公有操作進(jìn)行。為了使用對(duì)象內(nèi)部的私有數(shù)據(jù),只需知道數(shù)據(jù)的取值

14、范圍(值域)和可以對(duì)該數(shù)據(jù)施加的操作(即對(duì)象提供了哪些處理或訪問(wèn)數(shù)據(jù)的公有方法)即可,根本無(wú)須知道數(shù)據(jù)的具體結(jié)構(gòu)以及實(shí)現(xiàn)操作的算法,這也就是抽象數(shù)據(jù)類型的概念。因此,一個(gè)對(duì)象類型也可以看做是一種抽象數(shù)據(jù)類型。(4) 本質(zhì)上具有并行性。對(duì)象是描述其內(nèi)部狀態(tài)的數(shù)據(jù)及可以對(duì)這些數(shù)據(jù)施加的全部操作的集合。不同對(duì)象各自獨(dú)立地處理自身的數(shù)據(jù),彼此通過(guò)傳遞信息來(lái)完成通信。因此,對(duì)象本質(zhì)上具有并行工作的屬性。(5) 模塊獨(dú)立性好。對(duì)象是面向?qū)ο蟮能浖幕灸K,為了充分發(fā)揮模塊化簡(jiǎn)化開(kāi)發(fā)工作的優(yōu)點(diǎn),希望模塊的獨(dú)立性強(qiáng)。具體來(lái)說(shuō),也就是要求模塊的內(nèi)聚性強(qiáng)、耦合性弱。如前所述,對(duì)象是由數(shù)據(jù)及可以對(duì)這些數(shù)據(jù)施加的操

15、作所組成的統(tǒng)一體,而且對(duì)象是以數(shù)據(jù)為中心的,操作圍繞對(duì)其數(shù)據(jù)所需做的處理來(lái)設(shè)置,沒(méi)有無(wú)關(guān)的操作。因此,對(duì)象內(nèi)部的各種元素彼此結(jié)合得很緊密,內(nèi)聚性相當(dāng)強(qiáng)。由于完成對(duì)象所需要的元素(數(shù)據(jù)和方法)基本上都被封裝在對(duì)象內(nèi)部,它與外界的聯(lián)系自然就比較少,因此,對(duì)象之間的耦合通常比較弱。系統(tǒng)中的一個(gè)對(duì)象在軟件生命周期的各個(gè)階段可能有不同的表示形式。例如,在分析與設(shè)計(jì)階段是用某種面向?qū)ο蠓治?面向?qū)ο笤O(shè)計(jì)(OOA/OOD)方法所提供的表示法給出比較粗略的定義,而在編程階段則要用一種OOPL寫(xiě)出詳細(xì)而確切的源程序代碼。這就是說(shuō),系統(tǒng)中的對(duì)象經(jīng)歷若干演化階段,其表現(xiàn)形式各異,但在概念上是一致的都是問(wèn)題域中某一事

16、物的抽象表示。8.2.2 類人類在認(rèn)識(shí)客觀世界時(shí)經(jīng)常采用的思維方法,就是把眾多的事物歸納、劃分成一些類。依據(jù)抽象的原則進(jìn)行分類,即忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個(gè)抽象的概念。例如:張三、李四、王五等人的職業(yè)、性格、愛(ài)好、特長(zhǎng)等各有不同,但是他們的基本特征是相似的,都是黃皮膚、黑頭發(fā)、黑眼睛,于是人們把他們統(tǒng)稱為“中國(guó)人”。人類習(xí)慣于將相似特征的事物歸為類,分類是人類認(rèn)識(shí)客觀世界的基本方法。在面向?qū)ο蠓椒ㄖ?,類的定義是:類是具有相同屬性和服務(wù)的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包

17、括屬性和服務(wù)兩個(gè)主要部分。類與對(duì)象的關(guān)系如同一個(gè)模具與用這個(gè)模具鑄造出來(lái)的鑄件之間的關(guān)系。它們的關(guān)系可以用圖表示。類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象則是符合這種定義的一個(gè)實(shí)體。所以,一個(gè)對(duì)象又稱做類的一個(gè)實(shí)例(instance),也有人把類稱做對(duì)象的模板(template)。圖8.1 類與對(duì)象的關(guān)系“實(shí)體”、“實(shí)例”意味著什么呢?最現(xiàn)實(shí)的一件事是:在程序中,每個(gè)對(duì)象需要有自己的存儲(chǔ)空間,以保存它們自己的屬性值。同類對(duì)象具有相同的屬性與服務(wù),是指它們的定義形式相同,而不是說(shuō)每個(gè)對(duì)象的屬性值都相同??梢杂梅敲嫦?qū)ο笳Z(yǔ)言中的類型(type)與變量(variable)之間的關(guān)系來(lái)理解類和對(duì)象

18、的關(guān)系。它們很相似,都是集合與成員、抽象描述與具體實(shí)例的關(guān)系。在多數(shù)情況下,類型用于定義數(shù)據(jù),類用于定義對(duì)象。有些面向?qū)ο蟮木幊陶Z(yǔ)言既有類的概念也有類型的概念,如在C+中,用類定義對(duì)象,用類型定義對(duì)象的成員變量。 運(yùn)用抽象的原則舍棄對(duì)象的特殊性,抽取其共同性,則得到對(duì)應(yīng)一批對(duì)象的類,稱這個(gè)類為一般類。在一般類的基礎(chǔ)上,如果定義一個(gè)新類時(shí)考慮其某些特殊性,則這個(gè)類是一般類的特殊類。如果考慮若干類所具有的共同的特征,舍棄它們各自的特殊性,則得到這些類的一般類。一般類和特殊類是相對(duì)而言的,它們之間是一種真包含的關(guān)系。在面向?qū)ο蠓椒ㄖ嘘P(guān)于一般類與特殊類的定義:如果類A具有類B的全部屬性和全部服務(wù),而且

19、具有自己特有的某些屬性或服務(wù),則A叫做B的特殊類,B叫做A的一般類。與一般類/特殊類等價(jià)的其他術(shù)語(yǔ)有超類/子類、基類/派生類、祖先類/后裔類等。8.2.3 對(duì)象圖本書(shū)已在前面討論了一些基本的模型概念,重點(diǎn)是對(duì)象和類,也已經(jīng)用例子和文字說(shuō)明了這些概念。因?yàn)橛眠@種方法對(duì)更加復(fù)雜的問(wèn)題表述得不清楚,所以需要用邏輯上一致的、精確的、容易格式化的對(duì)象模型來(lái)規(guī)范地表述這些概念。對(duì)象圖提供了對(duì)象、類和它們相互之間可聯(lián)系的建模規(guī)范化圖形表示。對(duì)象圖對(duì)抽象建模和設(shè)計(jì)真實(shí)程序兩方面都有用。實(shí)踐表明對(duì)象圖是簡(jiǎn)潔、易理解和易操作的,并且實(shí)際應(yīng)用的效果也很好。本書(shū)自始至終用對(duì)象圖對(duì)對(duì)象、類及它們的相互聯(lián)系進(jìn)行描述,用列

20、舉對(duì)象圖來(lái)介紹新概念并解釋這些概念。對(duì)象圖有兩種類型:類圖和實(shí)例圖。類圖是描述許多可能的數(shù)據(jù)實(shí)例的一種模式或模板,也就是描述對(duì)象類的。實(shí)例圖是描述對(duì)象之間相互關(guān)系的一種特殊的集合,也就是描述對(duì)象實(shí)例的。實(shí)例圖用于文檔測(cè)試案例(如說(shuō)明)和所討論的例子。一個(gè)給定的類圖相當(dāng)于實(shí)例圖的無(wú)限組合。類圖描述在一個(gè)系統(tǒng)中建模的通用情況,實(shí)例圖主要用于表示實(shí)例,從而幫助人們清晰理解復(fù)雜的類圖。類圖和實(shí)例圖之間的區(qū)別實(shí)際上是人為的。類和實(shí)例可以出現(xiàn)在同一個(gè)對(duì)象圖上,但通常不使用類和實(shí)例混合在一起的做法。8.2.4 屬性屬性是一個(gè)類中對(duì)象所具有的數(shù)據(jù)值。名字、年齡和性別是對(duì)象“人”的屬性。顏色、重量和型號(hào)是對(duì)象“

21、汽車”的屬性。對(duì)每個(gè)對(duì)象實(shí)例來(lái)說(shuō),每個(gè)屬性都是一個(gè)值。例如,年齡屬性。在對(duì)象小強(qiáng)中有一個(gè)值“28”,其含義是小強(qiáng)28歲。不同的對(duì)象實(shí)例可以有相同或不同的屬性。每個(gè)屬性名在一個(gè)表中是唯一的,而在兩個(gè)不同的類中可以有相同的屬性名,例如類“人(Person)”和類“公司(Company)”都可以有地址屬性。一個(gè)屬性應(yīng)是純數(shù)據(jù)值,而不是一個(gè)對(duì)象。與對(duì)象不同,純數(shù)據(jù)值沒(méi)有標(biāo)識(shí)。例如,所有整數(shù)“18”的當(dāng)前值是不作區(qū)分的。屬性置于類矩形框的第二個(gè)部分(參見(jiàn)圖8.8),每個(gè)屬性名有可供選擇項(xiàng),如類型和缺省值。在類型前置入冒號(hào),缺省值前用等號(hào)(=);也可以在類矩形框中忽略屬性,這依賴于對(duì)象模型中所期望描述的細(xì)

22、節(jié)層次。類矩形框在類名和屬性之間有一條橫線。對(duì)象框沒(méi)有這條橫線,這也是它與類矩形框的不同之處。某些實(shí)現(xiàn)工具(如許多數(shù)據(jù)庫(kù))要求一個(gè)對(duì)象有唯一的標(biāo)識(shí)符來(lái)標(biāo)識(shí)對(duì)象,大多數(shù)面向?qū)ο笳Z(yǔ)言對(duì)每個(gè)參照對(duì)象自動(dòng)產(chǎn)生隱含標(biāo)識(shí)符。標(biāo)識(shí)符是計(jì)算機(jī)自動(dòng)產(chǎn)生的內(nèi)碼,在標(biāo)識(shí)一個(gè)對(duì)象時(shí)沒(méi)有其他的內(nèi)在含義。8.2.5 服務(wù)(操作或方法)服務(wù)是一種功能或一種轉(zhuǎn)換,它應(yīng)用于類中的對(duì)象或被類中對(duì)象使用。打開(kāi)、關(guān)閉、隱藏和重新顯示是在窗口類上的服務(wù)。雇用、解雇和分紅利是在公司類上的服務(wù)。在一個(gè)類中所有對(duì)象共享相同的服務(wù)。相同的服務(wù)可用于許多不同的類中,這樣的服務(wù)是多態(tài)的。也就是說(shuō),同樣的服務(wù)在不同的類中可選用不同的格式。方法僅依賴

23、于類上的目標(biāo)對(duì)象,它是一個(gè)類的服務(wù)的實(shí)現(xiàn)。例如,類File可以有一個(gè)服務(wù)print。不同的方法能夠?qū)崿F(xiàn)打印ASCII文件、二進(jìn)制文件以及數(shù)字圖像文件。所有這些方法在邏輯上執(zhí)行相同的任務(wù)打印一個(gè)文件,這樣可以用通用的服務(wù)print引用它們,而每種方法卻是用不同的代碼段加以實(shí)現(xiàn)的。每種服務(wù)都有一個(gè)內(nèi)含參數(shù)的目標(biāo)對(duì)象,該服務(wù)的行為依賴于它的目標(biāo)類。一個(gè)對(duì)象“知道”它的類,并能正確實(shí)現(xiàn)該服務(wù)。一種服務(wù)可對(duì)它的目標(biāo)對(duì)象添加參數(shù),這種以參數(shù)化表示的服務(wù)并不影響方法的選擇,方法僅依賴于該目標(biāo)對(duì)象的類(個(gè)別面向?qū)ο笳Z(yǔ)言,如Close,允許方法的選擇依賴于參數(shù)個(gè)數(shù),但這會(huì)導(dǎo)致語(yǔ)義的復(fù)雜化,不提倡這么做)。當(dāng)一種

24、服務(wù)在幾個(gè)類上有多種方法時(shí),重要的是所有這些方法都要有相同的特征簽名(Signature)參數(shù)個(gè)數(shù)、類型以及結(jié)果值的類型。例如,一種方法打印(print)不應(yīng)該用文件名作為參數(shù),也不應(yīng)該用文件指針作為參數(shù)。服務(wù)的所有方法的行為都應(yīng)保持一致,語(yǔ)義上不同的兩種服務(wù)最好避免使用相同的名字,即使這兩種服務(wù)用于類的不同集合。例如,使用倒置名字是一種不太明智的作法既描述矩陣求逆,又描述幾何圖形的倒置變換。在特大型項(xiàng)目中,必須調(diào)節(jié)名字轄區(qū)的某種形式,使之不發(fā)生沖突,最好避免任何可能的混淆。服務(wù)列置于類矩形框的第三部分,也是最低部分。每種服務(wù)名后可跟有可任選的部分,諸如參數(shù)表和結(jié)果類型。參數(shù)表寫(xiě)在名字后的圓括

25、號(hào)內(nèi),參數(shù)用逗號(hào)分隔開(kāi),每個(gè)參數(shù)和參數(shù)類型都可以給定。結(jié)果類型之前用冒號(hào)隔開(kāi),這是不能省略的,因?yàn)檫@是區(qū)別返回值的服務(wù)中重要的環(huán)節(jié)。花括號(hào)內(nèi)的空參數(shù)表顯式表示沒(méi)有參數(shù),也就是說(shuō),沒(méi)有任何服務(wù)可做。服務(wù)在高層圖中可以省略。在建模期間,將有副作用的服務(wù)與那些無(wú)需修改任何對(duì)象就能計(jì)算函數(shù)值的服務(wù)區(qū)分開(kāi)是很有用的。后一種類型的服務(wù)就是查詢。若除目標(biāo)對(duì)象外沒(méi)有其他參數(shù)的查詢,可以當(dāng)做導(dǎo)出屬性考慮。8.2.6 封裝封裝是面向?qū)ο蠓椒ǖ囊粋€(gè)重要原則。它有兩個(gè)含義:第一個(gè)含義是把對(duì)象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位(即對(duì)象);第二個(gè)含義也稱做“信息隱蔽”,即盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),

26、對(duì)外形成一個(gè)邊界(或者說(shuō)形成一道屏障),只保留有限的對(duì)外接口使之與外部發(fā)生聯(lián)系。這主要是指對(duì)象的外部不能直接地存取對(duì)象的屬性,只能通過(guò)幾個(gè)允許外部使用的服務(wù)與對(duì)象發(fā)生聯(lián)系。下面用比較簡(jiǎn)練的語(yǔ)言給出封裝的定義:封裝就是把對(duì)象的屬性、服務(wù)結(jié)合成為一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)的一種機(jī)制。封裝的信息隱蔽作用反映了事物的相對(duì)獨(dú)立性。當(dāng)我們站在對(duì)象以外的角度觀察一個(gè)對(duì)象時(shí),只需要注意它對(duì)外呈現(xiàn)什么行為,而不必關(guān)心它的內(nèi)部細(xì)節(jié)。規(guī)定了它的職責(zé)之后,就不應(yīng)該隨意從外部插手去改動(dòng)它的內(nèi)部信息或干預(yù)它的工作。封裝的原則在軟件上的反映是:要求使對(duì)象以外的部分不能隨意存取對(duì)象的內(nèi)部數(shù)據(jù)(屬性),從而

27、有效地避免了外部錯(cuò)誤對(duì)它的“交叉感染”,使軟件錯(cuò)誤能夠局部化。當(dāng)對(duì)象的內(nèi)部需要修改時(shí),由于它只通過(guò)少量的服務(wù)接口對(duì)外提供服務(wù),因此大大減少了內(nèi)部的修改對(duì)外部的影響,即減少了修改引起的“波動(dòng)效應(yīng)”。例如:用“售報(bào)亭”對(duì)象描述現(xiàn)實(shí)中的一個(gè)售報(bào)亭。它的屬性是亭內(nèi)的各種報(bào)刊(其名稱、定價(jià))和錢(qián)箱(總金額),它有兩個(gè)服務(wù)報(bào)刊零售和款貨清點(diǎn)。封裝意味著這些屬性和服務(wù)結(jié)合成一個(gè)不可分的整體售報(bào)亭對(duì)象。它對(duì)外有一道邊界,即亭子的隔板,并留一個(gè)接口,即售報(bào)窗口,在這里提供報(bào)刊零售服務(wù)。顧客只能從這個(gè)窗口要求提供報(bào)務(wù),而不能自己伸手到亭內(nèi)拿報(bào)紙和找零錢(qián)。款貨清點(diǎn)是一個(gè)內(nèi)部服務(wù),不向顧客開(kāi)放。前面已經(jīng)討論了封裝的好

28、處,然而封裝也有它的副作用。如果強(qiáng)調(diào)嚴(yán)格的封裝,則對(duì)象的任何屬性都不允許外部直接存取,因此就要增加許多沒(méi)有其他意義、只負(fù)責(zé)讀或?qū)懙姆?wù)。這為編程工作增加了負(fù)擔(dān),也增加了運(yùn)行開(kāi)銷,并且使程序顯得臃腫。為了避免這一點(diǎn),OOPL往往采取一種比較現(xiàn)實(shí)的靈活態(tài)度允許對(duì)象有不同程度的可見(jiàn)性??梢?jiàn)性的代價(jià)是放棄封裝所帶來(lái)的好處。各種編程語(yǔ)言采取了不同的作法。純OO的編程語(yǔ)言一般采取嚴(yán)格的封裝(如Smalltalk);混合型OO編程語(yǔ)言有的完全可見(jiàn)(如Object Pascal和Objective-C),有的采取折中方案,即允許程序員指定哪些屬性和服務(wù)是可見(jiàn)的,哪些是不可見(jiàn)的(如C+、Java)。目前看來(lái),折

29、中的做法是最受用戶歡迎的。8.2.7 繼承繼承是OO方法中一個(gè)十分重要的概念,并且是OO技術(shù)可提高軟件開(kāi)發(fā)效率的重要原因之一,其定義是:特殊類的對(duì)象擁有其一般類的全部屬性與服務(wù),稱做特殊類對(duì)一般類的繼承。繼承意味著“自動(dòng)地?fù)碛小被颉半[含地復(fù)制”,即特殊類中不必重新定義已在它的一般類中定義過(guò)的屬性和服務(wù),而它卻自動(dòng)地、隱含地?fù)碛衅湟话泐惖乃袑傩耘c服務(wù)。OO方法的這種特性稱做對(duì)象的繼承性。從一般類和特殊類的定義可以看到,后者對(duì)前者的繼承在邏輯上是必然的。繼承的實(shí)現(xiàn)則是通過(guò)OO系統(tǒng)(例如OOPL)的繼承機(jī)制來(lái)保證的。下面給出用C+寫(xiě)的在日期表示形式上的類繼承。一個(gè)特殊類既有自己新定義的屬性和服務(wù),

30、又有從它的一般類中繼承下來(lái)的屬性與服務(wù)。繼承來(lái)的屬性和服務(wù)盡管是隱式的(不用書(shū)寫(xiě)出來(lái)),但是無(wú)論在概念上還是在實(shí)際效果上,都確確實(shí)實(shí)地是這個(gè)類的屬性和服務(wù)。當(dāng)這個(gè)特殊類又被它更下層的特殊類繼承時(shí),它繼承來(lái)的和自己定義的屬性和服務(wù)又都一起被更下層的類繼承下去。也就是說(shuō),繼承關(guān)系是傳遞的。繼承具有重要的實(shí)際意義,它簡(jiǎn)化了人們對(duì)事物的認(rèn)識(shí)和描述。比如認(rèn)識(shí)了輪船的特征之后,在考慮客輪時(shí)只要知道客輪也是一種輪船,那就認(rèn)為它理所當(dāng)然的具有輪船的全部一般特征,只需要把精力用于發(fā)現(xiàn)和描述客輪獨(dú)有的那些特征上。在軟件開(kāi)發(fā)過(guò)程中,在定義特殊類時(shí),不需要把它的一般類已經(jīng)定義過(guò)的屬性和服務(wù)重復(fù)地書(shū)寫(xiě)一遍,只需要聲明它

31、是某個(gè)類的特殊類,并定義它自己的特殊屬性和服務(wù),這將明顯地減輕開(kāi)發(fā)工作的強(qiáng)度。繼承對(duì)于軟件復(fù)用是很有益的。在開(kāi)發(fā)一個(gè)系統(tǒng)時(shí),使特殊類繼承一般類,這本身就是軟件復(fù)用,然而其復(fù)用意義不僅如此。如果把用OO方法開(kāi)發(fā)的類作為可復(fù)用構(gòu)件提交到構(gòu)件庫(kù)中,那么在開(kāi)發(fā)新系統(tǒng)時(shí)不僅可以直接地復(fù)用這個(gè)類,還可以把它作為一般類,通過(guò)繼承來(lái)實(shí)現(xiàn)復(fù)用,從而大大擴(kuò)展了復(fù)用范圍。一個(gè)類可以是多個(gè)一般類的特殊類,它從多個(gè)一般類中繼承了屬性與服務(wù),這種繼承模式叫做多繼承。這種情況是很常見(jiàn)的。例如,有了輪船和客運(yùn)工具兩個(gè)一般類,在考慮客輪這個(gè)類時(shí)就可發(fā)現(xiàn),客輪既是一種輪船,又是一種客運(yùn)工具。所以它可以同時(shí)作為輪船和客運(yùn)工具這兩個(gè)

32、類的特殊類。在開(kāi)發(fā)這個(gè)類時(shí),如果能讓它同時(shí)繼承輪船和客運(yùn)工具這兩個(gè)類的屬性與服務(wù),則需要為它新增加的屬性和服務(wù)就更少了,這將進(jìn)一步提高開(kāi)發(fā)效率。但在實(shí)現(xiàn)時(shí)能不能做到這一點(diǎn)卻取決于編程語(yǔ)言是否支持多繼承。繼承是任何一種OOPL必須具備的功能,多繼承則未必,現(xiàn)在有許多OOPL只支持單繼承而不支持多繼承。多繼承無(wú)論從概念上還是從技術(shù)上都是單繼承的推廣。用集合論的術(shù)語(yǔ)解釋多繼承結(jié)構(gòu),即:具有多個(gè)一般類的特殊類,它是各個(gè)一般類交集的一個(gè)子集(可能是真子集,也可能等于這個(gè)交集)。多繼承模式在現(xiàn)實(shí)中也是很常見(jiàn)的,但系統(tǒng)開(kāi)發(fā)是否采用多繼承卻受到OOPL功能的影響。目前比較現(xiàn)實(shí)的做法是,在OOA階段如實(shí)地用多繼

33、承結(jié)構(gòu)描述問(wèn)題域中的多繼承現(xiàn)象(從而使系統(tǒng)模型與問(wèn)題域具有良好的對(duì)應(yīng))。在考慮實(shí)現(xiàn)時(shí),如果決定選用一種僅支持單繼承的語(yǔ)言,則把多繼承轉(zhuǎn)化為單繼承。與多繼承相關(guān)的一個(gè)問(wèn)題是“命名沖突”問(wèn)題。所謂命名沖突,是指當(dāng)一個(gè)特殊類繼承了多個(gè)一般類時(shí),如果這些一般類中的屬性或服務(wù)有彼此同名的現(xiàn)象,則當(dāng)特殊類中引用這樣的屬性名或者服務(wù)名時(shí),系統(tǒng)無(wú)法判定它的語(yǔ)義到底是指哪個(gè)一般類中的屬性和服務(wù)。圖8.2 希望單元內(nèi)的結(jié)果 圖8.3 實(shí)際單元的結(jié)果 解決的辦法有兩種:(1) 不允許多繼承結(jié)構(gòu)中的各個(gè)一般類的屬性及服務(wù)取相同的名字,這會(huì)為開(kāi)發(fā)者帶來(lái)一些不便。(2) 由OOPL提供一種更名機(jī)制,使程序可以在特殊類中更

34、換從各個(gè)一般類繼承來(lái)的屬性或服務(wù)的名字。8.2.8 多重繼承多重繼承允許一個(gè)類有多個(gè)超類,并從多個(gè)超類中繼承屬性、操作和關(guān)聯(lián)。這些混合信息來(lái)自于兩個(gè)或多個(gè)原始信息源。單一繼承把類組織成樹(shù),多重繼承把類組織成有向無(wú)循環(huán)圖,多重繼承的優(yōu)點(diǎn)是有更強(qiáng)有力的能力檢驗(yàn)類和提高類的可重用性,使對(duì)象模型更接近人的思維方式;其缺點(diǎn)是失去了概念上和實(shí)現(xiàn)上的簡(jiǎn)易性。原則上可以定義各種不同的混合規(guī)則,以解決不同方式定義的特性之間的沖突問(wèn)題。1有不同鑒別器的多重繼承多重繼承可以對(duì)相同的類,通過(guò)不同的鑒別器產(chǎn)生。在圖中,人可以通過(guò)管理狀態(tài)的基本前提(經(jīng)理或職員)和雇傭狀態(tài)(全職或兼職的職員)來(lái)判別這個(gè)人是否是經(jīng)理或他是否

35、是獨(dú)立的雇傭狀態(tài)。四個(gè)子類盡可能地把管理狀態(tài)和雇傭狀態(tài)組合在一起。圖中表示了一個(gè)全部工作時(shí)間的職員情況。圖8.4 多重繼承2無(wú)公共祖先的多重繼承多重繼承,甚至有時(shí)超類也可能沒(méi)有公共祖先,這通常發(fā)生在軟件庫(kù)的混合功能方面。當(dāng)軟件庫(kù)重疊或抵觸時(shí),多重繼承就成了問(wèn)題。圖表示了象棋游戲的對(duì)象模型的一部分。象棋程序從當(dāng)前棋格位置尋找前進(jìn)的方位,并檢查多重查詢樹(shù)以決定下一個(gè)最有利的合理的棋格位置??梢园褜?shí)際移動(dòng)的位置存儲(chǔ)到數(shù)據(jù)庫(kù)中(加上日期),或?yàn)榱酥匦孪缕澹严缕暹^(guò)程中的思考中間點(diǎn)記錄到數(shù)據(jù)庫(kù)中,而查詢空間的檢查被看做瞬時(shí)的和不重要的存儲(chǔ)。圖8.5 對(duì)象多重繼承在圖中,每個(gè)查詢樹(shù)可以是一個(gè)走棋子樹(shù),或者

36、是一個(gè)合理的走棋。反過(guò)來(lái),每個(gè)走棋子樹(shù)很少由查詢樹(shù)組成。這樣一個(gè)對(duì)象模型的組合構(gòu)成可以描述任意深度的走棋樹(shù)。每個(gè)走棋可以是合理的走棋,或者是實(shí)際的走棋。無(wú)論是合理的走棋還是實(shí)際的走棋,都從走棋超類中繼承公共的行為。實(shí)際的走棋和象棋游戲是有多個(gè)對(duì)象的類,要永久性存儲(chǔ)。在這個(gè)對(duì)象模型中,永久性對(duì)象必須繼承ODMG(Object Data Management Group,對(duì)象數(shù)據(jù)管理組,OO技術(shù)的國(guó)際標(biāo)準(zhǔn)組織)標(biāo)準(zhǔn)的永久性對(duì)象特征。在圖中,合理的走棋和實(shí)際的走棋使用了多重繼承。3多重繼承的工作環(huán)境處理多重繼承的不足實(shí)際上是一個(gè)實(shí)現(xiàn)問(wèn)題,重新構(gòu)造模型是早期處理這類問(wèn)題最容易的方法。一些重構(gòu)技術(shù)將在下

37、面介紹,其中兩種方法利用了授權(quán)。重構(gòu)技術(shù)是一種實(shí)現(xiàn)技術(shù),通過(guò)它,一個(gè)對(duì)象能將一個(gè)操作傳播給另一個(gè)對(duì)象執(zhí)行。多重繼承的工作環(huán)境包括以下幾種:(1) 用角色的聚合授權(quán)。帶多個(gè)獨(dú)立概括的超類能重構(gòu)成一個(gè)其元素各表示一個(gè)概括的聚合。這種方法是通過(guò)一組構(gòu)成擴(kuò)展對(duì)象的對(duì)象來(lái)替代確定的單一對(duì)象的。該聚合繼承操作不是自動(dòng)的,必須由連接類出發(fā)傳給合適的成員。例如,雇員工資單是計(jì)時(shí)工、周薪工和月薪工的超類,雇員養(yǎng)老金是法定雇員和非法定雇員的超類,然后雇員能成為雇員工資單和雇員養(yǎng)老金的聚合模型。一個(gè)傳給雇員的計(jì)算工資對(duì)象的操作將不得不被雇員類重新指向雇員工資單的組成部分。在這個(gè)方法中,各種連接類不要求很詳細(xì),來(lái)自于

38、不同概括的所有子類的組合都是可能的。(2) 繼承最重要的類并授權(quán)其余的類。構(gòu)造了本身是最重要超類的子類的一種連接類,這個(gè)連接類作為余下的超類的聚合。這種方法通過(guò)一個(gè)最重要的概括提供了標(biāo)識(shí)和繼承。(3) 嵌套概括。嵌套概括是各個(gè)概括因素的層層嵌套。這種方法表示出了所有可能的組合。例如,在每個(gè)計(jì)時(shí)工、周薪工和月薪工下增加了法定工和非法定工兩個(gè)子類,這就保存了繼承。(4) 分解技術(shù)。在圖中采用人(管理狀態(tài)、雇用狀況)的縱向分解技術(shù)產(chǎn)生對(duì)象模型,以避免多重繼承。(5) 分割一個(gè)子類。可以把一個(gè)子類分割成多個(gè)類,每個(gè)超類都對(duì)應(yīng)有一個(gè)。其缺點(diǎn)是把對(duì)象化分成多個(gè)片,通常是人為添加了許多類,導(dǎo)致定義很困難。(

39、6) 用關(guān)聯(lián)替代概括。可以用幾個(gè)異或關(guān)聯(lián)替代概括,這種選擇對(duì)少量子類的概括最可行。但是,大多數(shù)語(yǔ)言和數(shù)據(jù)庫(kù)管理系統(tǒng)不支持異或關(guān)聯(lián),所以需要編寫(xiě)強(qiáng)制排他性應(yīng)用代碼。以上這些工作環(huán)境都會(huì)影響軟件的邏輯結(jié)構(gòu)和可維護(hù)性。為選擇最好的工作環(huán)境必須考慮以下一些問(wèn)題:(1) 如果子類有好幾個(gè)同樣重要的超類,那么最好用“授權(quán)方法”并保持該模型的對(duì)稱性。(2) 如果某一超類明顯地處于支配地位,而其他的類處于相對(duì)次要的地位,則用單一繼承和授權(quán)方法來(lái)實(shí)現(xiàn)多重繼承是最佳選擇。(3) 如果組合數(shù)目少,則可考慮嵌套概括;如果組合數(shù)目多,則避免使用嵌套概括。(4) 如果某一超類比其他的超類有更多的特征,或明顯是執(zhí)行的瓶頸,

40、則把該超類視為最重要類進(jìn)行繼承并授權(quán)其余的超類。(5) 如果選擇分解技術(shù),那么首先要考慮的是最重要的分解因素,然后考慮第二個(gè)重要的分解因素,以此類推。(6) 如果需要復(fù)制大量代碼,那就盡量避免用嵌套概括。(7) 要嚴(yán)格維護(hù)標(biāo)識(shí)的重要性,只有嵌套概括才能保證這一點(diǎn)。雖然有幾個(gè)工作環(huán)境是適合多重繼承實(shí)現(xiàn)的,但通常應(yīng)避免多重繼承,這樣才會(huì)使建立的對(duì)象模型更加容易理解、實(shí)現(xiàn)。8.2.9 消息對(duì)象通過(guò)它對(duì)外提供的服務(wù)在系統(tǒng)中發(fā)揮自己的作用。當(dāng)系統(tǒng)中的其他對(duì)象(或其他系統(tǒng)成分)請(qǐng)求這個(gè)對(duì)象執(zhí)行某個(gè)服務(wù)時(shí),它就響應(yīng)這個(gè)請(qǐng)求,完成指定的服務(wù)所應(yīng)完成的職責(zé)。在OO方法中把向?qū)ο蟀l(fā)出的服務(wù)請(qǐng)求稱做消息。通過(guò)消息進(jìn)

41、行對(duì)象之間的通信也是OO方法的一個(gè)原則,它與封裝的原則有密切的關(guān)系。封裝使對(duì)象成為一些各司其職、互不干擾的獨(dú)立單位;消息通信則為它們提供了唯一合法的動(dòng)態(tài)聯(lián)系途徑,使它們的行為能夠互相配合,構(gòu)成一個(gè)有機(jī)的運(yùn)動(dòng)系統(tǒng)。例如,顧客對(duì)著一個(gè)售報(bào)亭說(shuō):“買(mǎi)一份北京晚報(bào)!”,這就是一條消息,它是顧客向售報(bào)亭發(fā)出的服務(wù)請(qǐng)求。顧客沒(méi)有伸手到亭內(nèi)取報(bào),而是通過(guò)發(fā)一個(gè)消息達(dá)到買(mǎi)報(bào)的目的。售報(bào)亭接收到這個(gè)消息后,就執(zhí)行一次對(duì)外提供的服務(wù)報(bào)刊零售。這條消息包含了下述信息:接收者,即某個(gè)售報(bào)亭;要求的服務(wù),即報(bào)刊零售;輸入信息,即要買(mǎi)的報(bào)刊種類、份數(shù)和遞進(jìn)去的錢(qián);回答信息,即買(mǎi)到的報(bào)紙和找回的零錢(qián)。OO方法中對(duì)消息的定義

42、是:消息就是向?qū)ο蟀l(fā)出的服務(wù)請(qǐng)求,它應(yīng)該含有提供服務(wù)的對(duì)象標(biāo)識(shí)、服務(wù)標(biāo)識(shí)、輸入信息和回答信息。消息的接收者是提供服務(wù)的對(duì)象。在設(shè)計(jì)時(shí),它對(duì)外提供的每個(gè)服務(wù)應(yīng)規(guī)定消息的格式,這種規(guī)定稱為消息協(xié)議。消息的發(fā)送者是要求提供服務(wù)的對(duì)象或其他系統(tǒng)成分(在不要求完全對(duì)象化的語(yǔ)言中允許有不屬于任何對(duì)象的部分,例如C+程序的main函數(shù))。在它的每個(gè)發(fā)送點(diǎn)上需要寫(xiě)出一個(gè)完整的消息,其中內(nèi)容包括接收者(對(duì)象標(biāo)識(shí))、服務(wù)標(biāo)識(shí)和符合消息協(xié)議要求的參數(shù)。OO方法的初學(xué)者往往感到消息的概念不太好理解,弄不清它到底是什么。如果對(duì)照一下某些OO語(yǔ)言(如C+、Object Pascal或Eiffel)對(duì)消息的實(shí)現(xiàn),這個(gè)疑團(tuán)就

43、可以迎刃而解。在這些語(yǔ)言中,所謂消息,其實(shí)就是函數(shù)(或過(guò)程、例程)調(diào)用。既然是這樣一個(gè)盡人皆知的簡(jiǎn)單技術(shù),為什么要采用一個(gè)讓人不能一目了然的術(shù)語(yǔ)?作為OO方法中的一個(gè)基本概念,采用“消息”這個(gè)術(shù)語(yǔ)有以下好處:(1) 更接近人們?nèi)粘K季S所采用的術(shù)語(yǔ)。(2) 其含義更具有一般性,而不限制采用何種實(shí)現(xiàn)技術(shù)。在分布式技術(shù)和客戶服務(wù)器技術(shù)快速發(fā)展的今天,對(duì)象可以在不同的網(wǎng)絡(luò)結(jié)點(diǎn)上實(shí)現(xiàn)并相互提供服務(wù)。在這種背景下可以看到,“消息”這個(gè)術(shù)語(yǔ)確實(shí)有更強(qiáng)的適應(yīng)性。8.2.10 結(jié)構(gòu)與連接僅僅用一些對(duì)象(以及它們的類)描述問(wèn)題域中的事物是不夠的,因?yàn)樵谌魏我粋€(gè)較為復(fù)雜的問(wèn)題域中,事物之間并不是互相孤立、各不相關(guān)的

44、,而是具有一定的關(guān)系,并因此構(gòu)成了一個(gè)有機(jī)的整體。為了使系統(tǒng)能夠有效地映射問(wèn)題域,系統(tǒng)開(kāi)發(fā)者需認(rèn)識(shí)并描述對(duì)象之間的以下幾種關(guān)系:(1) 對(duì)象的分類關(guān)系。(2) 對(duì)象之間的組成關(guān)系。(3) 對(duì)象屬性之間的靜態(tài)聯(lián)系。(4) 對(duì)象行為之間的動(dòng)態(tài)聯(lián)系。OO方法運(yùn)用一般特殊結(jié)構(gòu)、整體部分結(jié)構(gòu)、實(shí)例連接和消息連接描述對(duì)象之間的這四種關(guān)系。1一般特殊結(jié)構(gòu)一般特殊結(jié)構(gòu)又稱為分類結(jié)構(gòu)(Classification Structure),它是由一組具有一般特殊關(guān)系(繼承關(guān)系)的類所組成的結(jié)構(gòu),也是一個(gè)以類為結(jié)點(diǎn),以繼承關(guān)系為邊的連通有向圖。其中,僅由一些存在單繼承關(guān)系的類形成的結(jié)構(gòu)又稱為層次結(jié)構(gòu)(Hierarch

45、y Structure),它是一個(gè)以最上層的一般類為根的樹(shù)形結(jié)構(gòu),如圖8.6(a)所示;由一些存在多繼承關(guān)系的類形成的結(jié)構(gòu)又稱為網(wǎng)狀結(jié)構(gòu)(Lattice Structure),它是一個(gè)半序的連通有向圖,如圖8.6(b)所示。圖8.6 一般-特殊結(jié)構(gòu)(a) 樹(shù)形結(jié)構(gòu);(b) 網(wǎng)狀結(jié)構(gòu)2整體部分結(jié)構(gòu)整體部分結(jié)構(gòu)又稱為組裝結(jié)構(gòu)(Composition Structure),它描述對(duì)象之間的組成關(guān)系,即一個(gè)(或一些)對(duì)象是另一個(gè)對(duì)象的組成部分??陀^世界中存在許多這樣的現(xiàn)象,如發(fā)動(dòng)機(jī)是汽車的一個(gè)組成部分。一個(gè)整體部分結(jié)構(gòu)由一組彼此之間存在著這種組成關(guān)系的對(duì)象構(gòu)成,如圖所示。整體部分結(jié)構(gòu)有兩種實(shí)現(xiàn)方式。第

46、一種方式是用部分對(duì)象的類作為一種廣義的數(shù)據(jù)類型來(lái)定義整體對(duì)象的一個(gè)屬性,構(gòu)成一個(gè)嵌套對(duì)象。在這種方式下,一個(gè)部分對(duì)象只能隸屬于唯一的整體對(duì)象,并與它同生同滅。圖8.7 整體部分結(jié)構(gòu)第二種方式是獨(dú)立地定義和創(chuàng)建整體對(duì)象和部分對(duì)象,并在整體對(duì)象中設(shè)置一個(gè)屬性,它的值是部分對(duì)象的對(duì)象標(biāo)識(shí),或者是一個(gè)指向部分對(duì)象的指針。在這種方式下,一個(gè)部分對(duì)象可以屬于多個(gè)整體對(duì)象,并具有不同的生存期。后一種方式便于表示比較松散的整體部分關(guān)系,例如一個(gè)法律顧問(wèn)可以屬于多個(gè)企業(yè)單位,而且這種所屬關(guān)系是可以動(dòng)態(tài)變化的。3實(shí)例連接實(shí)例連接反映對(duì)象與對(duì)象之間的靜態(tài)聯(lián)系,例如教師和學(xué)生之間的任課關(guān)系、單位的公用汽車和駕駛員之間

47、的使用關(guān)系等。這種雙邊關(guān)系在實(shí)現(xiàn)中可以通過(guò)對(duì)象(實(shí)例)的屬性表達(dá)出來(lái)(例如用駕駛員對(duì)象的屬性表明他可以駕駛哪些汽車)。所以這種關(guān)系稱為實(shí)例連接。實(shí)例連接與整體部分結(jié)構(gòu)很相似,但是它沒(méi)有那種明顯的整體與部分語(yǔ)義。比如,既不能說(shuō)汽車是駕駛員的一部分,也不能說(shuō)駕駛員是汽車的一部分。4消息連接消息連接描述對(duì)象之間的動(dòng)態(tài)聯(lián)系,即:若一個(gè)對(duì)象在執(zhí)行自己的服務(wù)時(shí)需要(通過(guò)消息)請(qǐng)求另一個(gè)對(duì)象為它完成某個(gè)服務(wù),則說(shuō)第一個(gè)對(duì)象與第二個(gè)對(duì)象之間存在著消息連接。消息連接是有向的,從消息發(fā)送者指向消息接收者。一般特殊結(jié)構(gòu)、整體部分結(jié)構(gòu)、實(shí)例連接和消息連接都是OOA與OOD階段必須考慮的重要概念,只有在分析、設(shè)計(jì)階段認(rèn)

48、清問(wèn)題域中的這些結(jié)構(gòu)與連接,在編程時(shí)才能準(zhǔn)確而有效地反映問(wèn)題域。8.2.11 多態(tài)性對(duì)象的多態(tài)性是指在一般類中定義的屬性或服務(wù)被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或服務(wù)名在一般類及其各個(gè)特殊類中具有不同的語(yǔ)義。如果一種OOPL能支持對(duì)象的多態(tài)性,則可為開(kāi)發(fā)者帶來(lái)不少方便。例如,在一般類“幾何圖形”中定義了一個(gè)服務(wù)“繪圖”,但并不確定執(zhí)行時(shí)到底畫(huà)一個(gè)什么圖形。特殊類“橢圓”和“多邊形”都繼承了幾何圖形類的繪圖服務(wù),但其功能卻不同:一個(gè)是畫(huà)出一個(gè)橢圓,一個(gè)是畫(huà)出一個(gè)多邊形。進(jìn)而,在多邊形類更下層的一般類“矩形”中繪圖服務(wù)又可以采用一個(gè)比畫(huà)一般的多邊形更高效的

49、算法來(lái)畫(huà)一個(gè)矩形。這樣,當(dāng)系統(tǒng)的其余部分請(qǐng)求畫(huà)出任何一種幾何圖形時(shí),消息中給出的服務(wù)名同樣都是“繪圖”(消息的書(shū)寫(xiě)方式可以統(tǒng)一),而橢圓、多邊形、矩形等類的對(duì)象接收到這個(gè)消息時(shí)卻各自執(zhí)行不同的繪圖算法。支持多態(tài)性的實(shí)現(xiàn)語(yǔ)言應(yīng)具備的功能是: 重載(Overload),即在特殊類中對(duì)繼承來(lái)的屬性或服務(wù)進(jìn)行重新定義。 動(dòng)態(tài)綁定(Dynamic Binding),即在運(yùn)行時(shí)根據(jù)對(duì)象接收的消息動(dòng)態(tài)地確定要連接哪一段服務(wù)代碼。 類屬(Generic),即服務(wù)參數(shù)的類型可以是參數(shù)化的。有些學(xué)者沒(méi)有把多態(tài)性列入OO方法的基本特征或OOPL的必備功能中,而是將其看做一種比較高級(jí)的功能。多態(tài)性的實(shí)現(xiàn)需要OOPL提

50、供相應(yīng)的支持,在幾種目前最實(shí)用的OOPL中,僅有一部分是支持對(duì)象多態(tài)性的。這些功能如何支持多態(tài)性的實(shí)現(xiàn)與語(yǔ)言密切相關(guān),這里就不作詳細(xì)介紹了。8.2.12 永久對(duì)象永久對(duì)象是當(dāng)前OO領(lǐng)域的一個(gè)技術(shù)熱點(diǎn)。所謂永久對(duì)象,就是生存期可以超越程序的執(zhí)行時(shí)間而長(zhǎng)期存在的對(duì)象。目前大多數(shù)商品化的OOPL是不支持永久對(duì)象的。如果一個(gè)應(yīng)用要求把某些對(duì)象的屬性信息長(zhǎng)期保存,并能在下一次程序運(yùn)行時(shí)加以恢復(fù),就只好借助文件系統(tǒng)或數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)實(shí)現(xiàn)。永久對(duì)象的概念及實(shí)現(xiàn)技術(shù)可以使上述問(wèn)題得到解決。只要程序員聲明某個(gè)對(duì)象是永久的,則它的存儲(chǔ)、恢復(fù)、轉(zhuǎn)換等問(wèn)題一概不用程序員關(guān)心,完全由系統(tǒng)自動(dòng)解決。永久對(duì)象的實(shí)現(xiàn)需要有較

51、強(qiáng)的技術(shù)支持,也需要一個(gè)能夠描述和處理永久對(duì)象的編程語(yǔ)言。這種語(yǔ)言的實(shí)現(xiàn)需要基于一個(gè)存儲(chǔ)永久對(duì)象的對(duì)象管理系統(tǒng)(Object Management System,OMS)。無(wú)論是支持永久對(duì)象的OOPL,還是OMS,其實(shí)現(xiàn)都有較大難度,需要解決對(duì)象的存儲(chǔ)、恢復(fù)、共享、并發(fā)存取、一致性保護(hù)等一系列技術(shù)問(wèn)題,所以目前國(guó)內(nèi)外在這方面研究性的工作較多而實(shí)用的產(chǎn)品較少。8.2.13 主動(dòng)對(duì)象隨著OO方法應(yīng)用領(lǐng)域的擴(kuò)大,當(dāng)人們用OO方法所開(kāi)發(fā)的系統(tǒng)中具有多個(gè)并發(fā)執(zhí)行的任務(wù)時(shí),如不確立主動(dòng)對(duì)象的概念及其表示方法,則OO方法的表達(dá)能力將具有明顯的缺陷。按照通常理解的OO概念,對(duì)象是一組屬性和一組服務(wù)的封裝體。它

52、的每個(gè)服務(wù)是一個(gè)在消息的驅(qū)動(dòng)下被動(dòng)執(zhí)行的操作。向?qū)ο蟀l(fā)一個(gè)消息,它就響應(yīng)這個(gè)消息而執(zhí)行被請(qǐng)求的服務(wù),否則它的服務(wù)就不執(zhí)行。每個(gè)服務(wù)相當(dāng)于過(guò)程式語(yǔ)言中的一個(gè)過(guò)程、函數(shù)或例程,所有這樣的對(duì)象都是被動(dòng)對(duì)象(Passive Object),需要通過(guò)消息的驅(qū)動(dòng)才能執(zhí)行。那么,原始的驅(qū)動(dòng)來(lái)自哪里?目前的OOPL一般是來(lái)自所有類定義之外的一段主程序,例如C+中的main函數(shù)。但是,如果用OO方法開(kāi)發(fā)一個(gè)有多個(gè)任務(wù)并發(fā)執(zhí)行的系統(tǒng)時(shí),就會(huì)感到,如果僅有被動(dòng)對(duì)象的概念,則很難描述系統(tǒng)中的多個(gè)任務(wù)。在20世紀(jì)70年代,談到開(kāi)發(fā)多任務(wù)程序時(shí)人們首先會(huì)聯(lián)想到多任務(wù)操作系統(tǒng)。如今,多個(gè)任務(wù)并發(fā)執(zhí)行在大量的應(yīng)用系統(tǒng)中也已經(jīng)

53、很普遍了。每個(gè)任務(wù)在實(shí)現(xiàn)時(shí)應(yīng)該成為一個(gè)可以并發(fā)執(zhí)行的主動(dòng)程序單位,例如進(jìn)程(Process)或線程(Thread)。在系統(tǒng)設(shè)計(jì)階段需要識(shí)別并描述每個(gè)任務(wù)。用現(xiàn)有的被動(dòng)對(duì)象描述顯然是不合適的,但不用對(duì)象來(lái)描述,就要引入其他概念,這將引起概念的多元化和表示法的不一致,而且不體現(xiàn)OO方法的分類、繼承、封裝等原則。在現(xiàn)實(shí)世界中具有主動(dòng)行為的事物并不罕見(jiàn),例如交通控制系統(tǒng)中的信號(hào)燈,生產(chǎn)控制系統(tǒng)中異步運(yùn)行的設(shè)備,軍隊(duì)中向全軍發(fā)號(hào)施令的司令部和發(fā)現(xiàn)情況要及時(shí)報(bào)告的觀察員、哨所等。在面向?qū)ο笤O(shè)計(jì)階段進(jìn)行任務(wù)管理部分的設(shè)計(jì)時(shí)用主動(dòng)對(duì)象表示每個(gè)任務(wù)。其定義是:主動(dòng)對(duì)象是一組屬性和一組服務(wù)的封裝體,其中至少有一個(gè)

54、服務(wù)不需要接收消息就能主動(dòng)執(zhí)行。引入主動(dòng)對(duì)象概念解決了系統(tǒng)設(shè)計(jì)階段對(duì)任務(wù)的描述問(wèn)題,從而為在實(shí)現(xiàn)階段構(gòu)造一個(gè)描述多任務(wù)的并發(fā)程序提供了依據(jù)。但是這種依據(jù)只能是編程工作的一個(gè)參考,因?yàn)槟壳斑€沒(méi)有商品化的OOPL能支持主動(dòng)對(duì)象的概念,所以設(shè)計(jì)階段識(shí)別的主動(dòng)對(duì)象無(wú)法直接地對(duì)應(yīng)為程序中的一個(gè)主動(dòng)對(duì)象,需要程序員在現(xiàn)有的語(yǔ)言條件下設(shè)法把它實(shí)現(xiàn)成一個(gè)主動(dòng)成分。要從根本上解決主動(dòng)對(duì)象的實(shí)現(xiàn)問(wèn)題,必須開(kāi)發(fā)一種能描述主動(dòng)對(duì)象的并發(fā)OOPL。這在技術(shù)上有一定的難度,但是在當(dāng)前條件下也是可以做到的。8.2.14 對(duì)象類的表示方法在圖中小結(jié)了類的對(duì)象模型表示。一個(gè)類用劃分為三個(gè)區(qū)域的矩形框表示,這三個(gè)區(qū)域包括(從頂?shù)?/p>

55、底):類名、屬性表和操作表。每個(gè)屬性名可以跟有類型和缺省值,每個(gè)操作名可以跟有參數(shù)列表和結(jié)果類型。屬性和操作可以表示,也可以不表示,這依賴于所描述的細(xì)節(jié)層次。圖8.8 類的對(duì)象模型 8.3 鏈接與關(guān)聯(lián)8.3.1 一般概念鏈接是在對(duì)象實(shí)例之間的一種物理或概念連接,如王先生為某公司工作(Works-for)。在數(shù)學(xué)上,一個(gè)鏈接是一個(gè)元組,即一個(gè)對(duì)象實(shí)例的有序列表;同時(shí),一個(gè)鏈接也是一個(gè)關(guān)聯(lián)的實(shí)例。關(guān)聯(lián)描述了具有公共結(jié)構(gòu)和共同語(yǔ)義的鏈接的組合,例如在一個(gè)公司工作(Works-for)的人。所有關(guān)聯(lián)中的鏈接都與相同類的對(duì)象組連接。關(guān)聯(lián)和鏈接經(jīng)常在問(wèn)題敘述中以動(dòng)詞身份出現(xiàn),一個(gè)關(guān)聯(lián)描述了用相同方式的可能

56、的鏈接集合,這種方式就是一個(gè)類描述所有可能的對(duì)象的一個(gè)集合。關(guān)聯(lián)本來(lái)就是雙向的。一個(gè)二元關(guān)聯(lián)通常沿特定方向進(jìn)行讀取,但也能沿另一方向進(jìn)行遍歷。名字所隱含的方向是“向前”方向,而相反的是逆向的“向后”方向。例如,“Works -for”把人(Person)與公司(Company)相鏈接,而“Work-for”的逆向稱為雇用(Employ),雇用把Company與Person相鏈接。實(shí)際上,遍歷的兩個(gè)方向意義是等同的,都是在相同關(guān)聯(lián)下的引用,它僅僅是創(chuàng)建一個(gè)導(dǎo)向的命名而已。關(guān)聯(lián)在程序設(shè)計(jì)語(yǔ)言中經(jīng)常用指針來(lái)實(shí)現(xiàn)從一個(gè)對(duì)象到另一個(gè)對(duì)象的聯(lián)系,指針是一個(gè)對(duì)象對(duì)另一個(gè)對(duì)象顯式引用的屬性。例如,人的數(shù)據(jù)結(jié)構(gòu)

57、可以包含指向公司對(duì)象的屬性雇主,而公司對(duì)象可以包含指向雇員對(duì)象集合(全體職工)的屬性雇員。以指針來(lái)實(shí)現(xiàn)關(guān)聯(lián)最能被大家接受。一種鏈接表示兩個(gè)或兩個(gè)以上對(duì)象之間的聯(lián)系。用指針模型化一個(gè)鏈接隱瞞了這樣一個(gè)事實(shí),即這種鏈接不是對(duì)象本身的任何一部分,而是同時(shí)依賴兩個(gè)或兩個(gè)以上的對(duì)象。例如,公司不是人的一部分,而人也不是公司的一部分。此外,使用一對(duì)匹配的指針,諸如從人到公司的指針和從公司到雇員集合的指針,隱藏相互依賴的向前和向后指針。因此,所有類之間的鏈接應(yīng)該是作為關(guān)聯(lián)的模型,甚至程序設(shè)計(jì)也應(yīng)如此建模。必須強(qiáng)調(diào)關(guān)聯(lián)不是數(shù)據(jù)庫(kù)構(gòu)造,雖然關(guān)系數(shù)據(jù)庫(kù)是建立在關(guān)聯(lián)概念之上的。關(guān)聯(lián)是雙向建模的,但實(shí)現(xiàn)時(shí)并不一定是雙

58、向的。如果僅僅是單一方向的遍歷,那關(guān)聯(lián)很容易用指針來(lái)實(shí)現(xiàn)。關(guān)聯(lián)可以是二元、三元或更高階的。在實(shí)際應(yīng)用中,關(guān)聯(lián)絕大多數(shù)是二元的,一般很少碰到三元的。更高階的關(guān)聯(lián)畫(huà)起來(lái)很復(fù)雜,實(shí)現(xiàn)起來(lái)也較困難。基于這種情況,應(yīng)當(dāng)盡量避免出現(xiàn)二元以上的關(guān)聯(lián)。8.3.2 重?cái)?shù)重?cái)?shù)指定一個(gè)類的多少個(gè)實(shí)例與另一個(gè)關(guān)聯(lián)類的單一實(shí)例有關(guān)。重?cái)?shù)約束了相關(guān)對(duì)象的數(shù)目,通常重?cái)?shù)描述為“1”或“多”,但更普遍的是(有限個(gè))非負(fù)整數(shù)個(gè)子集。重?cái)?shù)值是一個(gè)單一區(qū)間,也可以是解除鏈接區(qū)間的集合。例如,轎車的門(mén)的數(shù)目是2或4。對(duì)象圖在關(guān)聯(lián)線末端用特別的符號(hào)表示重?cái)?shù)。大多數(shù)情況下,重?cái)?shù)可以指定為一個(gè)數(shù)或區(qū)間集,如“1”(精確1個(gè)),“1+”(1

59、個(gè)或1個(gè)以上),“35”(3到5之間,3和5包含在內(nèi))。用一種特殊終結(jié)符可以表示某種公共重?cái)?shù)值。黑實(shí)心圓點(diǎn)表示“多”,其含義是零個(gè)和多個(gè)。空心圓點(diǎn)表示“可選”,其含義是零個(gè)和1個(gè)。沒(méi)有重?cái)?shù)符號(hào)的線表示為“一對(duì)一”關(guān)聯(lián)。通常,重?cái)?shù)被寫(xiě)在一條線的右下方。重?cái)?shù)依賴于假定和問(wèn)題的邊界。通常模糊的要求會(huì)導(dǎo)致重?cái)?shù)的不確定。設(shè)計(jì)軟件初期,不必特別地考慮重?cái)?shù),首先決定對(duì)象、類和關(guān)聯(lián),然后再?zèng)Q定重?cái)?shù)。決定重?cái)?shù)常??梢员┞督⒛P退[含的假定。例如,Works-for是人和公司的一對(duì)多或多對(duì)多的關(guān)聯(lián)嗎?這要依賴于上下文語(yǔ)義。在稅收應(yīng)用程序中允許一個(gè)人為多個(gè)公司工作,另一方面,工會(huì)組織維護(hù)成員記錄可以認(rèn)為第二份工作

60、是不相關(guān)的。用對(duì)象圖顯式表示一個(gè)模型,可幫助提示這些隱藏的假設(shè),使這些假設(shè)可視化,當(dāng)然這要得到安全性檢查。最重要的重?cái)?shù)差別是“1”和“多”之間。過(guò)低估計(jì)重?cái)?shù)作用,則限制了應(yīng)用的靈活性。例如,許多 號(hào)碼服務(wù)程序不允許一個(gè)人有多個(gè) 號(hào)碼。另一方面,過(guò)高估計(jì)重?cái)?shù)常要求更多的開(kāi)銷,并要求應(yīng)用程序提供添加信息以區(qū)別“多”重?cái)?shù)集合的成員。例如,在實(shí)際的層次組織中,用表示成“0”和“1”的重?cái)?shù)來(lái)描述“boss(老板)”,比用不現(xiàn)實(shí)的矩陣管理來(lái)描述要好得多。8.3.3 關(guān)聯(lián)的重要性關(guān)聯(lián)的表示的確不是一個(gè)新的概念。關(guān)聯(lián)早已廣泛地用于數(shù)據(jù)庫(kù)模式中。相反地,少有編程語(yǔ)言顯式支持關(guān)聯(lián)。因此,把關(guān)聯(lián)著重用于程序的模型構(gòu)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論