《軟件工程》CH9 面向?qū)ο蠓椒ǜ攀鯻第1頁(yè)
《軟件工程》CH9 面向?qū)ο蠓椒ǜ攀鯻第2頁(yè)
《軟件工程》CH9 面向?qū)ο蠓椒ǜ攀鯻第3頁(yè)
《軟件工程》CH9 面向?qū)ο蠓椒ǜ攀鯻第4頁(yè)
《軟件工程》CH9 面向?qū)ο蠓椒ǜ攀鯻第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第2章 面向?qū)ο蠓椒▽W(xué)引論2.1 面向?qū)ο蠓椒▽W(xué)概述2.2 面向?qū)ο蟮母拍?.3 面向?qū)ο蠼?.4 對(duì)象模型2.5 動(dòng)態(tài)模型2.6 功能模型2.7 3種模型之間的關(guān)系2.8 小結(jié)習(xí)題 傳統(tǒng)的軟件工程方法學(xué)曾經(jīng)給軟件產(chǎn)業(yè)帶來(lái)巨大進(jìn)步,部分地緩解了軟件危機(jī),使用這種方法學(xué)開(kāi)發(fā)的許多中、小規(guī)模軟件項(xiàng)目都獲得了成功。但是,人們也注意到當(dāng)把這種方法學(xué)應(yīng)用于大型軟件產(chǎn)品的開(kāi)發(fā)時(shí),似乎很少取得成功。在20世紀(jì)60年代后期出現(xiàn)的面向?qū)ο缶幊陶Z(yǔ)言Simula-67中首次引入了類(lèi)和對(duì)象的概念,自20世紀(jì)80年代中期起,人們開(kāi)始注重面向?qū)ο蠓治龊驮O(shè)計(jì)的研究,逐步形成了面向?qū)ο蠓椒▽W(xué)。到了20世紀(jì)90年代,面向?qū)ο?/p>

2、方法學(xué)已經(jīng)成為人們?cè)陂_(kāi)發(fā)軟件時(shí)首選的范型。面向?qū)ο蠹夹g(shù)已成為當(dāng)前最好的軟件開(kāi)發(fā)技術(shù)。面向?qū)ο蠓椒▽W(xué)的出發(fā)點(diǎn)和基本原則,是盡可能模擬人類(lèi)習(xí)慣的思維方式,使開(kāi)發(fā)軟件的方法與過(guò)程盡可能接近人類(lèi)認(rèn)識(shí)世界解決問(wèn)題的方法與過(guò)程,也就是使描述問(wèn)題的問(wèn)題空間(也稱(chēng)為問(wèn)題域)與實(shí)現(xiàn)解法的解空間(也稱(chēng)為求解域)在結(jié)構(gòu)上盡可能一致。2.1 面向?qū)ο蠓椒▽W(xué)概述 2.1.1 面向?qū)ο蠓椒▽W(xué)的要點(diǎn)客觀世界的問(wèn)題都是由客觀世界中的實(shí)體及實(shí)體相互間的關(guān)系構(gòu)成的。我們把客觀世界中的實(shí)體抽象為問(wèn)題域中的對(duì)象(object)。因?yàn)樗鉀Q的問(wèn)題具有特殊性,因此,對(duì)象是不固定的。一個(gè)雇員可以作為一個(gè)對(duì)象,一家公司也可以作為一個(gè)對(duì)象,

3、到底應(yīng)該把什么抽象為對(duì)象,由所要解決的問(wèn)題決定。從本質(zhì)上說(shuō),用計(jì)算機(jī)解決客觀世界的問(wèn)題,是借助于某種程序設(shè)計(jì)語(yǔ)言的規(guī)定,對(duì)計(jì)算機(jī)中的實(shí)體施加某種處理,并用處理結(jié)果去映射解。我們把計(jì)算機(jī)中的實(shí)體稱(chēng)為解空間對(duì)象。顯然,解空間對(duì)象取決于所使用的程序設(shè)計(jì)語(yǔ)言。例如,匯編語(yǔ)言提供的對(duì)象是存儲(chǔ)單元;面向過(guò)程的高級(jí)語(yǔ)言提供的對(duì)象,是各種預(yù)定義類(lèi)型的變量、數(shù)組、記錄和文件等等。一旦提供了某種解空間對(duì)象,就隱含規(guī)定了允許對(duì)該類(lèi)對(duì)象施加的操作。從動(dòng)態(tài)觀點(diǎn)看,對(duì)對(duì)象施加的操作就是該對(duì)象的行為。在問(wèn)題空間中,對(duì)象的行為是極其豐富多彩的,然而解空間中的對(duì)象的行為卻是非常簡(jiǎn)單呆板的。因此,只有借助于十分復(fù)雜的算法,才能操

4、縱解空間對(duì)象從而得到解。這就是人們常說(shuō)的“語(yǔ)義斷層”,也是長(zhǎng)期以來(lái)程序設(shè)計(jì)始終是一門(mén)學(xué)問(wèn)的原因。通常,客觀世界中的實(shí)體既具有靜態(tài)的屬性又具有動(dòng)態(tài)的行為。然而傳統(tǒng)語(yǔ)言提供的解空間對(duì)象實(shí)質(zhì)上卻僅是描述實(shí)體屬性的數(shù)據(jù),必須在程序中從外部對(duì)它施加操作,才能模擬它的行為。眾所周知,軟件系統(tǒng)本質(zhì)上是信息處理系統(tǒng)。數(shù)據(jù)和處理原本是密切相關(guān)的,把數(shù)據(jù)和處理人為地分離成兩個(gè)獨(dú)立的部分,會(huì)增加軟件開(kāi)發(fā)的難度。與傳統(tǒng)方法相反,面向?qū)ο蠓椒ㄊ且环N以數(shù)據(jù)或信息為主線(xiàn),把數(shù)據(jù)和處理相結(jié)合的方法。面向?qū)ο蠓椒ò褜?duì)象作為由數(shù)據(jù)及可以施加在這些數(shù)據(jù)上的操作所構(gòu)成的統(tǒng)一體。對(duì)象與傳統(tǒng)的數(shù)據(jù)有本質(zhì)區(qū)別,它不是被動(dòng)地等待外界對(duì)它施加

5、操作,相反,它是進(jìn)行處理的主體。必須發(fā)消息請(qǐng)求對(duì)象主動(dòng)地執(zhí)行它的某些操作,處理它的私有數(shù)據(jù),而不能從外界直接對(duì)它的私有數(shù)據(jù)進(jìn)行操作。面向?qū)ο蠓椒▽W(xué)所提供的“對(duì)象”概念,是讓軟件開(kāi)發(fā)者自己定義或選取解空間對(duì)象,然后把軟件系統(tǒng)作為一系列離散的解空間對(duì)象的集合。應(yīng)該使這些解空間對(duì)象與問(wèn)題空間對(duì)象盡可能一致。這些解空間對(duì)象彼此間通過(guò)發(fā)送消息而相互作用,從而得出問(wèn)題的解。也就是說(shuō),面向?qū)ο蠓椒ㄊ且环N新的思維方法,它是把程序看作是相互協(xié)作而又彼此獨(dú)立的對(duì)象的集合。每個(gè)對(duì)象就像一個(gè)微型程序,有自己的數(shù)據(jù)、操作、功能和目的。這樣做就向著減少語(yǔ)義斷層的方向邁了一大步,在許多系統(tǒng)中解空間對(duì)象都可以直接模擬問(wèn)題空間

6、的對(duì)象,解空間與問(wèn)題空間的結(jié)構(gòu)十分一致,因此,這樣的程序易于理解和維護(hù)。概括地說(shuō),面向?qū)ο蠓椒ň哂邢率?個(gè)要點(diǎn):(1) 認(rèn)為客觀世界是由各種對(duì)象組成的,任何事物都是對(duì)象,復(fù)雜的對(duì)象可以由比較簡(jiǎn)單的對(duì)象以某種方式組合而成。按照這種觀點(diǎn),可以認(rèn)為整個(gè)世界就是一個(gè)最復(fù)雜的對(duì)象。因此,面向?qū)ο蟮能浖到y(tǒng)是由對(duì)象組成的,軟件中的任何元素都是對(duì)象,復(fù)雜的軟件對(duì)象由比較簡(jiǎn)單的對(duì)象組合而成。由此可見(jiàn),面向?qū)ο蠓椒ㄓ脤?duì)象分解取代了傳統(tǒng)方法的功能分解。(2) 把所有對(duì)象都劃分成各種對(duì)象類(lèi)(簡(jiǎn)稱(chēng)為類(lèi),class),每個(gè)對(duì)象類(lèi)都定義了一組數(shù)據(jù)和一組方法。數(shù)據(jù)用于表示對(duì)象的靜態(tài)屬性,是對(duì)象的狀態(tài)信息。因此,每當(dāng)建立該對(duì)

7、象類(lèi)的一個(gè)新實(shí)例時(shí),就按照類(lèi)中對(duì)數(shù)據(jù)的定義為這個(gè)新對(duì)象生成一組專(zhuān)用的數(shù)據(jù),以便描述該對(duì)象獨(dú)特的屬性值。類(lèi)中定義的方法,是允許施加于該類(lèi)對(duì)象上的操作,是該類(lèi)所有對(duì)象共享的,并不需要為每個(gè)對(duì)象都復(fù)制操作的代碼。(3) 按照子類(lèi)(或稱(chēng)為派生類(lèi))與父類(lèi)(或稱(chēng)為基類(lèi))的關(guān)系,把若干個(gè)對(duì)象類(lèi)組成一個(gè)層次結(jié)構(gòu)的系統(tǒng)(也稱(chēng)為類(lèi)等級(jí))。在這種層次結(jié)構(gòu)中,通常下層的派生類(lèi)具有和上層的基類(lèi)相同的特性(包括數(shù)據(jù)和方法),這種現(xiàn)象稱(chēng)為繼承(inheritance)。但是,如果在派生類(lèi)中對(duì)某些特性又做了重新描述,則在派生類(lèi)中的這些特性將以新描述為準(zhǔn),也就是說(shuō),低層的特性將屏蔽高層的同名特性。(4) 對(duì)象彼此之間僅能通過(guò)傳

8、遞消息互相聯(lián)系。對(duì)象與傳統(tǒng)的數(shù)據(jù)有本質(zhì)區(qū)別,它不是被動(dòng)地等待外界對(duì)它施加操作,相反,它是進(jìn)行處理的主體,必須發(fā)消息請(qǐng)求它執(zhí)行它的某個(gè)操作,處理它的私有數(shù)據(jù),而不能從外界直接對(duì)它的私有數(shù)據(jù)進(jìn)行操作。也就是說(shuō),一切局部于該對(duì)象的私有信息,都被封裝在該對(duì)象類(lèi)的定義中,就好像裝在一個(gè)不透明的黑盒子中一樣,在外界是看不見(jiàn)的,更不能直接使用,這就是“封裝性”。 面向?qū)ο蟮姆椒▽W(xué)可以用下列方程來(lái)概括:OO=objects+classes+inheritance+communication with messages 也就是說(shuō),面向?qū)ο缶褪羌仁褂脤?duì)象又使用類(lèi)和繼承等機(jī)制,而且對(duì)象之間僅能通過(guò)傳遞消息實(shí)現(xiàn)彼此通

9、信。如果僅使用對(duì)象和消息,則這種方法可以稱(chēng)為基于對(duì)象的(object-based)方法,而不能稱(chēng)為面向?qū)ο蟮姆椒?;如果進(jìn)一步要求把所有對(duì)象都劃分為類(lèi),則這種方法可稱(chēng)為基于類(lèi)的(class-based)方法,但仍然不是面向?qū)ο蟮姆椒?。只有同時(shí)使用對(duì)象、類(lèi)、繼承和消息的方法,才是真正面向?qū)ο蟮姆椒ā?. 與人類(lèi)習(xí)慣的思維方法一致 傳統(tǒng)的程序設(shè)計(jì)技術(shù)是面向過(guò)程的設(shè)計(jì)方法,這種方法以算法為核心,把數(shù)據(jù)和過(guò)程作為相互獨(dú)立的部分,數(shù)據(jù)代表問(wèn)題空間中的客體,程序代碼則用于處理這些數(shù)據(jù)。2.1.2 面向?qū)ο蠓椒▽W(xué)的優(yōu)點(diǎn) 把數(shù)據(jù)和代碼作為分離的實(shí)體,反映了計(jì)算機(jī)的觀點(diǎn),因?yàn)樵谟?jì)算機(jī)內(nèi)部數(shù)據(jù)和程序是分開(kāi)存放的。但

10、是,這樣做的時(shí)候總存在使用錯(cuò)誤的數(shù)據(jù)調(diào)用正確的程序模塊,或使用正確的數(shù)據(jù)調(diào)用錯(cuò)誤的程序模塊的危險(xiǎn)。使數(shù)據(jù)和操作保持一致,是程序員的一個(gè)沉重負(fù)擔(dān),在多人分工合作開(kāi)發(fā)一個(gè)大型軟件系統(tǒng)的過(guò)程中,如果負(fù)責(zé)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的人中途改變了某個(gè)數(shù)據(jù)的結(jié)構(gòu)而又沒(méi)有及時(shí)通知所有人員,則會(huì)發(fā)生許多不該發(fā)生的錯(cuò)誤。 傳統(tǒng)的程序設(shè)計(jì)技術(shù)忽略了數(shù)據(jù)和操作之間的內(nèi)在聯(lián)系,用這種方法所設(shè)計(jì)出來(lái)的軟件系統(tǒng)其解空間與問(wèn)題空間并不一致,令人感到難于理解。實(shí)際上,用計(jì)算機(jī)解決的問(wèn)題都是現(xiàn)實(shí)世界中的問(wèn)題,這些問(wèn)題無(wú)非由一些相互間存在一定聯(lián)系的事物所組成。每個(gè)具體的事物都具有行為和屬性?xún)煞矫娴奶卣鳌R虼?,把描述事物靜態(tài)屬性的數(shù)據(jù)結(jié)構(gòu)和表示

11、事物動(dòng)態(tài)行為的操作放在一起構(gòu)成一個(gè)整體,才能完整、自然地表示客觀世界中的實(shí)體。 面向?qū)ο蟮能浖夹g(shù)以對(duì)象(object)為核心,用這種技術(shù)開(kāi)發(fā)出的軟件系統(tǒng)由對(duì)象組成。對(duì)象是對(duì)現(xiàn)實(shí)世界實(shí)體的正確抽象,它是由描述內(nèi)部狀態(tài)表示靜態(tài)屬性的數(shù)據(jù),以及可以對(duì)這些數(shù)據(jù)施加的操作(表示對(duì)象的動(dòng)態(tài)行為),封裝在一起所構(gòu)成的統(tǒng)一體。對(duì)象之間通過(guò)傳遞消息互相聯(lián)系,以模擬現(xiàn)實(shí)世界中不同事物彼此之間的聯(lián)系。 面向?qū)ο蟮脑O(shè)計(jì)方法與傳統(tǒng)的面向過(guò)程的方法有本質(zhì)不同,這種方法的基本原理是,使用現(xiàn)實(shí)世界的概念抽象地思考問(wèn)題從而自然地解決問(wèn)題。它強(qiáng)調(diào)模擬現(xiàn)實(shí)世界中的概念而不強(qiáng)調(diào)算法,它鼓勵(lì)開(kāi)發(fā)者在軟件開(kāi)發(fā)的絕大部分過(guò)程中都用應(yīng)用領(lǐng)

12、域的概念去思考。在面向?qū)ο蟮脑O(shè)計(jì)方法中,計(jì)算機(jī)的觀點(diǎn)是不重要的,現(xiàn)實(shí)世界的模型才是最重要的。面向?qū)ο蟮能浖_(kāi)發(fā)過(guò)程從始至終都圍繞著建立問(wèn)題領(lǐng)域的對(duì)象模型來(lái)進(jìn)行:對(duì)問(wèn)題領(lǐng)域進(jìn)行自然的分解,確定需要使用的對(duì)象和類(lèi),建立適當(dāng)?shù)念?lèi)等級(jí),在對(duì)象之間傳遞消息實(shí)現(xiàn)必要的聯(lián)系,從而按照人們習(xí)慣的思維方式建立起問(wèn)題領(lǐng)域的模型,模擬客觀世界。 傳統(tǒng)的軟件開(kāi)發(fā)方法可以用“瀑布”模型來(lái)描述,這種方法強(qiáng)調(diào)自頂向下按部就班地完成軟件開(kāi)發(fā)工作。事實(shí)上,人們認(rèn)識(shí)客觀世界解決現(xiàn)實(shí)問(wèn)題的過(guò)程,是一個(gè)漸進(jìn)的過(guò)程,人的認(rèn)識(shí)需要在繼承以前的有關(guān)知識(shí)的基礎(chǔ)上,經(jīng)過(guò)多次反復(fù)才能逐步深化。在人的認(rèn)識(shí)深化過(guò)程中,既包括了從一般到特殊的演繹思維

13、過(guò)程,也包括了從特殊到一般的歸納思維過(guò)程。人在認(rèn)識(shí)和解決復(fù)雜問(wèn)題時(shí)使用的最強(qiáng)有力的思維工具是抽象,也就是在處理復(fù)雜對(duì)象時(shí),為了達(dá)到某個(gè)分析目的集中研究對(duì)象的與此目的有關(guān)的實(shí)質(zhì),忽略該對(duì)象的那些與此目的無(wú)關(guān)的部分。 面向?qū)ο蠓椒▽W(xué)的基本原則是按照人類(lèi)習(xí)慣的思維方法建立問(wèn)題域的模型,開(kāi)發(fā)出盡可能直觀、自然地表現(xiàn)求解方法的軟件系統(tǒng)。面向?qū)ο蟮能浖到y(tǒng)中廣泛使用的對(duì)象,是對(duì)客觀世界中實(shí)體的抽象。對(duì)象實(shí)際上是抽象數(shù)據(jù)類(lèi)型的實(shí)例,提供了比較理想的數(shù)據(jù)抽象機(jī)制,同時(shí)又具有良好的過(guò)程抽象機(jī)制。對(duì)象類(lèi)是對(duì)一組相似對(duì)象的抽象,類(lèi)等級(jí)中上層的類(lèi)是對(duì)下層類(lèi)的抽象。因此,面向?qū)ο蟮沫h(huán)境提供了強(qiáng)有力的抽象機(jī)制,便于用戶(hù)在

14、利用計(jì)算機(jī)軟件系統(tǒng)解決復(fù)雜問(wèn)題時(shí)使用習(xí)慣的抽象思維工具。此外,面向?qū)ο蠓椒▽W(xué)中普遍進(jìn)行的對(duì)象分類(lèi)過(guò)程,支持從特殊到一般的歸納思維過(guò)程;面向?qū)ο蠓椒▽W(xué)中通過(guò)建立類(lèi)等級(jí)而獲得的繼承特性,支持從一般到特殊的演繹思維過(guò)程。 面向?qū)ο蟮能浖夹g(shù)為開(kāi)發(fā)者提供了隨著對(duì)某個(gè)應(yīng)用系統(tǒng)的認(rèn)識(shí)逐步深入和具體化的過(guò)程,而逐步設(shè)計(jì)和實(shí)現(xiàn)該系統(tǒng)的可能性,因?yàn)榭梢韵仍O(shè)計(jì)出由抽象類(lèi)構(gòu)成的系統(tǒng)框架,隨著認(rèn)識(shí)深入和具體化再逐步派生出更具體的派生類(lèi)。這樣的開(kāi)發(fā)過(guò)程符合人們認(rèn)識(shí)客觀世界解決復(fù)雜問(wèn)題時(shí)逐步深化的漸進(jìn)過(guò)程。2. 穩(wěn)定性好 傳統(tǒng)的軟件開(kāi)發(fā)方法以算法為核心,開(kāi)發(fā)過(guò)程基于功能分析和功能分解。用傳統(tǒng)方法所建立起來(lái)的軟件系統(tǒng)的結(jié)構(gòu)

15、緊密依賴(lài)于系統(tǒng)所要完成的功能,當(dāng)功能需求發(fā)生變化時(shí)將引起軟件結(jié)構(gòu)的整體修改。事實(shí)上,用戶(hù)需求變化大部分是針對(duì)功能的,因此,這樣的軟件系統(tǒng)是不穩(wěn)定的。 面向?qū)ο蠓椒ɑ跇?gòu)造問(wèn)題領(lǐng)域的對(duì)象模型,以對(duì)象為中心構(gòu)造軟件系統(tǒng)。它的基本作法是用對(duì)象模擬問(wèn)題領(lǐng)域中的實(shí)體,以對(duì)象間的聯(lián)系刻畫(huà)實(shí)體間的聯(lián)系。因?yàn)槊嫦驅(qū)ο蟮能浖到y(tǒng)的結(jié)構(gòu)是根據(jù)問(wèn)題領(lǐng)域的模型建立起來(lái)的,而不是基于對(duì)系統(tǒng)應(yīng)完成的功能的分解,所以,當(dāng)對(duì)系統(tǒng)的功能需求變化時(shí)并不會(huì)引起軟件結(jié)構(gòu)的整體變化,往往僅需要作一些局部性的修改。例如,從已有類(lèi)派生出一些新的子類(lèi)以實(shí)現(xiàn)功能擴(kuò)充或修改,增加或刪除某些對(duì)象等。總之,由于現(xiàn)實(shí)世界中的實(shí)體是相對(duì)穩(wěn)定的,因此,以

16、對(duì)象為中心構(gòu)造的軟件系統(tǒng)也是比較穩(wěn)定的。3. 可重用性好 用已有的零部件裝配新的產(chǎn)品,是典型的重用技術(shù),例如,可以用已有的預(yù)制件建筑一幢結(jié)構(gòu)和外形都不同于從前的新大樓。重用是提高生產(chǎn)率的最主要的方法。 傳統(tǒng)的軟件重用技術(shù)是利用標(biāo)準(zhǔn)函數(shù)庫(kù),也就是試圖用標(biāo)準(zhǔn)函數(shù)庫(kù)中的函數(shù)作為“預(yù)制件”來(lái)建造新的軟件系統(tǒng)。但是,標(biāo)準(zhǔn)函數(shù)缺乏必要的“柔性”,不能適應(yīng)不同應(yīng)用場(chǎng)合的不同需要,并不是理想的可重用的軟件成分。實(shí)際的庫(kù)函數(shù)往往僅提供最基本、最常用的功能,在開(kāi)發(fā)一個(gè)新的軟件系統(tǒng)時(shí),通常多數(shù)函數(shù)是開(kāi)發(fā)者自己編寫(xiě)的,甚至絕大多數(shù)函數(shù)都是新編的。 使用傳統(tǒng)方法學(xué)開(kāi)發(fā)軟件時(shí),人們認(rèn)為具有功能內(nèi)聚性的模塊是理想的模塊,也

17、就是說(shuō),如果一個(gè)模塊完成一個(gè)且只完成一個(gè)相對(duì)獨(dú)立的子功能,那么這個(gè)模塊就是理想的可重用模塊。基于這種認(rèn)識(shí),通常盡量把標(biāo)準(zhǔn)函數(shù)庫(kù)中的函數(shù)做成功能內(nèi)聚的。但是,即使是具有功能內(nèi)聚性的模塊也并不是自含的和獨(dú)立的,相反,它必須運(yùn)行在相應(yīng)的數(shù)據(jù)結(jié)構(gòu)上。如果要重用這樣的模塊,則相應(yīng)的數(shù)據(jù)也必須重用。如果新產(chǎn)品中的數(shù)據(jù)與最初產(chǎn)品中的數(shù)據(jù)不同,則要么修改數(shù)據(jù)要么修改這個(gè)模塊。 事實(shí)上,離開(kāi)了操作便無(wú)法處理數(shù)據(jù),而脫離了數(shù)據(jù)的操作也是毫無(wú)意義的,我們應(yīng)該對(duì)數(shù)據(jù)和操作同樣重視。在面向?qū)ο蠓椒ㄋ褂玫膶?duì)象中,數(shù)據(jù)和操作正是作為平等伙伴出現(xiàn)的。因此,對(duì)象具有很強(qiáng)的自含性,此外,對(duì)象固有的封裝性和信息隱藏機(jī)制,使得對(duì)象

18、的內(nèi)部實(shí)現(xiàn)與外界隔離,具有較強(qiáng)的獨(dú)立性。由此可見(jiàn),對(duì)象是比較理想的模塊和可重用的軟件成分。 面向?qū)ο蟮能浖夹g(shù)在利用可重用的軟件成分構(gòu)造新的軟件系統(tǒng)時(shí),有很大的靈活性。有兩種方法可以重復(fù)使用一個(gè)對(duì)象類(lèi):一種方法是創(chuàng)建該類(lèi)的實(shí)例,從而直接使用它;另一種方法是從它派生出一個(gè)滿(mǎn)足當(dāng)前需要的新類(lèi)。繼承性機(jī)制使得子類(lèi)不僅可以重用其父類(lèi)的數(shù)據(jù)結(jié)構(gòu)和程序代碼,而且可以在父類(lèi)代碼的基礎(chǔ)上方便地修改和擴(kuò)充,這種修改并不影響對(duì)原有類(lèi)的使用。由于可以像使用集成電路(IC)構(gòu)造計(jì)算機(jī)硬件那樣,比較方便地重用對(duì)象類(lèi)來(lái)構(gòu)造軟件系統(tǒng),因此,有人把對(duì)象類(lèi)稱(chēng)為“軟件IC”。4. 較易開(kāi)發(fā)大型軟件產(chǎn)品 在開(kāi)發(fā)大型軟件產(chǎn)品時(shí),組織

19、開(kāi)發(fā)人員的方法不恰當(dāng)往往是出現(xiàn)問(wèn)題的主要原因。用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件時(shí),構(gòu)成軟件系統(tǒng)的每個(gè)對(duì)象就像一個(gè)微型程序,有自己的數(shù)據(jù)、操作、功能和用途,因此,可以把一個(gè)大型軟件產(chǎn)品分解成一系列本質(zhì)上相互獨(dú)立的小產(chǎn)品來(lái)處理,這就不僅降低了開(kāi)發(fā)的技術(shù)難度,而且也使得對(duì)開(kāi)發(fā)工作的管理變得容易多了。這就是為什么對(duì)于大型軟件產(chǎn)品來(lái)說(shuō),面向?qū)ο蠓缎蛢?yōu)于結(jié)構(gòu)化范型的原因之一。5. 可維護(hù)性好 用傳統(tǒng)方法和面向過(guò)程語(yǔ)言開(kāi)發(fā)出來(lái)的軟件很難維護(hù),是長(zhǎng)期困擾人們的一個(gè)嚴(yán)重問(wèn)題,是軟件危機(jī)的突出表現(xiàn)。由于下述因素的存在,使得用面向?qū)ο蠓椒ㄋ_(kāi)發(fā)的軟件可維護(hù)性好:(1) 面向?qū)ο蟮能浖€(wěn)定性比較好。 如前所述,當(dāng)對(duì)軟件的功能

20、或性能的要求發(fā)生變化時(shí),通常不會(huì)引起軟件的整體變化,往往只需對(duì)局部作一些修改。由于對(duì)軟件所需做的改動(dòng)較小且限于局部,自然比較容易實(shí)現(xiàn)。(2) 面向?qū)ο蟮能浖容^容易修改。 如前所述,類(lèi)是理想的模塊機(jī)制,它的獨(dú)立性好,修改一個(gè)類(lèi)通常很少會(huì)牽扯到其他類(lèi)。如果僅修改一個(gè)類(lèi)的內(nèi)部實(shí)現(xiàn)部分(私有數(shù)據(jù)成員或成員函數(shù)的算法),而不修改該類(lèi)的對(duì)外接口,則可以完全不影響軟件的其他部分。 面向?qū)ο筌浖夹g(shù)特有的繼承機(jī)制,使得對(duì)軟件的修改和擴(kuò)充比較容易實(shí)現(xiàn),通常只須從已有類(lèi)派生出一些新類(lèi),無(wú)須修改軟件原有成分。 面向?qū)ο筌浖夹g(shù)的多態(tài)性機(jī)制(見(jiàn)2.2.2節(jié)),使得當(dāng)擴(kuò)充軟件功能時(shí)對(duì)原有代碼所需作的修改進(jìn)一步減少,需

21、要增加的新代碼也比較少。(3) 面向?qū)ο蟮能浖容^容易理解。在維護(hù)已有軟件的時(shí)候,首先需要對(duì)原有軟件與此次修改有關(guān)的部分有深入理解,才能正確地完成維護(hù)工作。傳統(tǒng)軟件之所以難于維護(hù),在很大程度上是因?yàn)樾薷乃婕暗牟糠址稚⒃谲浖鱾€(gè)地方,需要了解的面很廣,內(nèi)容很多,而且傳統(tǒng)軟件的解空間與問(wèn)題空間的結(jié)構(gòu)很不一致,更增加了理解原有軟件的難度和工作量。面向?qū)ο蟮能浖夹g(shù)符合人們習(xí)慣的思維方式,用這種方法所建立的軟件系統(tǒng)的結(jié)構(gòu)與問(wèn)題空間的結(jié)構(gòu)基本一致。因此,面向?qū)ο蟮能浖到y(tǒng)比較容易理解。對(duì)面向?qū)ο筌浖到y(tǒng)所做的修改和擴(kuò)充,通常通過(guò)在原有類(lèi)的基礎(chǔ)上派生出一些新類(lèi)來(lái)實(shí)現(xiàn)。由于對(duì)象類(lèi)有很強(qiáng)的獨(dú)立性,當(dāng)派生新類(lèi)

22、的時(shí)候通常不需要詳細(xì)了解基類(lèi)中操作的實(shí)現(xiàn)算法。因此,了解原有系統(tǒng)的工作量可以大幅度下降。(4) 易于測(cè)試和調(diào)試。為了保證軟件質(zhì)量,對(duì)軟件進(jìn)行維護(hù)之后必須進(jìn)行必要的測(cè)試,以確保要求修改或擴(kuò)充的功能按照要求正確地實(shí)現(xiàn)了,而且沒(méi)有影響到軟件不該修改的部分。如果測(cè)試過(guò)程中發(fā)現(xiàn)了錯(cuò)誤,還必須通過(guò)調(diào)試改正過(guò)來(lái)。顯然,軟件是否易于測(cè)試和調(diào)試,是影響軟件可維護(hù)性的一個(gè)重要因素。對(duì)面向?qū)ο蟮能浖M(jìn)行維護(hù),主要通過(guò)從已有類(lèi)派生出一些新類(lèi)來(lái)實(shí)現(xiàn)。因此,維護(hù)后的測(cè)試和調(diào)試工作也主要圍繞這些新派生出來(lái)的類(lèi)進(jìn)行。類(lèi)是獨(dú)立性很強(qiáng)的模塊,向類(lèi)的實(shí)例發(fā)消息即可運(yùn)行它,觀察它是否能正確地完成要求它做的工作,對(duì)類(lèi)的測(cè)試通常比較容易

23、實(shí)現(xiàn),如果發(fā)現(xiàn)錯(cuò)誤也往往集中在類(lèi)的內(nèi)部,比較容易調(diào)試。迭代是軟件開(kāi)發(fā)過(guò)程中普遍存在的一種內(nèi)在屬性。經(jīng)驗(yàn)表明,軟件過(guò)程各個(gè)階段之間的迭代或一個(gè)階段內(nèi)各個(gè)工作步驟之間的迭代,在面向?qū)ο蠓缎椭斜仍诮Y(jié)構(gòu)化范型中更常見(jiàn)。2.1.3 噴泉模型一般說(shuō)來(lái),使用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件時(shí),工作重點(diǎn)應(yīng)該放在生命周期中的分析階段。這種方法在開(kāi)發(fā)的早期階段定義了一系列面向問(wèn)題的對(duì)象,并且在整個(gè)開(kāi)發(fā)過(guò)程中不斷充實(shí)和擴(kuò)充這些對(duì)象。由于在整個(gè)開(kāi)發(fā)過(guò)程中都使用統(tǒng)一的軟件概念“對(duì)象”,所有其他概念(例如功能、關(guān)系、事件等)都是圍繞對(duì)象組成的,目的是保證分析工作中得到的信息不會(huì)丟失或改變,因此,對(duì)生命周期各階段的區(qū)分自然就不重要、

24、不明顯了。分析階段得到的對(duì)象模型也適用于設(shè)計(jì)階段和實(shí)現(xiàn)階段。由于各階段都使用統(tǒng)一的概念和表示符號(hào),因此,整個(gè)開(kāi)發(fā)過(guò)程都是吻合一致的,或者說(shuō)是“無(wú)縫”連接的,這自然就很容易實(shí)現(xiàn)各個(gè)開(kāi)發(fā)步驟的多次反復(fù)迭代,達(dá)到認(rèn)識(shí)的逐步深化。每次反復(fù)都會(huì)增加或明確一些目標(biāo)系統(tǒng)的性質(zhì),但卻不是對(duì)先前工作結(jié)果的本質(zhì)性改動(dòng),這樣就減少了不一致性,降低了出錯(cuò)的可能性。圖2.1所示的噴泉模型,是典型的面向?qū)ο蟮能浖^(guò)程模型。圖2.1 噴泉模型 “噴泉”這個(gè)詞體現(xiàn)了面向?qū)ο筌浖_(kāi)發(fā)過(guò)程迭代和無(wú)縫的特性。圖中代表不同階段的圓圈相互重疊,這明確表示兩個(gè)活動(dòng)之間存在交迭;而面向?qū)ο蠓椒ㄔ诟拍詈捅硎痉椒ㄉ系囊恢滦裕WC了在各項(xiàng)開(kāi)發(fā)活

25、動(dòng)之間的無(wú)縫過(guò)渡,事實(shí)上,用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件時(shí),在分析、設(shè)計(jì)和編碼等項(xiàng)開(kāi)發(fā)活動(dòng)之間并不存在明顯的邊界。圖中在一個(gè)階段內(nèi)的向下箭頭代表該階段內(nèi)的迭代(或求精)。圖中較小的圓圈代表維護(hù),圓圈較小象征著采用了面向?qū)ο蠓缎椭缶S護(hù)時(shí)間縮短了。為避免使用噴泉模型開(kāi)發(fā)軟件時(shí)開(kāi)發(fā)過(guò)程過(guò)分無(wú)序,應(yīng)該把一個(gè)線(xiàn)性過(guò)程(例如,快速原型模型或圖2.1中的中心垂線(xiàn))作為總目標(biāo)。但是,同時(shí)也應(yīng)該記住,面向?qū)ο蠓缎捅旧硪蠼?jīng)常對(duì)開(kāi)發(fā)活動(dòng)進(jìn)行迭代或求精。在應(yīng)用領(lǐng)域中有意義的、與所要解決的問(wèn)題有關(guān)系的任何事物都可以作為對(duì)象,它既可以是具體的物理實(shí)體的抽象,也可以是人為的概念,或者是任何有明確邊界和意義的東西。對(duì)象是對(duì)問(wèn)題域

26、中某個(gè)實(shí)體的抽象,設(shè)立某個(gè)對(duì)象就反映了軟件系統(tǒng)具有保存有關(guān)它的信息并且與它進(jìn)行交互的能力。2.2 面向?qū)ο蟮母拍?2.2.1 對(duì)象由于客觀世界中的實(shí)體通常都既具有靜態(tài)的屬性,又具有動(dòng)態(tài)的行為,因此,面向?qū)ο蠓椒▽W(xué)中的對(duì)象是由描述該對(duì)象屬性的數(shù)據(jù)以及可以對(duì)這些數(shù)據(jù)施加的所有操作封裝在一起構(gòu)成的統(tǒng)一體。對(duì)象可以作的操作表示它的動(dòng)態(tài)行為,在面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)中,通常把對(duì)象的操作稱(chēng)為服務(wù)或方法。1. 對(duì)象的形象表示為有助于讀者理解對(duì)象的概念,圖2.2形象地描繪了具有3個(gè)操作的對(duì)象。圖2.2 對(duì)象的形象表示一個(gè)對(duì)象很像一臺(tái)錄音機(jī)。當(dāng)在軟件中使用一個(gè)對(duì)象的時(shí)候,只能通過(guò)對(duì)象與外界的界面來(lái)操作它。對(duì)

27、象與外界的界面也就是該對(duì)象向公眾開(kāi)放的操作。使用對(duì)象向公眾開(kāi)放的操作就好像使用錄音機(jī)的按鍵,只須知道該操作的名字(好像錄音機(jī)的按鍵名)和所需要的參數(shù)(提供附加信息或設(shè)置狀態(tài),根本無(wú)須知道實(shí)現(xiàn)這些操作的方法。事實(shí)上,實(shí)現(xiàn)對(duì)象操作的代碼和數(shù)據(jù)是隱藏在對(duì)象內(nèi)部的,一個(gè)對(duì)象好像是一個(gè)黑盒子,表示它內(nèi)部狀態(tài)的數(shù)據(jù)和實(shí)現(xiàn)各個(gè)操作的代碼及局部數(shù)據(jù),都被封裝在這個(gè)黑盒子內(nèi)部,在外面是看不見(jiàn)的,更不能從外面去訪(fǎng)問(wèn)或修改這些數(shù)據(jù)或代碼。使用對(duì)象時(shí)只需知道它向外界提供的接口形式而無(wú)須知道它的內(nèi)部實(shí)現(xiàn)算法,不僅使得對(duì)象的使用變得非常簡(jiǎn)單、方便,而且具有很高的安全性和可靠性。對(duì)象內(nèi)部的數(shù)據(jù)只能通過(guò)對(duì)象的公有方法(如C+

28、的公有成員函數(shù))來(lái)訪(fǎng)問(wèn)或處理,這就保證了對(duì)這些數(shù)據(jù)的訪(fǎng)問(wèn)或處理,在任何時(shí)候都是使用統(tǒng)一的方法進(jìn)行的,不會(huì)像使用傳統(tǒng)的面向過(guò)程的程序設(shè)計(jì)語(yǔ)言那樣,由于每個(gè)使用者各自編寫(xiě)自己的處理某個(gè)全局?jǐn)?shù)據(jù)的過(guò)程而發(fā)生錯(cuò)誤。當(dāng)對(duì)象處于不同狀態(tài)時(shí),做同一個(gè)操作所得到的效果也是不同的。2. 對(duì)象的定義目前,對(duì)對(duì)象所下的定義并不完全統(tǒng)一,人們從不同角度給出對(duì)象的不同定義。這些定義雖然形式不同,但基本含義是相同的。下面給出對(duì)象的幾個(gè)定義。(1) 定義1: 對(duì)象是具有相同狀態(tài)的一組操作的集合。這個(gè)定義主要是從面向?qū)ο蟪绦蛟O(shè)計(jì)的角度看“對(duì)象”。(2) 定義2: 對(duì)象是對(duì)問(wèn)題域中某個(gè)東西的抽象,這種抽象反映了系統(tǒng)保存有關(guān)這個(gè)

29、東西的信息或與它交互的能力。也就是說(shuō),對(duì)象是對(duì)屬性值和操作的封裝。這個(gè)定義著重從信息模擬的角度看待“對(duì)象”。(3) 定義3: 對(duì)象=ID,MS,DS,MI。其中,ID是對(duì)象的標(biāo)識(shí)或名字,MS是對(duì)象中的操作集合,DS是對(duì)象的數(shù)據(jù)結(jié)構(gòu),MI是對(duì)象受理的消息名集合(即對(duì)外接口)。這個(gè)定義是一個(gè)形式化的定義。總之,對(duì)象是封裝了數(shù)據(jù)結(jié)構(gòu)及可以施加在這些數(shù)據(jù)結(jié)構(gòu)上的操作的封裝體,這個(gè)封裝體有可以惟一地標(biāo)識(shí)它的名字,而且向外界提供一組服務(wù)(即公有的操作)。對(duì)象中的數(shù)據(jù)表示對(duì)象的狀態(tài),一個(gè)對(duì)象的狀態(tài)只能由該對(duì)象的操作來(lái)改變。每當(dāng)需要改變對(duì)象的狀態(tài)時(shí),只能由其他對(duì)象向該對(duì)象發(fā)送消息。對(duì)象響應(yīng)消息時(shí),按照消息模式

30、找出與之匹配的方法,并執(zhí)行該方法。從動(dòng)態(tài)角度或?qū)ο蟮膶?shí)現(xiàn)機(jī)制來(lái)看,對(duì)象是一臺(tái)自動(dòng)機(jī)。具有內(nèi)部狀態(tài)S,操作fi(i=1,2,n),且與操作fi對(duì)應(yīng)的狀態(tài)轉(zhuǎn)換函數(shù)為gi(i=1,2,n)的一個(gè)對(duì)象,可以用圖2.3所示的自動(dòng)機(jī)來(lái)模擬。圖2.3 用自動(dòng)機(jī)模擬對(duì)象3. 對(duì)象的特點(diǎn)(1) 以數(shù)據(jù)為中心。操作圍繞對(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ā)消息,

31、請(qǐng)求它執(zhí)行它的某個(gè)操作,處理它的私有數(shù)據(jù)。(3) 實(shí)現(xiàn)了數(shù)據(jù)封裝。對(duì)象好像是一只黑盒子,它的私有數(shù)據(jù)完全被封裝在盒子內(nèi)部,對(duì)外是隱藏的、不可見(jiàn)的,對(duì)私有數(shù)據(jù)的訪(fǎng)問(wèn)或處理只能通過(guò)公有的操作進(jìn)行。為了使用對(duì)象內(nèi)部的私有數(shù)據(jù),只需知道數(shù)據(jù)的取值范圍(值域)和可以對(duì)該數(shù)據(jù)施加的操作(即,對(duì)象提供了哪些處理或訪(fǎng)問(wèn)數(shù)據(jù)的公有方法),根本無(wú)須知道數(shù)據(jù)的具體結(jié)構(gòu)以及實(shí)現(xiàn)操作的算法。這也就是抽象數(shù)據(jù)類(lèi)型的概念。因此,一個(gè)對(duì)象類(lèi)型也可以看作是一種抽象數(shù)據(jù)類(lèi)型。(4) 本質(zhì)上具有并行性。 對(duì)象是描述其內(nèi)部狀態(tài)的數(shù)據(jù)及可以對(duì)這些數(shù)據(jù)施加的全部操作的集合。不同對(duì)象各自獨(dú)立地處理自身的數(shù)據(jù),彼此通過(guò)發(fā)消息傳遞信息完成通信

32、。因此,本質(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ù)施加的操作所組成的統(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ì)象之間的耦合通常比較松。1. 類(lèi)(class)現(xiàn)實(shí)世界中存在的客觀事物有些是彼此相似的,例如,張三、李四、王

33、五雖說(shuō)每個(gè)人職業(yè)、性格、愛(ài)好、特長(zhǎng)等等各有不同,但是,他們的基本特征是相似的,都是黃皮膚、黑頭發(fā)、黑眼睛,于是人們把他們統(tǒng)稱(chēng)為“中國(guó)人”。人類(lèi)習(xí)慣于把有相似特征的事物歸為一類(lèi),分類(lèi)是人類(lèi)認(rèn)識(shí)客觀世界的基本方法。2.2.2 重要概念在面向?qū)ο蟮能浖夹g(shù)中,“類(lèi)”就是對(duì)具有相同數(shù)據(jù)和相同操作的一組相似對(duì)象的定義,也就是說(shuō),類(lèi)是對(duì)具有相同屬性和行為的一個(gè)或多個(gè)對(duì)象的描述,通常在這種描述中也包括對(duì)怎樣創(chuàng)建該類(lèi)的新對(duì)象的說(shuō)明。以上先詳細(xì)地闡述了對(duì)象的定義,然后在此基礎(chǔ)上定義了類(lèi)。也可以先定義類(lèi)再定義對(duì)象,例如,可以像下面這樣定義類(lèi)和對(duì)象: 類(lèi)是支持繼承的抽象數(shù)據(jù)類(lèi)型,而對(duì)象就是類(lèi)的實(shí)例。2. 實(shí)例(in

34、stance)實(shí)例就是由某個(gè)特定的類(lèi)所描述的一個(gè)具體的對(duì)象。類(lèi)是對(duì)具有相同屬性和行為的一組相似的對(duì)象的抽象,類(lèi)在現(xiàn)實(shí)世界中并不能真正存在。實(shí)際上類(lèi)是建立對(duì)象時(shí)使用的“樣板”,按照這個(gè)樣板所建立的一個(gè)個(gè)具體的對(duì)象,就是類(lèi)的實(shí)際例子,通常稱(chēng)為實(shí)例。當(dāng)使用“對(duì)象”這個(gè)術(shù)語(yǔ)時(shí),既可以指一個(gè)具體的對(duì)象,也可以泛指一般的對(duì)象,但是,當(dāng)使用“實(shí)例”這個(gè)術(shù)語(yǔ)時(shí),必然是指一個(gè)具體的對(duì)象。3. 消息(message)消息就是要求某個(gè)對(duì)象執(zhí)行在定義它的那個(gè)類(lèi)中所定義的某個(gè)操作的規(guī)格說(shuō)明。通常,一個(gè)消息由下述3部分組成:接收消息的對(duì)象名;消息選擇符(也稱(chēng)為消息名);零個(gè)或多個(gè)變?cè)?. 方法(method)方法就是對(duì)

35、象所能執(zhí)行的操作,也就是類(lèi)中所定義的服務(wù)。方法描述了對(duì)象執(zhí)行操作的算法,響應(yīng)消息的方法。在C+語(yǔ)言中把方法稱(chēng)為成員函數(shù),有公有、私有和保護(hù)成員函數(shù)3類(lèi)。5. 屬性(attribute)屬性就是類(lèi)中所定義的數(shù)據(jù),它是對(duì)客觀世界實(shí)體所具有的性質(zhì)的抽象。類(lèi)的每個(gè)實(shí)例都有自己特有的屬性值。在C+語(yǔ)言中把屬性稱(chēng)為數(shù)據(jù)成員,有:公有成員public私有成員private保護(hù)成員protected6. 封裝(encapsulation)從字面上理解,所謂封裝就是把某個(gè)事物包起來(lái),使外界不知道該事物的具體內(nèi)容。在面向?qū)ο蟮某绦蛑校褦?shù)據(jù)和實(shí)現(xiàn)操作的代碼集中起來(lái)放在對(duì)象內(nèi)部。一個(gè)對(duì)象好像是一個(gè)不透明的黑盒子,表

36、示對(duì)象狀態(tài)的數(shù)據(jù)和實(shí)現(xiàn)操作的代碼與局部數(shù)據(jù),都被封裝在黑盒子里面,從外面是看不見(jiàn)的,更不能從外面直接訪(fǎng)問(wèn)或修改這些數(shù)據(jù)和代碼。使用一個(gè)對(duì)象的時(shí)候,只需知道它向外界提供的接口形式,無(wú)須知道它的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)和實(shí)現(xiàn)操作的算法。綜上所述,對(duì)象具有封裝性的條件如下:(1) 有一個(gè)清晰的邊界。所有私有數(shù)據(jù)和實(shí)現(xiàn)操作的代碼都被封裝在這個(gè)邊界內(nèi),從外面看不見(jiàn)更不能直接訪(fǎng)問(wèn)。(2) 有確定的接口(即協(xié)議)。這些接口就是對(duì)象可以接受的消息,只能通過(guò)向?qū)ο蟀l(fā)送消息來(lái)使用它。(3) 受保護(hù)的內(nèi)部實(shí)現(xiàn)。實(shí)現(xiàn)對(duì)象功能的細(xì)節(jié)(私有數(shù)據(jù)和代碼)不能在定義該對(duì)象的類(lèi)的范圍外訪(fǎng)問(wèn)。封裝也就是信息隱藏,通過(guò)封裝對(duì)外界隱藏了對(duì)象的實(shí)

37、現(xiàn)細(xì)節(jié)。對(duì)象類(lèi)實(shí)質(zhì)上是抽象數(shù)據(jù)類(lèi)型。類(lèi)把數(shù)據(jù)說(shuō)明和操作說(shuō)明與數(shù)據(jù)表達(dá)和操作實(shí)現(xiàn)分離開(kāi)了,使用者只需知道它的說(shuō)明(值域及可對(duì)數(shù)據(jù)施加的操作),就可以使用它。7. 繼承(inheritance)廣義地說(shuō),繼承是指能夠直接獲得已有的性質(zhì)和特征,而不必重復(fù)定義它們。在面向?qū)ο蟮能浖夹g(shù)中,繼承是子類(lèi)自動(dòng)地共享基類(lèi)中定義的數(shù)據(jù)和方法的機(jī)制。面向?qū)ο筌浖夹g(shù)的許多強(qiáng)有力的功能和突出的優(yōu)點(diǎn),都來(lái)源于把類(lèi)組成一個(gè)層次結(jié)構(gòu)的系統(tǒng)(類(lèi)等級(jí)):一個(gè)類(lèi)的上層可以有父類(lèi),下層可以有子類(lèi)。這種層次結(jié)構(gòu)系統(tǒng)的一個(gè)重要性質(zhì)是繼承性,一個(gè)類(lèi)直接繼承其父類(lèi)的全部描述(數(shù)據(jù)和操作)。為了更深入、具體地理解繼承性的含義,圖2.4描繪

38、了實(shí)現(xiàn)繼承機(jī)制的原理。繼承具有傳遞性。因此,一個(gè)類(lèi)實(shí)際上繼承了它所在的類(lèi)等級(jí)中在它上層的全部基類(lèi)的所有描述,也就是說(shuō),屬于某類(lèi)的對(duì)象除了具有該類(lèi)所描述的性質(zhì)外,還具有類(lèi)等級(jí)中該類(lèi)上層全部基類(lèi)描述的一切性質(zhì)。圖2.4 實(shí)現(xiàn)繼承機(jī)制的原理當(dāng)一個(gè)類(lèi)只允許有一個(gè)父類(lèi)時(shí),也就是說(shuō),當(dāng)類(lèi)等級(jí)為樹(shù)形結(jié)構(gòu)時(shí),類(lèi)的繼承是單繼承;當(dāng)允許一個(gè)類(lèi)有多個(gè)父類(lèi)時(shí),類(lèi)的繼承是多重繼承。多重繼承的類(lèi)可以組合多個(gè)父類(lèi)的性質(zhì)構(gòu)成所需要的性質(zhì),因此功能更強(qiáng)、使用更方便;但是,使用多重繼承時(shí)要注意避免二義性。繼承性使得相似的對(duì)象可以共享程序代碼和數(shù)據(jù)結(jié)構(gòu),從而大大減少了程序中的冗余信息。在程序執(zhí)行期間,對(duì)對(duì)象某一性質(zhì)的查找是從該對(duì)象

39、類(lèi)在類(lèi)等級(jí)中所在的層次開(kāi)始,沿類(lèi)等級(jí)逐層向上進(jìn)行的,并把第一個(gè)被找到的性質(zhì)作為所要的性質(zhì)。因此,低層的性質(zhì)將屏蔽高層的同名性質(zhì)。使用從原有類(lèi)派生出新的子類(lèi)的辦法,使得對(duì)軟件的修改變得比過(guò)去容易得多了。當(dāng)需要擴(kuò)充原有的功能時(shí),派生類(lèi)的方法可以調(diào)用其基類(lèi)的方法,并在此基礎(chǔ)上增加必要的程序代碼;當(dāng)需要完全改變?cè)胁僮鞯乃惴〞r(shí),可以在派生類(lèi)中實(shí)現(xiàn)一個(gè)與基類(lèi)方法同名而算法不同的方法;當(dāng)需要增加新的功能時(shí),可以在派生類(lèi)中實(shí)現(xiàn)一個(gè)新的方法。繼承性使得用戶(hù)在開(kāi)發(fā)新的應(yīng)用系統(tǒng)時(shí)不必完全從零開(kāi)始,可以繼承原有的相似系統(tǒng)的功能或者從類(lèi)庫(kù)中選取需要的類(lèi),再派生出新的類(lèi)以實(shí)現(xiàn)所需要的功能。有了繼承性以后,還可以用把已有

40、的一般性的解加以具體化的辦法,來(lái)達(dá)到軟件重用的目的:首先,使用抽象的類(lèi)開(kāi)發(fā)出一般性問(wèn)題的解,然后,在派生類(lèi)中增加少量代碼使一般性的解具體化,從而開(kāi)發(fā)出符合特定應(yīng)用需要的具體解。8. 多態(tài)性(polymorphism)多態(tài)性一詞來(lái)源于希臘語(yǔ),意思是“有許多形態(tài)”。在面向?qū)ο蟮能浖夹g(shù)中,多態(tài)性是指子類(lèi)對(duì)象可以像父類(lèi)對(duì)象那樣使用,同樣的消息既可以發(fā)送給父類(lèi)對(duì)象也可以發(fā)送給子類(lèi)對(duì)象。也就是說(shuō),在類(lèi)等級(jí)的不同層次中可以共享(公用)一個(gè)行為(方法)的名字,然而不同層次中的每個(gè)類(lèi)卻各自按自己的需要來(lái)實(shí)現(xiàn)這個(gè)行為。當(dāng)對(duì)象接收到發(fā)送給它的消息時(shí),根據(jù)該對(duì)象所屬于的類(lèi)動(dòng)態(tài)選用在該類(lèi)中定義的實(shí)現(xiàn)算法。在C+語(yǔ)言中

41、,多態(tài)性是通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)的。在類(lèi)等級(jí)不同層次中可以說(shuō)明名字、參數(shù)特征和返回值類(lèi)型都相同的虛擬成員函數(shù),而不同層次的類(lèi)中的虛函數(shù)實(shí)現(xiàn)算法各不相同。虛函數(shù)機(jī)制使得程序員能在一個(gè)類(lèi)等級(jí)中使用相同函數(shù)的多個(gè)不同版本,在運(yùn)行時(shí)刻才根據(jù)接收消息的對(duì)象所屬于的類(lèi),決定到底執(zhí)行哪個(gè)特定的版本,這稱(chēng)為動(dòng)態(tài)聯(lián)編,也叫滯后聯(lián)編。例:class Figure class Rectangle:public Figure class Circle:public Figure protected: private: private: int centX,centY; int upLeftX,upLefyY; int Co

42、odX,CoodY; . int lowRightX,lowRightY; int Radius; public: public: public: DrawRectangle(); DrawCircle(); virtual void show(); virtual void show(); virtual void show(); virtual void Hide(); virtual void Hide(); virtual void Hide(); virtual void Zoom(); virtual void Zoom(); virtual void Zoom(); ; ; ;多

43、態(tài)性機(jī)制不僅增加了面向?qū)ο筌浖到y(tǒng)的靈活性,進(jìn)一步減少了信息冗余,而且顯著提高了軟件的可重用性和可擴(kuò)充性。當(dāng)擴(kuò)充系統(tǒng)功能增加新的實(shí)體類(lèi)型時(shí),只須派生出與新實(shí)體類(lèi)相應(yīng)的新的子類(lèi),并在新派生出的子類(lèi)中定義符合該類(lèi)需要的虛函數(shù),完全無(wú)須修改原有的程序代碼,甚至不需要重新編譯原有的程序(僅需編譯新派生類(lèi)的源程序,再與原有程序的.OBJ文件連接)。9. 重載(overloading)有兩種重載:函數(shù)重載是指在同一作用域內(nèi)的若干個(gè)參數(shù)特征不同的函數(shù)可以使用相同的函數(shù)名字;運(yùn)算符重載是指同一個(gè)運(yùn)算符可以施加于不同類(lèi)型的操作數(shù)上面。當(dāng)然,當(dāng)參數(shù)特征不同或被操作數(shù)的類(lèi)型不同時(shí),實(shí)現(xiàn)函數(shù)的算法或運(yùn)算符的語(yǔ)義是不相

44、同的。在C+語(yǔ)言中函數(shù)重載是通過(guò)靜態(tài)聯(lián)編(也叫先前聯(lián)編)實(shí)現(xiàn)的,也就是在編譯時(shí)根據(jù)函數(shù)變?cè)膫€(gè)數(shù)和類(lèi)型,決定到底使用函數(shù)的哪個(gè)實(shí)現(xiàn)代碼;對(duì)于重載的運(yùn)算符,同樣是在編譯時(shí)根據(jù)被操作數(shù)的類(lèi)型,決定使用該算符的哪種語(yǔ)義。重載進(jìn)一步提高了面向?qū)ο笙到y(tǒng)的靈活性和可讀性。一、什么是模型為了更好地理解問(wèn)題,人們常常采用建立問(wèn)題模型的方法。所謂模型,就是為了理解事物而對(duì)事物作出的一種抽象,是對(duì)事物的一種無(wú)歧義的書(shū)面描述。通常,模型由一組圖示符號(hào)和組織這些符號(hào)的規(guī)則組成,利用它們來(lái)定義和描述問(wèn)題域中的術(shù)語(yǔ)和概念。更進(jìn)一步講,模型是一種思考工具,利用這種工具可以把知識(shí)規(guī)范地表示出來(lái)。模型可以幫助我們思考問(wèn)題、定義

45、術(shù)語(yǔ)、在選擇術(shù)語(yǔ)時(shí)作出適當(dāng)?shù)募僭O(shè),并且可以幫助我們保持定義和假設(shè)的一致性。2.3 面向?qū)ο蠼榱碎_(kāi)發(fā)復(fù)雜的軟件系統(tǒng),系統(tǒng)分析員應(yīng)該從不同角度抽象出目標(biāo)系統(tǒng)的特性,使用精確的表示方法構(gòu)造系統(tǒng)的模型,驗(yàn)證模型是否滿(mǎn)足用戶(hù)對(duì)目標(biāo)系統(tǒng)的需求,并在設(shè)計(jì)過(guò)程中逐漸把和實(shí)現(xiàn)有關(guān)的細(xì)節(jié)加進(jìn)模型中,直至最終用程序?qū)崿F(xiàn)模型。對(duì)于那些因過(guò)分復(fù)雜而不能直接理解的系統(tǒng),特別需要建立模型,建模的目的主要是為了減少?gòu)?fù)雜性。人的頭腦每次只能處理一定數(shù)量的信息,模型通過(guò)把系統(tǒng)的重要部分分解成人的頭腦一次能處理的若干個(gè)子部分,從而減少系統(tǒng)的復(fù)雜程度。在對(duì)目標(biāo)系統(tǒng)進(jìn)行分析的初始階段,面對(duì)大量模糊的、涉及眾多專(zhuān)業(yè)領(lǐng)域的、錯(cuò)綜復(fù)雜的

46、信息,系統(tǒng)分析員往往感到無(wú)從下手。模型提供了組織大量信息的一種有效機(jī)制。一旦建立起模型之后,這個(gè)模型就要經(jīng)受用戶(hù)和各個(gè)領(lǐng)域?qū)<业膰?yán)格審查。由于模型的規(guī)范化和系統(tǒng)化,因此比較容易暴露出系統(tǒng)分析員對(duì)目標(biāo)系統(tǒng)認(rèn)識(shí)的片面性和不一致性。通過(guò)審查,往往會(huì)發(fā)現(xiàn)許多錯(cuò)誤,發(fā)現(xiàn)錯(cuò)誤是正常現(xiàn)象,這些錯(cuò)誤可以在成為目標(biāo)系統(tǒng)中的錯(cuò)誤之前,就被預(yù)先清除掉。通常,用戶(hù)和領(lǐng)域?qū)<铱梢酝ㄟ^(guò)快速建立的原型親身體驗(yàn),從而對(duì)系統(tǒng)模型進(jìn)行更有效的審查。模型常常會(huì)經(jīng)過(guò)多次必要的修改,通過(guò)不斷改正錯(cuò)誤的或不全面的認(rèn)識(shí),最終使軟件開(kāi)發(fā)人員對(duì)問(wèn)題有了透徹的理解,從而為后續(xù)的開(kāi)發(fā)工作奠定了堅(jiān)實(shí)基礎(chǔ)。用面向?qū)ο蠓椒ǔ晒Φ亻_(kāi)發(fā)軟件的關(guān)鍵,同樣是對(duì)

47、問(wèn)題域的理解。面向?qū)ο蠓椒ㄗ罨镜脑瓌t,是按照人們習(xí)慣的思維方式,用面向?qū)ο笥^點(diǎn)建立問(wèn)題域的模型,開(kāi)發(fā)出盡可能自然地表現(xiàn)求解方法的軟件。二、三種要建立的模型用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件,通常需要建立3種形式的模型,它們分別是描述系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的對(duì)象模型,描述系統(tǒng)控制結(jié)構(gòu)的動(dòng)態(tài)模型和描述系統(tǒng)功能的功能模型。這3種模型都涉及到數(shù)據(jù)、控制和操作等共同的概念,只不過(guò)每種模型描述的側(cè)重點(diǎn)不同。這3種模型從3個(gè)不同但又密切相關(guān)的角度模擬目標(biāo)系統(tǒng),它們各自從不同側(cè)面反映了系統(tǒng)的實(shí)質(zhì)性?xún)?nèi)容,綜合起來(lái)則全面地反映了對(duì)目標(biāo)系統(tǒng)的需求。一個(gè)典型的軟件系統(tǒng)組合了上述3方面內(nèi)容:它使用數(shù)據(jù)結(jié)構(gòu)(對(duì)象模型),執(zhí)行操作(動(dòng)態(tài)模型)

48、,并且完成數(shù)據(jù)值的變化(功能模型)。面向?qū)ο罅Ⅲw模型立體模型對(duì)象模型動(dòng)態(tài)模型功能模型為了全面地理解問(wèn)題域,對(duì)任何大系統(tǒng)來(lái)說(shuō),上述3種模型都是必不可少的。用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件,在任何情況下,對(duì)象模型始終都是最重要、最基本、最核心的。在整個(gè)開(kāi)發(fā)過(guò)程中,3種模型一直都在發(fā)展、完善。在面向?qū)ο蠓治鲞^(guò)程中,構(gòu)造出完全獨(dú)立于實(shí)現(xiàn)的應(yīng)用域模型。在面向?qū)ο笤O(shè)計(jì)過(guò)程中,把求解域的結(jié)構(gòu)逐漸加入到模型中。在實(shí)現(xiàn)階段,把應(yīng)用域和求解域的結(jié)構(gòu)都編成程序代碼并進(jìn)行嚴(yán)格的測(cè)試驗(yàn)證。下面分別介紹上述3種模型。對(duì)象模型表示靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)的“數(shù)據(jù)”性質(zhì)。它是對(duì)模擬客觀世界實(shí)體的對(duì)象以及對(duì)象彼此間的關(guān)系的映射,描述了系統(tǒng)的

49、靜態(tài)結(jié)構(gòu)。 正如2.1節(jié)所述,面向?qū)ο蠓椒◤?qiáng)調(diào)圍繞對(duì)象而不是圍繞功能來(lái)構(gòu)造系統(tǒng)。 對(duì)象模型為建立動(dòng)態(tài)模型和功能模型,提供了實(shí)質(zhì)性的框架。2.4 對(duì)象模型在建立對(duì)象模型時(shí),我們的目標(biāo)是從客觀世界中提煉出對(duì)具體應(yīng)用有價(jià)值的概念。為了建立對(duì)象模型,需要定義一組圖形符號(hào),并且規(guī)定一組組織這些符號(hào)以表示特定語(yǔ)義的規(guī)則。也就是說(shuō),需要用適當(dāng)?shù)慕UZ(yǔ)言來(lái)表達(dá)模型,建模語(yǔ)言由記號(hào)(即模型中使用的符號(hào))和使用記號(hào)的規(guī)則(語(yǔ)法、語(yǔ)義和語(yǔ)用)組成?,F(xiàn)在一般采用統(tǒng)一建模語(yǔ)言(UML)作為OO開(kāi)發(fā)的建模手段。對(duì)象模型主要是類(lèi)圖和對(duì)象圖對(duì)象之間關(guān)系:關(guān)聯(lián)關(guān)系、繼承關(guān)系、聚合關(guān)系、依賴(lài)關(guān)系,通過(guò)類(lèi)圖體現(xiàn)出來(lái)。 統(tǒng)一建模的重

50、要性 一些著名的軟件工程專(zhuān)家在提出自己的面向?qū)ο蠓椒ǖ耐瑫r(shí),也提出了自己的建模語(yǔ)言。但是,面向?qū)ο蠓椒ǖ挠脩?hù)并不了解不同建模語(yǔ)言的優(yōu)缺點(diǎn),很難在實(shí)際工作中根據(jù)應(yīng)用的特點(diǎn)選擇合適的建模語(yǔ)言,而且不同建模語(yǔ)言之間存在的細(xì)微差別也極大地妨礙了用戶(hù)之間的交流。面向?qū)ο蠓椒òl(fā)展的現(xiàn)實(shí),要求在精心比較不同建模語(yǔ)言的優(yōu)缺點(diǎn)和總結(jié)面向?qū)ο蠹夹g(shù)應(yīng)用經(jīng)驗(yàn)的基礎(chǔ)上,把建模語(yǔ)言統(tǒng)一起來(lái)。曾對(duì)面向?qū)ο蠓椒▽W(xué)的發(fā)展做出過(guò)重要貢獻(xiàn)的Booch,Rumbaugh和Jacobson經(jīng)過(guò)合作研究,于1996年6月設(shè)計(jì)出統(tǒng)一建模語(yǔ)言UML 0.9。截止到1996年10月,在美國(guó)已有700多家公司表示支持采用UML作為建模語(yǔ)言,在1

51、996年年底,UML已經(jīng)穩(wěn)定地占領(lǐng)了面向?qū)ο蠹夹g(shù)市場(chǎng)的85%,成為事實(shí)上的工業(yè)標(biāo)準(zhǔn)。1997年11月,國(guó)際對(duì)象管理組織OMG批準(zhǔn)把UML 1.1作為基于面向?qū)ο蠹夹g(shù)的標(biāo)準(zhǔn)建模語(yǔ)言。通常,使用UML提供的類(lèi)圖來(lái)建立對(duì)象模型。在UML中術(shù)語(yǔ)“類(lèi)”的實(shí)際含義是,“一個(gè)類(lèi)及屬于該類(lèi)的對(duì)象”。1. 什么是動(dòng)態(tài)模型: 動(dòng)態(tài)模型表示瞬時(shí)的、行為化的系統(tǒng)的“控制”性質(zhì),它規(guī)定了對(duì)象模型中的對(duì)象的合法變化序列。一旦建立起對(duì)象模型之后,就需要考察對(duì)象的動(dòng)態(tài)行為。所有對(duì)象都具有自己的生命周期(或稱(chēng)為運(yùn)行周期)。對(duì)一個(gè)對(duì)象來(lái)說(shuō),生命周期由許多階段組成,在每個(gè)特定階段中,都有適合該對(duì)象的一組運(yùn)行規(guī)律和行為規(guī)則,用以規(guī)范

52、該對(duì)象的行為。生命周期中的階段也就是對(duì)象的狀態(tài)。2.5 動(dòng)態(tài)模型2.狀態(tài)概念: 所謂狀態(tài),是對(duì)對(duì)象屬性值的一種抽象。當(dāng)然,在定義狀態(tài)時(shí)應(yīng)該忽略那些不影響對(duì)象行為的屬性。各對(duì)象之間相互觸發(fā)(即作用)就形成了一系列的狀態(tài)變化。我們把一個(gè)觸發(fā)行為稱(chēng)作一個(gè)事件。對(duì)象對(duì)事件的響應(yīng),取決于接受該觸發(fā)的對(duì)象當(dāng)時(shí)所處的狀態(tài),響應(yīng)包括改變自己的狀態(tài)或者又形成一個(gè)新的觸發(fā)行為。狀態(tài)有持續(xù)性,它占用一段時(shí)間間隔。狀態(tài)與事件密不可分,一個(gè)事件分開(kāi)兩個(gè)狀態(tài),一個(gè)狀態(tài)隔開(kāi)兩個(gè)事件。事件表示時(shí)刻,狀態(tài)代表時(shí)間間隔。通常,用UML提供的狀態(tài)圖來(lái)描繪對(duì)象的狀態(tài)、觸發(fā)狀態(tài)轉(zhuǎn)換的事件以及對(duì)象的行為(對(duì)事件的響應(yīng))。每個(gè)類(lèi)的動(dòng)態(tài)行為

53、用一張狀態(tài)圖來(lái)描繪,各個(gè)類(lèi)的狀態(tài)圖通過(guò)共享事件合并起來(lái),從而構(gòu)成系統(tǒng)的動(dòng)態(tài)模型。也就是說(shuō),動(dòng)態(tài)模型是基于事件共享而互相關(guān)聯(lián)的一組狀態(tài)圖的集合。在UML中,動(dòng)態(tài)模型一般用下述圖描述:狀態(tài)圖時(shí)序圖協(xié)作圖活動(dòng)圖等功能模型表示變化的系統(tǒng)的“功能”性質(zhì),它指明了系統(tǒng)應(yīng)該“做什么”,因此更直接地反映了用戶(hù)對(duì)目標(biāo)系統(tǒng)的需求。通常,功能模型由一組數(shù)據(jù)流圖組成。在面向?qū)ο蠓椒▽W(xué)中,數(shù)據(jù)流圖遠(yuǎn)不如在結(jié)構(gòu)分析、設(shè)計(jì)方法中那樣重要。一般說(shuō)來(lái),與對(duì)象模型和動(dòng)態(tài)模型比較起來(lái),數(shù)據(jù)流圖并沒(méi)有增加新的信息,但是,建立功能模型有助于軟件開(kāi)發(fā)人員更深入地理解問(wèn)題域,改進(jìn)和完善自己的設(shè)計(jì)。因此,不能完全忽視功能模型的作用。2.6

54、功能模型UML提供的用例圖也是進(jìn)行需求分析和建立功能模型的強(qiáng)有力工具。在UML中把用用例圖建立起來(lái)的系統(tǒng)模型稱(chēng)為用例模型。用例模型描述的是外部行為者(actor)所理解的系統(tǒng)功能。用例模型的建立是系統(tǒng)開(kāi)發(fā)者和用戶(hù)反復(fù)討論的結(jié)果,它描述了開(kāi)發(fā)者和用戶(hù)對(duì)需求規(guī)格所達(dá)成的共識(shí)。在UML中,功能模型一般用:用況圖描述。面向?qū)ο蠼<夹g(shù)所建立的3種模型,分別從3個(gè)不同側(cè)面描述了所要開(kāi)發(fā)的系統(tǒng)。這3種模型相互補(bǔ)充、相互配合,使得我們對(duì)系統(tǒng)的認(rèn)識(shí)更加全面,構(gòu)成面向?qū)ο蟮牧Ⅲw模型。功能模型指明了系統(tǒng)應(yīng)該“做什么”;動(dòng)態(tài)模型明確規(guī)定了什么時(shí)候(即在何種狀態(tài)下接受了什么事件的觸發(fā))做;對(duì)象模型則定義了做事情的實(shí)體。在面向?qū)ο蠓椒▽W(xué)中,對(duì)象模型是最基本最重要的,它為其

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論