![軟件工程學(xué)-面向?qū)ο蠓椒▽W(xué)引論_第1頁](http://file4.renrendoc.com/view/0fc33b8ca0f157e723ab53fa73fbf425/0fc33b8ca0f157e723ab53fa73fbf4251.gif)
![軟件工程學(xué)-面向?qū)ο蠓椒▽W(xué)引論_第2頁](http://file4.renrendoc.com/view/0fc33b8ca0f157e723ab53fa73fbf425/0fc33b8ca0f157e723ab53fa73fbf4252.gif)
![軟件工程學(xué)-面向?qū)ο蠓椒▽W(xué)引論_第3頁](http://file4.renrendoc.com/view/0fc33b8ca0f157e723ab53fa73fbf425/0fc33b8ca0f157e723ab53fa73fbf4253.gif)
![軟件工程學(xué)-面向?qū)ο蠓椒▽W(xué)引論_第4頁](http://file4.renrendoc.com/view/0fc33b8ca0f157e723ab53fa73fbf425/0fc33b8ca0f157e723ab53fa73fbf4254.gif)
![軟件工程學(xué)-面向?qū)ο蠓椒▽W(xué)引論_第5頁](http://file4.renrendoc.com/view/0fc33b8ca0f157e723ab53fa73fbf425/0fc33b8ca0f157e723ab53fa73fbf4255.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第9章面向?qū)ο蠓椒▽W(xué)引論9.1面向?qū)ο蠓椒▽W(xué)概述9.2面向?qū)ο蟮母拍?.3面向?qū)ο蠼?.4對象模型9.5動態(tài)模型9.6功能模型9.73種模型之間的關(guān)系9.8小結(jié)習(xí)題傳統(tǒng)的軟件工程方法學(xué)曾經(jīng)給軟件產(chǎn)業(yè)帶來巨大進(jìn)步,部分地緩解了軟件危機(jī),使用這種方法學(xué)開發(fā)的許多中、小規(guī)模軟件項(xiàng)目都獲得了成功。但是,人們也注意到當(dāng)把這種方法學(xué)應(yīng)用于大型軟件產(chǎn)品的開發(fā)時,似乎很少取得成功。在20世紀(jì)60年代后期出現(xiàn)的面向?qū)ο缶幊陶Z言Simula-67中首次引入了類和對象的概念,自20世紀(jì)80年代中期起,人們開始注重面向?qū)ο蠓治龊驮O(shè)計的研究,逐步形成了面向?qū)ο蠓椒▽W(xué)。到了20世紀(jì)90年代,面向?qū)ο蠓椒▽W(xué)已經(jīng)成為人們在開發(fā)軟件時首選的范型。面向?qū)ο蠹夹g(shù)已成為當(dāng)前最好的軟件開發(fā)技術(shù)。面向?qū)ο蠓椒▽W(xué)的出發(fā)點(diǎn)和基本原則,是盡可能模擬人類習(xí)慣的思維方式,使開發(fā)軟件的方法與過程盡可能接近人類認(rèn)識世界解決問題的方法與過程,也就是使描述問題的問題空間(也稱為問題域)與實(shí)現(xiàn)解法的解空間(也稱為求解域)在結(jié)構(gòu)上盡可能一致。9.1面向?qū)ο蠓椒▽W(xué)概述
9.1.1面向?qū)ο蠓椒▽W(xué)的要點(diǎn)客觀世界的問題都是由客觀世界中的實(shí)體及實(shí)體相互間的關(guān)系構(gòu)成的。我們把客觀世界中的實(shí)體抽象為問題域中的對象(object)。因?yàn)樗鉀Q的問題具有特殊性,因此,對象是不固定的。一個雇員可以作為一個對象,一家公司也可以作為一個對象,到底應(yīng)該把什么抽象為對象,由所要解決的問題決定。從本質(zhì)上說,用計算機(jī)解決客觀世界的問題,是借助于某種程序設(shè)計語言的規(guī)定,對計算機(jī)中的實(shí)體施加某種處理,并用處理結(jié)果去映射解。我們把計算機(jī)中的實(shí)體稱為解空間對象。顯然,解空間對象取決于所使用的程序設(shè)計語言。例如,匯編語言提供的對象是存儲單元;面向過程的高級語言提供的對象,是各種預(yù)定義類型的變量、數(shù)組、記錄和文件等等。一旦提供了某種解空間對象,就隱含規(guī)定了允許對該類對象施加的操作。從動態(tài)觀點(diǎn)看,對對象施加的操作就是該對象的行為。在問題空間中,對象的行為是極其豐富多彩的,然而解空間中的對象的行為卻是非常簡單呆板的。因此,只有借助于十分復(fù)雜的算法,才能操縱解空間對象從而得到解。這就是人們常說的“語義斷層”,也是長期以來程序設(shè)計始終是一門學(xué)問的原因。通常,客觀世界中的實(shí)體既具有靜態(tài)的屬性又具有動態(tài)的行為。然而傳統(tǒng)語言提供的解空間對象實(shí)質(zhì)上卻僅是描述實(shí)體屬性的數(shù)據(jù),必須在程序中從外部對它施加操作,才能模擬它的行為。眾所周知,軟件系統(tǒng)本質(zhì)上是信息處理系統(tǒng)。數(shù)據(jù)和處理原本是密切相關(guān)的,把數(shù)據(jù)和處理人為地分離成兩個獨(dú)立的部分,會增加軟件開發(fā)的難度。與傳統(tǒng)方法相反,面向?qū)ο蠓椒ㄊ且环N以數(shù)據(jù)或信息為主線,把數(shù)據(jù)和處理相結(jié)合的方法。面向?qū)ο蠓椒ò褜ο笞鳛橛蓴?shù)據(jù)及可以施加在這些數(shù)據(jù)上的操作所構(gòu)成的統(tǒng)一體。對象與傳統(tǒng)的數(shù)據(jù)有本質(zhì)區(qū)別,它不是被動地等待外界對它施加操作,相反,它是進(jìn)行處理的主體。必須發(fā)消息請求對象主動地執(zhí)行它的某些操作,處理它的私有數(shù)據(jù),而不能從外界直接對它的私有數(shù)據(jù)進(jìn)行操作。面向?qū)ο蠓椒▽W(xué)所提供的“對象”概念,是讓軟件開發(fā)者自己定義或選取解空間對象,然后把軟件系統(tǒng)作為一系列離散的解空間對象的集合。應(yīng)該使這些解空間對象與問題空間對象盡可能一致。這些解空間對象彼此間通過發(fā)送消息而相互作用,從而得出問題的解。也就是說,面向?qū)ο蠓椒ㄊ且环N新的思維方法,它是把程序看作是相互協(xié)作而又彼此獨(dú)立的對象的集合。每個對象就像一個微型程序,有自己的數(shù)據(jù)、操作、功能和目的。這樣做就向著減少語義斷層的方向邁了一大步,在許多系統(tǒng)中解空間對象都可以直接模擬問題空間的對象,解空間與問題空間的結(jié)構(gòu)十分一致,因此,這樣的程序易于理解和維護(hù)。概括地說,面向?qū)ο蠓椒ň哂邢率?個要點(diǎn):(1)認(rèn)為客觀世界是由各種對象組成的,任何事物都是對象,復(fù)雜的對象可以由比較簡單的對象以某種方式組合而成。按照這種觀點(diǎn),可以認(rèn)為整個世界就是一個最復(fù)雜的對象。因此,面向?qū)ο蟮能浖到y(tǒng)是由對象組成的,軟件中的任何元素都是對象,復(fù)雜的軟件對象由比較簡單的對象組合而成。由此可見,面向?qū)ο蠓椒ㄓ脤ο蠓纸馊〈藗鹘y(tǒng)方法的功能分解。(2)把所有對象都劃分成各種對象類(簡稱為類,class),每個對象類都定義了一組數(shù)據(jù)和一組方法。數(shù)據(jù)用于表示對象的靜態(tài)屬性,是對象的狀態(tài)信息。因此,每當(dāng)建立該對象類的一個新實(shí)例時,就按照類中對數(shù)據(jù)的定義為這個新對象生成一組專用的數(shù)據(jù),以便描述該對象獨(dú)特的屬性值。類中定義的方法,是允許施加于該類對象上的操作,是該類所有對象共享的,并不需要為每個對象都復(fù)制操作的代碼。(3)按照子類(或稱為派生類)與父類(或稱為基類)的關(guān)系,把若干個對象類組成一個層次結(jié)構(gòu)的系統(tǒng)(也稱為類等級)。在這種層次結(jié)構(gòu)中,通常下層的派生類具有和上層的基類相同的特性(包括數(shù)據(jù)和方法),這種現(xiàn)象稱為繼承(inheritance)。但是,如果在派生類中對某些特性又做了重新描述,則在派生類中的這些特性將以新描述為準(zhǔn),也就是說,低層的特性將屏蔽高層的同名特性。(4)對象彼此之間僅能通過傳遞消息互相聯(lián)系。對象與傳統(tǒng)的數(shù)據(jù)有本質(zhì)區(qū)別,它不是被動地等待外界對它施加操作,相反,它是進(jìn)行處理的主體,必須發(fā)消息請求它執(zhí)行它的某個操作,處理它的私有數(shù)據(jù),而不能從外界直接對它的私有數(shù)據(jù)進(jìn)行操作。也就是說,一切局部于該對象的私有信息,都被封裝在該對象類的定義中,就好像裝在一個不透明的黑盒子中一樣,在外界是看不見的,更不能直接使用,這就是“封裝性”。面向?qū)ο蟮姆椒▽W(xué)可以用下列方程來概括:OO=objects+classes+inheritance+communicationwithmessages也就是說,面向?qū)ο缶褪羌仁褂脤ο笥质褂妙惡屠^承等機(jī)制,而且對象之間僅能通過傳遞消息實(shí)現(xiàn)彼此通信。如果僅使用對象和消息,則這種方法可以稱為基于對象的(object-based)方法,而不能稱為面向?qū)ο蟮姆椒ǎ蝗绻M(jìn)一步要求把所有對象都劃分為類,則這種方法可稱為基于類的(class-based)方法,但仍然不是面向?qū)ο蟮姆椒?。只有同時使用對象、類、繼承和消息的方法,才是真正面向?qū)ο蟮姆椒ā?.與人類習(xí)慣的思維方法一致傳統(tǒng)的程序設(shè)計技術(shù)是面向過程的設(shè)計方法,這種方法以算法為核心,把數(shù)據(jù)和過程作為相互獨(dú)立的部分,數(shù)據(jù)代表問題空間中的客體,程序代碼則用于處理這些數(shù)據(jù)。9.1.2面向?qū)ο蠓椒▽W(xué)的優(yōu)點(diǎn)把數(shù)據(jù)和代碼作為分離的實(shí)體,反映了計算機(jī)的觀點(diǎn),因?yàn)樵谟嬎銠C(jī)內(nèi)部數(shù)據(jù)和程序是分開存放的。但是,這樣做的時候總存在使用錯誤的數(shù)據(jù)調(diào)用正確的程序模塊,或使用正確的數(shù)據(jù)調(diào)用錯誤的程序模塊的危險。使數(shù)據(jù)和操作保持一致,是程序員的一個沉重負(fù)擔(dān),在多人分工合作開發(fā)一個大型軟件系統(tǒng)的過程中,如果負(fù)責(zé)設(shè)計數(shù)據(jù)結(jié)構(gòu)的人中途改變了某個數(shù)據(jù)的結(jié)構(gòu)而又沒有及時通知所有人員,則會發(fā)生許多不該發(fā)生的錯誤。傳統(tǒng)的程序設(shè)計技術(shù)忽略了數(shù)據(jù)和操作之間的內(nèi)在聯(lián)系,用這種方法所設(shè)計出來的軟件系統(tǒng)其解空間與問題空間并不一致,令人感到難于理解。實(shí)際上,用計算機(jī)解決的問題都是現(xiàn)實(shí)世界中的問題,這些問題無非由一些相互間存在一定聯(lián)系的事物所組成。每個具體的事物都具有行為和屬性兩方面的特征。因此,把描述事物靜態(tài)屬性的數(shù)據(jù)結(jié)構(gòu)和表示事物動態(tài)行為的操作放在一起構(gòu)成一個整體,才能完整、自然地表示客觀世界中的實(shí)體。面向?qū)ο蟮能浖夹g(shù)以對象(object)為核心,用這種技術(shù)開發(fā)出的軟件系統(tǒng)由對象組成。對象是對現(xiàn)實(shí)世界實(shí)體的正確抽象,它是由描述內(nèi)部狀態(tài)表示靜態(tài)屬性的數(shù)據(jù),以及可以對這些數(shù)據(jù)施加的操作(表示對象的動態(tài)行為),封裝在一起所構(gòu)成的統(tǒng)一體。對象之間通過傳遞消息互相聯(lián)系,以模擬現(xiàn)實(shí)世界中不同事物彼此之間的聯(lián)系。面向?qū)ο蟮脑O(shè)計方法與傳統(tǒng)的面向過程的方法有本質(zhì)不同,這種方法的基本原理是,使用現(xiàn)實(shí)世界的概念抽象地思考問題從而自然地解決問題。它強(qiáng)調(diào)模擬現(xiàn)實(shí)世界中的概念而不強(qiáng)調(diào)算法,它鼓勵開發(fā)者在軟件開發(fā)的絕大部分過程中都用應(yīng)用領(lǐng)域的概念去思考。在面向?qū)ο蟮脑O(shè)計方法中,計算機(jī)的觀點(diǎn)是不重要的,現(xiàn)實(shí)世界的模型才是最重要的。面向?qū)ο蟮能浖_發(fā)過程從始至終都圍繞著建立問題領(lǐng)域的對象模型來進(jìn)行:對問題領(lǐng)域進(jìn)行自然的分解,確定需要使用的對象和類,建立適當(dāng)?shù)念惖燃?,在對象之間傳遞消息實(shí)現(xiàn)必要的聯(lián)系,從而按照人們習(xí)慣的思維方式建立起問題領(lǐng)域的模型,模擬客觀世界。傳統(tǒng)的軟件開發(fā)方法可以用“瀑布”模型來描述,這種方法強(qiáng)調(diào)自頂向下按部就班地完成軟件開發(fā)工作。事實(shí)上,人們認(rèn)識客觀世界解決現(xiàn)實(shí)問題的過程,是一個漸進(jìn)的過程,人的認(rèn)識需要在繼承以前的有關(guān)知識的基礎(chǔ)上,經(jīng)過多次反復(fù)才能逐步深化。在人的認(rèn)識深化過程中,既包括了從一般到特殊的演繹思維過程,也包括了從特殊到一般的歸納思維過程。人在認(rèn)識和解決復(fù)雜問題時使用的最強(qiáng)有力的思維工具是抽象,也就是在處理復(fù)雜對象時,為了達(dá)到某個分析目的集中研究對象的與此目的有關(guān)的實(shí)質(zhì),忽略該對象的那些與此目的無關(guān)的部分。面向?qū)ο蠓椒▽W(xué)的基本原則是按照人類習(xí)慣的思維方法建立問題域的模型,開發(fā)出盡可能直觀、自然地表現(xiàn)求解方法的軟件系統(tǒng)。面向?qū)ο蟮能浖到y(tǒng)中廣泛使用的對象,是對客觀世界中實(shí)體的抽象。對象實(shí)際上是抽象數(shù)據(jù)類型的實(shí)例,提供了比較理想的數(shù)據(jù)抽象機(jī)制,同時又具有良好的過程抽象機(jī)制。對象類是對一組相似對象的抽象,類等級中上層的類是對下層類的抽象。因此,面向?qū)ο蟮沫h(huán)境提供了強(qiáng)有力的抽象機(jī)制,便于用戶在利用計算機(jī)軟件系統(tǒng)解決復(fù)雜問題時使用習(xí)慣的抽象思維工具。此外,面向?qū)ο蠓椒▽W(xué)中普遍進(jìn)行的對象分類過程,支持從特殊到一般的歸納思維過程;面向?qū)ο蠓椒▽W(xué)中通過建立類等級而獲得的繼承特性,支持從一般到特殊的演繹思維過程。面向?qū)ο蟮能浖夹g(shù)為開發(fā)者提供了隨著對某個應(yīng)用系統(tǒng)的認(rèn)識逐步深入和具體化的過程,而逐步設(shè)計和實(shí)現(xiàn)該系統(tǒng)的可能性,因?yàn)榭梢韵仍O(shè)計出由抽象類構(gòu)成的系統(tǒng)框架,隨著認(rèn)識深入和具體化再逐步派生出更具體的派生類。這樣的開發(fā)過程符合人們認(rèn)識客觀世界解決復(fù)雜問題時逐步深化的漸進(jìn)過程。2.穩(wěn)定性好傳統(tǒng)的軟件開發(fā)方法以算法為核心,開發(fā)過程基于功能分析和功能分解。用傳統(tǒng)方法所建立起來的軟件系統(tǒng)的結(jié)構(gòu)緊密依賴于系統(tǒng)所要完成的功能,當(dāng)功能需求發(fā)生變化時將引起軟件結(jié)構(gòu)的整體修改。事實(shí)上,用戶需求變化大部分是針對功能的,因此,這樣的軟件系統(tǒng)是不穩(wěn)定的。面向?qū)ο蠓椒ɑ跇?gòu)造問題領(lǐng)域的對象模型,以對象為中心構(gòu)造軟件系統(tǒng)。它的基本作法是用對象模擬問題領(lǐng)域中的實(shí)體,以對象間的聯(lián)系刻畫實(shí)體間的聯(lián)系。因?yàn)槊嫦驅(qū)ο蟮能浖到y(tǒng)的結(jié)構(gòu)是根據(jù)問題領(lǐng)域的模型建立起來的,而不是基于對系統(tǒng)應(yīng)完成的功能的分解,所以,當(dāng)對系統(tǒng)的功能需求變化時并不會引起軟件結(jié)構(gòu)的整體變化,往往僅需要作一些局部性的修改。例如,從已有類派生出一些新的子類以實(shí)現(xiàn)功能擴(kuò)充或修改,增加或刪除某些對象等??傊?,由于現(xiàn)實(shí)世界中的實(shí)體是相對穩(wěn)定的,因此,以對象為中心構(gòu)造的軟件系統(tǒng)也是比較穩(wěn)定的。3.可重用性好用已有的零部件裝配新的產(chǎn)品,是典型的重用技術(shù),例如,可以用已有的預(yù)制件建筑一幢結(jié)構(gòu)和外形都不同于從前的新大樓。重用是提高生產(chǎn)率的最主要的方法。傳統(tǒng)的軟件重用技術(shù)是利用標(biāo)準(zhǔn)函數(shù)庫,也就是試圖用標(biāo)準(zhǔn)函數(shù)庫中的函數(shù)作為“預(yù)制件”來建造新的軟件系統(tǒng)。但是,標(biāo)準(zhǔn)函數(shù)缺乏必要的“柔性”,不能適應(yīng)不同應(yīng)用場合的不同需要,并不是理想的可重用的軟件成分。實(shí)際的庫函數(shù)往往僅提供最基本、最常用的功能,在開發(fā)一個新的軟件系統(tǒng)時,通常多數(shù)函數(shù)是開發(fā)者自己編寫的,甚至絕大多數(shù)函數(shù)都是新編的。使用傳統(tǒng)方法學(xué)開發(fā)軟件時,人們認(rèn)為具有功能內(nèi)聚性的模塊是理想的模塊,也就是說,如果一個模塊完成一個且只完成一個相對獨(dú)立的子功能,那么這個模塊就是理想的可重用模塊。基于這種認(rèn)識,通常盡量把標(biāo)準(zhǔn)函數(shù)庫中的函數(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ù)要么修改這個模塊。事實(shí)上,離開了操作便無法處理數(shù)據(jù),而脫離了數(shù)據(jù)的操作也是毫無意義的,我們應(yīng)該對數(shù)據(jù)和操作同樣重視。在面向?qū)ο蠓椒ㄋ褂玫膶ο笾?,?shù)據(jù)和操作正是作為平等伙伴出現(xiàn)的。因此,對象具有很強(qiáng)的自含性,此外,對象固有的封裝性和信息隱藏機(jī)制,使得對象的內(nèi)部實(shí)現(xiàn)與外界隔離,具有較強(qiáng)的獨(dú)立性。由此可見,對象是比較理想的模塊和可重用的軟件成分。面向?qū)ο蟮能浖夹g(shù)在利用可重用的軟件成分構(gòu)造新的軟件系統(tǒng)時,有很大的靈活性。有兩種方法可以重復(fù)使用一個對象類:一種方法是創(chuàng)建該類的實(shí)例,從而直接使用它;另一種方法是從它派生出一個滿足當(dāng)前需要的新類。繼承性機(jī)制使得子類不僅可以重用其父類的數(shù)據(jù)結(jié)構(gòu)和程序代碼,而且可以在父類代碼的基礎(chǔ)上方便地修改和擴(kuò)充,這種修改并不影響對原有類的使用。由于可以像使用集成電路(IC)構(gòu)造計算機(jī)硬件那樣,比較方便地重用對象類來構(gòu)造軟件系統(tǒng),因此,有人把對象類稱為“軟件IC”。4.較易開發(fā)大型軟件產(chǎn)品在開發(fā)大型軟件產(chǎn)品時,組織開發(fā)人員的方法不恰當(dāng)往往是出現(xiàn)問題的主要原因。用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件時,構(gòu)成軟件系統(tǒng)的每個對象就像一個微型程序,有自己的數(shù)據(jù)、操作、功能和用途,因此,可以把一個大型軟件產(chǎn)品分解成一系列本質(zhì)上相互獨(dú)立的小產(chǎn)品來處理,這就不僅降低了開發(fā)的技術(shù)難度,而且也使得對開發(fā)工作的管理變得容易多了。這就是為什么對于大型軟件產(chǎn)品來說,面向?qū)ο蠓缎蛢?yōu)于結(jié)構(gòu)化范型的原因之一。5.可維護(hù)性好用傳統(tǒng)方法和面向過程語言開發(fā)出來的軟件很難維護(hù),是長期困擾人們的一個嚴(yán)重問題,是軟件危機(jī)的突出表現(xiàn)。由于下述因素的存在,使得用面向?qū)ο蠓椒ㄋ_發(fā)的軟件可維護(hù)性好:(1)面向?qū)ο蟮能浖€(wěn)定性比較好。如前所述,當(dāng)對軟件的功能或性能的要求發(fā)生變化時,通常不會引起軟件的整體變化,往往只需對局部作一些修改。由于對軟件所需做的改動較小且限于局部,自然比較容易實(shí)現(xiàn)。(2)面向?qū)ο蟮能浖容^容易修改。如前所述,類是理想的模塊機(jī)制,它的獨(dú)立性好,修改一個類通常很少會牽扯到其他類。如果僅修改一個類的內(nèi)部實(shí)現(xiàn)部分(私有數(shù)據(jù)成員或成員函數(shù)的算法),而不修改該類的對外接口,則可以完全不影響軟件的其他部分。面向?qū)ο筌浖夹g(shù)特有的繼承機(jī)制,使得對軟件的修改和擴(kuò)充比較容易實(shí)現(xiàn),通常只須從已有類派生出一些新類,無須修改軟件原有成分。面向?qū)ο筌浖夹g(shù)的多態(tài)性機(jī)制(見9.2.2節(jié)),使得當(dāng)擴(kuò)充軟件功能時對原有代碼所需作的修改進(jìn)一步減少,需要增加的新代碼也比較少。(3)面向?qū)ο蟮能浖容^容易理解。在維護(hù)已有軟件的時候,首先需要對原有軟件與此次修改有關(guān)的部分有深入理解,才能正確地完成維護(hù)工作。傳統(tǒng)軟件之所以難于維護(hù),在很大程度上是因?yàn)樾薷乃婕暗牟糠址稚⒃谲浖鱾€地方,需要了解的面很廣,內(nèi)容很多,而且傳統(tǒng)軟件的解空間與問題空間的結(jié)構(gòu)很不一致,更增加了理解原有軟件的難度和工作量。面向?qū)ο蟮能浖夹g(shù)符合人們習(xí)慣的思維方式,用這種方法所建立的軟件系統(tǒng)的結(jié)構(gòu)與問題空間的結(jié)構(gòu)基本一致。因此,面向?qū)ο蟮能浖到y(tǒng)比較容易理解。對面向?qū)ο筌浖到y(tǒng)所做的修改和擴(kuò)充,通常通過在原有類的基礎(chǔ)上派生出一些新類來實(shí)現(xiàn)。由于對象類有很強(qiáng)的獨(dú)立性,當(dāng)派生新類的時候通常不需要詳細(xì)了解基類中操作的實(shí)現(xiàn)算法。因此,了解原有系統(tǒng)的工作量可以大幅度下降。(4)易于測試和調(diào)試。為了保證軟件質(zhì)量,對軟件進(jìn)行維護(hù)之后必須進(jìn)行必要的測試,以確保要求修改或擴(kuò)充的功能按照要求正確地實(shí)現(xiàn)了,而且沒有影響到軟件不該修改的部分。如果測試過程中發(fā)現(xiàn)了錯誤,還必須通過調(diào)試改正過來。顯然,軟件是否易于測試和調(diào)試,是影響軟件可維護(hù)性的一個重要因素。對面向?qū)ο蟮能浖M(jìn)行維護(hù),主要通過從已有類派生出一些新類來實(shí)現(xiàn)。因此,維護(hù)后的測試和調(diào)試工作也主要圍繞這些新派生出來的類進(jìn)行。類是獨(dú)立性很強(qiáng)的模塊,向類的實(shí)例發(fā)消息即可運(yùn)行它,觀察它是否能正確地完成要求它做的工作,對類的測試通常比較容易實(shí)現(xiàn),如果發(fā)現(xiàn)錯誤也往往集中在類的內(nèi)部,比較容易調(diào)試。迭代是軟件開發(fā)過程中普遍存在的一種內(nèi)在屬性。經(jīng)驗(yàn)表明,軟件過程各個階段之間的迭代或一個階段內(nèi)各個工作步驟之間的迭代,在面向?qū)ο蠓缎椭斜仍诮Y(jié)構(gòu)化范型中更常見。9.1.3噴泉模型一般說來,使用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件時,工作重點(diǎn)應(yīng)該放在生命周期中的分析階段。這種方法在開發(fā)的早期階段定義了一系列面向問題的對象,并且在整個開發(fā)過程中不斷充實(shí)和擴(kuò)充這些對象。由于在整個開發(fā)過程中都使用統(tǒng)一的軟件概念“對象”,所有其他概念(例如功能、關(guān)系、事件等)都是圍繞對象組成的,目的是保證分析工作中得到的信息不會丟失或改變,因此,對生命周期各階段的區(qū)分自然就不重要、不明顯了。分析階段得到的對象模型也適用于設(shè)計階段和實(shí)現(xiàn)階段。由于各階段都使用統(tǒng)一的概念和表示符號,因此,整個開發(fā)過程都是吻合一致的,或者說是“無縫”連接的,這自然就很容易實(shí)現(xiàn)各個開發(fā)步驟的多次反復(fù)迭代,達(dá)到認(rèn)識的逐步深化。每次反復(fù)都會增加或明確一些目標(biāo)系統(tǒng)的性質(zhì),但卻不是對先前工作結(jié)果的本質(zhì)性改動,這樣就減少了不一致性,降低了出錯的可能性。圖9.1所示的噴泉模型,是典型的面向?qū)ο蟮能浖^程模型。圖9.1噴泉模型“噴泉”這個詞體現(xiàn)了面向?qū)ο筌浖_發(fā)過程迭代和無縫的特性。圖中代表不同階段的圓圈相互重疊,這明確表示兩個活動之間存在交迭;而面向?qū)ο蠓椒ㄔ诟拍詈捅硎痉椒ㄉ系囊恢滦?,保證了在各項(xiàng)開發(fā)活動之間的無縫過渡,事實(shí)上,用面向?qū)ο蠓椒ㄩ_發(fā)軟件時,在分析、設(shè)計和編碼等項(xiàng)開發(fā)活動之間并不存在明顯的邊界。圖中在一個階段內(nèi)的向下箭頭代表該階段內(nèi)的迭代(或求精)。圖中較小的圓圈代表維護(hù),圓圈較小象征著采用了面向?qū)ο蠓缎椭缶S護(hù)時間縮短了。為避免使用噴泉模型開發(fā)軟件時開發(fā)過程過分無序,應(yīng)該把一個線性過程(例如,快速原型模型或圖9.1中的中心垂線)作為總目標(biāo)。但是,同時也應(yīng)該記住,面向?qū)ο蠓缎捅旧硪蠼?jīng)常對開發(fā)活動進(jìn)行迭代或求精。在應(yīng)用領(lǐng)域中有意義的、與所要解決的問題有關(guān)系的任何事物都可以作為對象,它既可以是具體的物理實(shí)體的抽象,也可以是人為的概念,或者是任何有明確邊界和意義的東西。,對象是對問題域中某個實(shí)體的抽象,設(shè)立某個對象就反映了軟件系統(tǒng)具有保存有關(guān)它的信息并且與它進(jìn)行交互的能力。9.2面向?qū)ο蟮母拍?/p>
9.2.1對象由于客觀世界中的實(shí)體通常都既具有靜態(tài)的屬性,又具有動態(tài)的行為,因此,面向?qū)ο蠓椒▽W(xué)中的對象是由描述該對象屬性的數(shù)據(jù)以及可以對這些數(shù)據(jù)施加的所有操作封裝在一起構(gòu)成的統(tǒng)一體。對象可以作的操作表示它的動態(tài)行為,在面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計中,通常把對象的操作稱為服務(wù)或方法。1.對象的形象表示為有助于讀者理解對象的概念,圖9.2形象地描繪了具有3個操作的對象。圖9.2對象的形象表示一個對象很像一臺錄音機(jī)。當(dāng)在軟件中使用一個對象的時候,只能通過對象與外界的界面來操作它。對象與外界的界面也就是該對象向公眾開放的操作。使用對象向公眾開放的操作就好像使用錄音機(jī)的按鍵,只須知道該操作的名字(好像錄音機(jī)的按鍵名)和所需要的參數(shù)(提供附加信息或設(shè)置狀態(tài),根本無須知道實(shí)現(xiàn)這些操作的方法。事實(shí)上,實(shí)現(xiàn)對象操作的代碼和數(shù)據(jù)是隱藏在對象內(nèi)部的,一個對象好像是一個黑盒子,表示它內(nèi)部狀態(tài)的數(shù)據(jù)和實(shí)現(xiàn)各個操作的代碼及局部數(shù)據(jù),都被封裝在這個黑盒子內(nèi)部,在外面是看不見的,更不能從外面去訪問或修改這些數(shù)據(jù)或代碼。使用對象時只需知道它向外界提供的接口形式而無須知道它的內(nèi)部實(shí)現(xiàn)算法,不僅使得對象的使用變得非常簡單、方便,而且具有很高的安全性和可靠性。對象內(nèi)部的數(shù)據(jù)只能通過對象的公有方法(如C++的公有成員函數(shù))來訪問或處理,這就保證了對這些數(shù)據(jù)的訪問或處理,在任何時候都是使用統(tǒng)一的方法進(jìn)行的,不會像使用傳統(tǒng)的面向過程的程序設(shè)計語言那樣,由于每個使用者各自編寫自己的處理某個全局?jǐn)?shù)據(jù)的過程而發(fā)生錯誤。當(dāng)對象處于不同狀態(tài)時,做同一個操作所得到的效果也是不同的。2.對象的定義目前,對對象所下的定義并不完全統(tǒng)一,人們從不同角度給出對象的不同定義。這些定義雖然形式不同,但基本含義是相同的。下面給出對象的幾個定義。(1)定義1:對象是具有相同狀態(tài)的一組操作的集合。這個定義主要是從面向?qū)ο蟪绦蛟O(shè)計的角度看“對象”。(2)定義2:對象是對問題域中某個東西的抽象,這種抽象反映了系統(tǒng)保存有關(guān)這個東西的信息或與它交互的能力。也就是說,對象是對屬性值和操作的封裝。這個定義著重從信息模擬的角度看待“對象”。(3)定義3:對象∷=〈ID,MS,DS,MI〉。其中,ID是對象的標(biāo)識或名字,MS是對象中的操作集合,DS是對象的數(shù)據(jù)結(jié)構(gòu),MI是對象受理的消息名集合(即對外接口)。這個定義是一個形式化的定義??傊?,對象是封裝了數(shù)據(jù)結(jié)構(gòu)及可以施加在這些數(shù)據(jù)結(jié)構(gòu)上的操作的封裝體,這個封裝體有可以惟一地標(biāo)識它的名字,而且向外界提供一組服務(wù)(即公有的操作)。對象中的數(shù)據(jù)表示對象的狀態(tài),一個對象的狀態(tài)只能由該對象的操作來改變。每當(dāng)需要改變對象的狀態(tài)時,只能由其他對象向該對象發(fā)送消息。對象響應(yīng)消息時,按照消息模式找出與之匹配的方法,并執(zhí)行該方法。從動態(tài)角度或?qū)ο蟮膶?shí)現(xiàn)機(jī)制來看,對象是一臺自動機(jī)。具有內(nèi)部狀態(tài)S,操作fi(i=1,2,…,n),且與操作fi對應(yīng)的狀態(tài)轉(zhuǎn)換函數(shù)為gi(i=1,2,…,n)的一個對象,可以用圖9.3所示的自動機(jī)來模擬。圖9.3用自動機(jī)模擬對象3.對象的特點(diǎn)(1)以數(shù)據(jù)為中心。操作圍繞對其數(shù)據(jù)所需要做的處理來設(shè)置,不設(shè)置與這些數(shù)據(jù)無關(guān)的操作,而且操作的結(jié)果往往與當(dāng)時所處的狀態(tài)(數(shù)據(jù)的值)有關(guān)。(2)對象是主動的。它與傳統(tǒng)的數(shù)據(jù)有本質(zhì)不同,不是被動地等待對它進(jìn)行處理,相反,它是進(jìn)行處理的主體。為了完成某個操作,不能從外部直接加工它的私有數(shù)據(jù),而是必須通過它的公有接口向?qū)ο蟀l(fā)消息,請求它執(zhí)行它的某個操作,處理它的私有數(shù)據(jù)。(3)實(shí)現(xiàn)了數(shù)據(jù)封裝。對象好像是一只黑盒子,它的私有數(shù)據(jù)完全被封裝在盒子內(nèi)部,對外是隱藏的、不可見的,對私有數(shù)據(jù)的訪問或處理只能通過公有的操作進(jìn)行。為了使用對象內(nèi)部的私有數(shù)據(jù),只需知道數(shù)據(jù)的取值范圍(值域)和可以對該數(shù)據(jù)施加的操作(即,對象提供了哪些處理或訪問數(shù)據(jù)的公有方法),根本無須知道數(shù)據(jù)的具體結(jié)構(gòu)以及實(shí)現(xiàn)操作的算法。這也就是抽象數(shù)據(jù)類型的概念。因此,一個對象類型也可以看作是一種抽象數(shù)據(jù)類型。(4)本質(zhì)上具有并行性。對象是描述其內(nèi)部狀態(tài)的數(shù)據(jù)及可以對這些數(shù)據(jù)施加的全部操作的集合。不同對象各自獨(dú)立地處理自身的數(shù)據(jù),彼此通過發(fā)消息傳遞信息完成通信。因此,本質(zhì)上具有并行工作的屬性。(5)模塊獨(dú)立性好。對象是面向?qū)ο蟮能浖幕灸K,為了充分發(fā)揮模塊化簡化開發(fā)工作的優(yōu)點(diǎn),希望模塊的獨(dú)立性強(qiáng)。具體來說,也就是要求模塊的內(nèi)聚性強(qiáng),耦合性弱。如前所述,對象是由數(shù)據(jù)及可以對這些數(shù)據(jù)施加的操作所組成的統(tǒng)一體,而且對象是以數(shù)據(jù)為中心的,操作圍繞對其數(shù)據(jù)所需做的處理來設(shè)置,沒有無關(guān)的操作。因此,對象內(nèi)部各種元素彼此結(jié)合得很緊密,內(nèi)聚性相當(dāng)強(qiáng)。由于完成對象功能所需要的元素(數(shù)據(jù)和方法)基本上都被封裝在對象內(nèi)部,它與外界的聯(lián)系自然就比較少,因此,對象之間的耦合通常比較松。1.類(class)現(xiàn)實(shí)世界中存在的客觀事物有些是彼此相似的,例如,張三、李四、王五……雖說每個人職業(yè)、性格、愛好、特長等等各有不同,但是,他們的基本特征是相似的,都是黃皮膚、黑頭發(fā)、黑眼睛,于是人們把他們統(tǒng)稱為“中國人”。人類習(xí)慣于把有相似特征的事物歸為一類,分類是人類認(rèn)識客觀世界的基本方法。9.2.2其他概念在面向?qū)ο蟮能浖夹g(shù)中,“類”就是對具有相同數(shù)據(jù)和相同操作的一組相似對象的定義,也就是說,類是對具有相同屬性和行為的一個或多個對象的描述,通常在這種描述中也包括對怎樣創(chuàng)建該類的新對象的說明。以上先詳細(xì)地闡述了對象的定義,然后在此基礎(chǔ)上定義了類。也可以先定義類再定義對象,例如,可以像下面這樣定義類和對象:類是支持繼承的抽象數(shù)據(jù)類型,而對象就是類的實(shí)例。2.實(shí)例(instance)實(shí)例就是由某個特定的類所描述的一個具體的對象。類是對具有相同屬性和行為的一組相似的對象的抽象,類在現(xiàn)實(shí)世界中并不能真正存在。實(shí)際上類是建立對象時使用的“樣板”,按照這個樣板所建立的一個個具體的對象,就是類的實(shí)際例子,通常稱為實(shí)例。當(dāng)使用“對象”這個術(shù)語時,既可以指一個具體的對象,也可以泛指一般的對象,但是,當(dāng)使用“實(shí)例”這個術(shù)語時,必然是指一個具體的對象。3.消息(message)消息就是要求某個對象執(zhí)行在定義它的那個類中所定義的某個操作的規(guī)格說明。通常,一個消息由下述3部分組成:接收消息的對象;消息選擇符(也稱為消息名);零個或多個變元。4.方法(method)方法就是對象所能執(zhí)行的操作,也就是類中所定義的服務(wù)。方法描述了對象執(zhí)行操作的算法,響應(yīng)消息的方法。在C++語言中把方法稱為成員函數(shù)。5.屬性(attribute)屬性就是類中所定義的數(shù)據(jù),它是對客觀世界實(shí)體所具有的性質(zhì)的抽象。類的每個實(shí)例都有自己特有的屬性值。在C++語言中把屬性稱為數(shù)據(jù)成員6.封裝(encapsulation)從字面上理解,所謂封裝就是把某個事物包起來,使外界不知道該事物的具體內(nèi)容。在面向?qū)ο蟮某绦蛑校褦?shù)據(jù)和實(shí)現(xiàn)操作的代碼集中起來放在對象內(nèi)部。一個對象好像是一個不透明的黑盒子,表示對象狀態(tài)的數(shù)據(jù)和實(shí)現(xiàn)操作的代碼與局部數(shù)據(jù),都被封裝在黑盒子里面,從外面是看不見的,更不能從外面直接訪問或修改這些數(shù)據(jù)和代碼。使用一個對象的時候,只需知道它向外界提供的接口形式,無須知道它的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)和實(shí)現(xiàn)操作的算法。綜上所述,對象具有封裝性的條件如下:(1)有一個清晰的邊界。所有私有數(shù)據(jù)和實(shí)現(xiàn)操作的代碼都被封裝在這個邊界內(nèi),從外面看不見更不能直接訪問。(2)有確定的接口(即協(xié)議)。這些接口就是對象可以接受的消息,只能通過向?qū)ο蟀l(fā)送消息來使用它。(3)受保護(hù)的內(nèi)部實(shí)現(xiàn)。實(shí)現(xiàn)對象功能的細(xì)節(jié)(私有數(shù)據(jù)和代碼)不能在定義該對象的類的范圍外訪問。封裝也就是信息隱藏,通過封裝對外界隱藏了對象的實(shí)現(xiàn)細(xì)節(jié)。對象類實(shí)質(zhì)上是抽象數(shù)據(jù)類型。類把數(shù)據(jù)說明和操作說明與數(shù)據(jù)表達(dá)和操作實(shí)現(xiàn)分離開了,使用者只需知道它的說明(值域及可對數(shù)據(jù)施加的操作),就可以使用它。7.繼承(inheritance)廣義地說,繼承是指能夠直接獲得已有的性質(zhì)和特征,而不必重復(fù)定義它們。在面向?qū)ο蟮能浖夹g(shù)中,繼承是子類自動地共享基類中定義的數(shù)據(jù)和方法的機(jī)制。面向?qū)ο筌浖夹g(shù)的許多強(qiáng)有力的功能和突出的優(yōu)點(diǎn),都來源于把類組成一個層次結(jié)構(gòu)的系統(tǒng)(類等級):一個類的上層可以有父類,下層可以有子類。這種層次結(jié)構(gòu)系統(tǒng)的一個重要性質(zhì)是繼承性,一個類直接繼承其父類的全部描述(數(shù)據(jù)和操作)。為了更深入、具體地理解繼承性的含義,圖9.4描繪了實(shí)現(xiàn)繼承機(jī)制的原理。繼承具有傳遞性。因此,一個類實(shí)際上繼承了它所在的類等級中在它上層的全部基類的所有描述,也就是說,屬于某類的對象除了具有該類所描述的性質(zhì)外,還具有類等級中該類上層全部基類描述的一切性質(zhì)。圖9.4實(shí)現(xiàn)繼承機(jī)制的原理當(dāng)一個類只允許有一個父類時,也就是說,當(dāng)類等級為樹形結(jié)構(gòu)時,類的繼承是單繼承;當(dāng)允許一個類有多個父類時,類的繼承是多重繼承。多重繼承的類可以組合多個父類的性質(zhì)構(gòu)成所需要的性質(zhì),因此功能更強(qiáng)、使用更方便;但是,使用多重繼承時要注意避免二義性。繼承性使得相似的對象可以共享程序代碼和數(shù)據(jù)結(jié)構(gòu),從而大大減少了程序中的冗余信息。在程序執(zhí)行期間,對對象某一性質(zhì)的查找是從該對象類在類等級中所在的層次開始,沿類等級逐層向上進(jìn)行的,并把第一個被找到的性質(zhì)作為所要的性質(zhì)。因此,低層的性質(zhì)將屏蔽高層的同名性質(zhì)。使用從原有類派生出新的子類的辦法,使得對軟件的修改變得比過去容易得多了。當(dāng)需要擴(kuò)充原有的功能時,派生類的方法可以調(diào)用其基類的方法,并在此基礎(chǔ)上增加必要的程序代碼;當(dāng)需要完全改變原有操作的算法時,可以在派生類中實(shí)現(xiàn)一個與基類方法同名而算法不同的方法;當(dāng)需要增加新的功能時,可以在派生類中實(shí)現(xiàn)一個新的方法。繼承性使得用戶在開發(fā)新的應(yīng)用系統(tǒng)時不必完全從零開始,可以繼承原有的相似系統(tǒng)的功能或者從類庫中選取需要的類,再派生出新的類以實(shí)現(xiàn)所需要的功能。有了繼承性以后,還可以用把已有的一般性的解加以具體化的辦法,來達(dá)到軟件重用的目的:首先,使用抽象的類開發(fā)出一般性問題的解,然后,在派生類中增加少量代碼使一般性的解具體化,從而開發(fā)出符合特定應(yīng)用需要的具體解。8.多態(tài)性(polymorphism)多態(tài)性一詞來源于希臘語,意思是“有許多形態(tài)”。在面向?qū)ο蟮能浖夹g(shù)中,多態(tài)性是指子類對象可以像父類對象那樣使用,同樣的消息既可以發(fā)送給父類對象也可以發(fā)送給子類對象。也就是說,在類等級的不同層次中可以共享(公用)一個行為(方法)的名字,然而不同層次中的每個類卻各自按自己的需要來實(shí)現(xiàn)這個行為。當(dāng)對象接收到發(fā)送給它的消息時,根據(jù)該對象所屬于的類動態(tài)選用在該類中定義的實(shí)現(xiàn)算法。在C++語言中,多態(tài)性是通過虛函數(shù)來實(shí)現(xiàn)的。在類等級不同層次中可以說明名字、參數(shù)特征和返回值類型都相同的虛擬成員函數(shù),而不同層次的類中的虛函數(shù)實(shí)現(xiàn)算法各不相同。虛函數(shù)機(jī)制使得程序員能在一個類等級中使用相同函數(shù)的多個不同版本,在運(yùn)行時刻才根據(jù)接收消息的對象所屬于的類,決定到底執(zhí)行哪個特定的版本,這稱為動態(tài)聯(lián)編,也叫滯后聯(lián)編。多態(tài)性機(jī)制不僅增加了面向?qū)ο筌浖到y(tǒng)的靈活性,進(jìn)一步減少了信息冗余,而且顯著提高了軟件的可重用性和可擴(kuò)充性。當(dāng)擴(kuò)充系統(tǒng)功能增加新的實(shí)體類型時,只須派生出與新實(shí)體類相應(yīng)的新的子類,并在新派生出的子類中定義符合該類需要的虛函數(shù),完全無須修改原有的程序代碼,甚至不需要重新編譯原有的程序(僅需編譯新派生類的源程序,再與原有程序的.OBJ文件連接)。9.重載(overloading)有兩種重載:函數(shù)重載是指在同一作用域內(nèi)的若干個參數(shù)特征不同的函數(shù)可以使用相同的函數(shù)名字;運(yùn)算符重載是指同一個運(yùn)算符可以施加于不同類型的操作數(shù)上面。當(dāng)然,當(dāng)參數(shù)特征不同或被操作數(shù)的類型不同時,實(shí)現(xiàn)函數(shù)的算法或運(yùn)算符的語義是不相同的。在C++語言中函數(shù)重載是通過靜態(tài)聯(lián)編(也叫先前聯(lián)編)實(shí)現(xiàn)的,也就是在編譯時根據(jù)函數(shù)變元的個數(shù)和類型,決定到底使用函數(shù)的哪個實(shí)現(xiàn)代碼;對于重載的運(yùn)算符,同樣是在編譯時根據(jù)被操作數(shù)的類型,決定使用該算符的哪種語義。重載進(jìn)一步提高了面向?qū)ο笙到y(tǒng)的靈活性和可讀性。為了更好地理解問題,人們常常采用建立問題模型的方法。所謂模型,就是為了理解事物而對事物作出的一種抽象,是對事物的一種無歧義的書面描述。通常,模型由一組圖示符號和組織這些符號的規(guī)則組成,利用它們來定義和描述問題域中的術(shù)語和概念。更進(jìn)一步講,模型是一種思考工具,利用這種工具可以把知識規(guī)范地表示出來。模型可以幫助我們思考問題、定義術(shù)語、在選擇術(shù)語時作出適當(dāng)?shù)募僭O(shè),并且可以幫助我們保持定義和假設(shè)的一致性。9.3面向?qū)ο蠼榱碎_發(fā)復(fù)雜的軟件系統(tǒng),系統(tǒng)分析員應(yīng)該從不同角度抽象出目標(biāo)系統(tǒng)的特性,使用精確的表示方法構(gòu)造系統(tǒng)的模型,驗(yàn)證模型是否滿足用戶對目標(biāo)系統(tǒng)的需求,并在設(shè)計過程中逐漸把和實(shí)現(xiàn)有關(guān)的細(xì)節(jié)加進(jìn)模型中,直至最終用程序?qū)崿F(xiàn)模型。對于那些因過分復(fù)雜而不能直接理解的系統(tǒng),特別需要建立模型,建模的目的主要是為了減少復(fù)雜性。人的頭腦每次只能處理一定數(shù)量的信息,模型通過把系統(tǒng)的重要部分分解成人的頭腦一次能處理的若干個子部分,從而減少系統(tǒng)的復(fù)雜程度。在對目標(biāo)系統(tǒng)進(jìn)行分析的初始階段,面對大量模糊的、涉及眾多專業(yè)領(lǐng)域的、錯綜復(fù)雜的信息,系統(tǒng)分析員往往感到無從下手。模型提供了組織大量信息的一種有效機(jī)制。一旦建立起模型之后,這個模型就要經(jīng)受用戶和各個領(lǐng)域?qū)<业膰?yán)格審查。由于模型的規(guī)范化和系統(tǒng)化,因此比較容易暴露出系統(tǒng)分析員對目標(biāo)系統(tǒng)認(rèn)識的片面性和不一致性。通過審查,往往會發(fā)現(xiàn)許多錯誤,發(fā)現(xiàn)錯誤是正?,F(xiàn)象,這些錯誤可以在成為目標(biāo)系統(tǒng)中的錯誤之前,就被預(yù)先清除掉。通常,用戶和領(lǐng)域?qū)<铱梢酝ㄟ^快速建立的原型親身體驗(yàn),從而對系統(tǒng)模型進(jìn)行更有效的審查。模型常常會經(jīng)過多次必要的修改,通過不斷改正錯誤的或不全面的認(rèn)識,最終使軟件開發(fā)人員對問題有了透徹的理解,從而為后續(xù)的開發(fā)工作奠定了堅實(shí)基礎(chǔ)。用面向?qū)ο蠓椒ǔ晒Φ亻_發(fā)軟件的關(guān)鍵,同樣是對問題域的理解。面向?qū)ο蠓椒ㄗ罨镜脑瓌t,是按照人們習(xí)慣的思維方式,用面向?qū)ο笥^點(diǎn)建立問題域的模型,開發(fā)出盡可能自然地表現(xiàn)求解方法的軟件。用面向?qū)ο蠓椒ㄩ_發(fā)軟件,通常需要建立3種形式的模型,它們分別是描述系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的對象模型,描述系統(tǒng)控制結(jié)構(gòu)的動態(tài)模型和描述系統(tǒng)功能的功能模型。這3種模型都涉及到數(shù)據(jù)、控制和操作等共同的概念,只不過每種模型描述的側(cè)重點(diǎn)不同。這3種模型從3個不同但又密切相關(guān)的角度模擬目標(biāo)系統(tǒng),它們各自從不同側(cè)面反映了系統(tǒng)的實(shí)質(zhì)性內(nèi)容,綜合起來則全面地反映了對目標(biāo)系統(tǒng)的需求。一個典型的軟件系統(tǒng)組合了上述3方面內(nèi)容:它使用數(shù)據(jù)結(jié)構(gòu)(對象模型),執(zhí)行操作(動態(tài)模型),并且完成數(shù)據(jù)值的變化(功能模型)。為了全面地理解問題域,對任何大系統(tǒng)來說,上述3種模型都是必不可少的。當(dāng)然,在不同的應(yīng)用問題中,這3種模型的相對重要程度會有所不同,但是,用面向?qū)ο蠓椒ㄩ_發(fā)軟件,在任何情況下,對象模型始終都是最重要、最基本、最核心的。在整個開發(fā)過程中,3種模型一直都在發(fā)展、完善。在面向?qū)ο蠓治鲞^程中,構(gòu)造出完全獨(dú)立于實(shí)現(xiàn)的應(yīng)用域模型;在面向?qū)ο笤O(shè)計過程中,把求解域的結(jié)構(gòu)逐漸加入到模型中;在實(shí)現(xiàn)階段,把應(yīng)用域和求解域的結(jié)構(gòu)都編成程序代碼并進(jìn)行嚴(yán)格的測試驗(yàn)證。下面分別介紹上述3種模型。對象模型表示靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)的“數(shù)據(jù)”性質(zhì)。它是對模擬客觀世界實(shí)體的對象以及對象彼此間的關(guān)系的映射,描述了系統(tǒng)的靜態(tài)結(jié)構(gòu)。正如9.1節(jié)所述,面向?qū)ο蠓椒◤?qiáng)調(diào)圍繞對象而不是圍繞功能來構(gòu)造系統(tǒng)。對象模型為建立動態(tài)模型和功能模型,提供了實(shí)質(zhì)性的框架。9.4對象模型在建立對象模型時,我們的目標(biāo)是從客觀世界中提煉出對具體應(yīng)用有價值的概念。為了建立對象模型,需要定義一組圖形符號,并且規(guī)定一組組織這些符號以表示特定語義的規(guī)則。也就是說,需要用適當(dāng)?shù)慕UZ言來表達(dá)模型,建模語言由記號(即模型中使用的符號)和使用記號的規(guī)則(語法、語義和語用)組成。一些著名的軟件工程專家在提出自己的面向?qū)ο蠓椒ǖ耐瑫r,也提出了自己的建模語言。但是,面向?qū)ο蠓椒ǖ挠脩舨⒉涣私獠煌UZ言的優(yōu)缺點(diǎn),很難在實(shí)際工作中根據(jù)應(yīng)用的特點(diǎn)選擇合適的建模語言,而且不同建模語言之間存在的細(xì)微差別也極大地妨礙了用戶之間的交流。面向?qū)ο蠓椒òl(fā)展的現(xiàn)實(shí),要求在精心比較不同建模語言的優(yōu)缺點(diǎn)和總結(jié)面向?qū)ο蠹夹g(shù)應(yīng)用經(jīng)驗(yàn)的基礎(chǔ)上,把建模語言統(tǒng)一起來。曾對面向?qū)ο蠓椒▽W(xué)的發(fā)展做出過重要貢獻(xiàn)的Booch,Rumbaugh和Jacobson經(jīng)過合作研究,于1996年6月設(shè)計出統(tǒng)一建模語言UML0.9。截止到1996年10月,在美國已有700多家公司表示支持采用UML作為建模語言,在1996年年底,UML已經(jīng)穩(wěn)定地占領(lǐng)了面向?qū)ο蠹夹g(shù)市場的85%,成為事實(shí)上的工業(yè)標(biāo)準(zhǔn)。1997年11月,國際對象管理組織OMG批準(zhǔn)把UML1.1作為基于面向?qū)ο蠹夹g(shù)的標(biāo)準(zhǔn)建模語言。通常,使用UML提供的類圖來建立對象模型。在UML中術(shù)語“類”的實(shí)際含義是,“一個類及屬于該類的對象”。下面簡要地介紹UML的類圖。類圖描述類及類與類之間的靜態(tài)關(guān)系。類圖是一種靜態(tài)模型,它是創(chuàng)建其他UML圖的基礎(chǔ)。一個系統(tǒng)可以由多張類圖來描述,一個類也可以出現(xiàn)在幾張類圖中。1.定義類UML中類的圖形符號為長方形,用兩條橫線把長方形分成上、中、下3個區(qū)域(下面兩個區(qū)域可省略),3個區(qū)域分別放類的名字、屬性和服務(wù),如圖9.5所示。9.4.1類圖的基本符號圖9.5表示類的圖類名是一類對象的名字。命名是否恰當(dāng)對系統(tǒng)的可理解性影響相當(dāng)大,因此,為類命名時應(yīng)該遵守以下幾條準(zhǔn)則:(1)使用標(biāo)準(zhǔn)術(shù)語。應(yīng)該使用在應(yīng)用領(lǐng)域中人們習(xí)慣的標(biāo)準(zhǔn)術(shù)語作為類名,不要隨意創(chuàng)造名字。例如,“交通信號燈”比“信號單元”這個名字好,“傳送帶”比“零件傳送設(shè)備”好。(2)使用具有確切含義的名詞。盡量使用能表示類的含義的日常用語作名字,不要使用空洞的或含義模糊的詞作名字。例如,“庫房”比“房屋”或“存物場所”更確切。(3)必要時用名詞短語作名字。為使名字的含義更準(zhǔn)確,必要時用形容詞加名詞或其他形式的名詞短語作名字。例如,“最小的領(lǐng)土單元”、“儲藏室”、“公司員工”等都是比較恰當(dāng)?shù)拿???傊?,名字?yīng)該是富于描述性的、簡潔的而且無二義性的。2.定義屬性UML描述屬性的語法格式如下:可見性屬性名:類型名=初值{性質(zhì)串}屬性的可見性(即可訪問性)通常有下述3種:公有的(public)、私有的(private)和保護(hù)的(protected),分別用加號(+)、減號(-)和井號(#)表示。如果未聲明可見性,則表示該屬性的可見性尚未定義。注意,沒有默認(rèn)的可見性。屬性名和類型名之間用冒號(:)分隔。類型名表示該屬性的數(shù)據(jù)類型,它可以是基本數(shù)據(jù)類型,也可以是用戶自定義的類型。在創(chuàng)建類的實(shí)例時應(yīng)給其屬性賦值,如果給某個屬性定義了初值,則該初值可作為創(chuàng)建實(shí)例時這個屬性的默認(rèn)值。類型名和初值之間用等號(=)隔開。用花括號括起來的性質(zhì)串明確地列出該屬性所有可能的取值。枚舉類型的屬性往往用性質(zhì)串列出可以選用的枚舉值,不同枚舉值之間用逗號分隔。也可以用性質(zhì)串說明屬性的其他性質(zhì),例如,約束說明{只讀}表明該屬性是只讀屬性。例如,“發(fā)貨單”類的屬性“管理員”,在UML類圖中像下面那樣描述:-管理員:String=“未定”類的屬性中還可以有一種能被該類所有對象共享的屬性,稱為類的作用域?qū)傩?,也稱為類變量。C++語言中的靜態(tài)數(shù)據(jù)成員就是這樣的屬性。類變量在類圖中表示為帶下劃線的屬性,例如,發(fā)貨單類的類變量“貨單數(shù)”,用來統(tǒng)計發(fā)貨單的總數(shù),在該類所有對象中這個屬性的值都是一樣的,下面是對這個屬性的描述:-貨單數(shù):Integer3.定義服務(wù)服務(wù)也就是操作,UML描述操作的語法格式如下:可見性操作名(參數(shù)表):返回值類型{性質(zhì)串}操作可見性的定義方法與屬性相同。參數(shù)表是用逗號分隔的形式參數(shù)的序列。描述一個參數(shù)的語法如下:參數(shù)名:類型名=默認(rèn)值當(dāng)操作的調(diào)用者未提供實(shí)在參數(shù)時,該參數(shù)就使用默認(rèn)值。與屬性類似,在類中也可定義類作用域操作,在類圖中表示為帶下劃線的操作。這種操作只能存取本類的類作用域?qū)傩?。如前所述,類圖由類及類與類之間的關(guān)系組成。定義了類之后就可以定義類與類之間的各種關(guān)系了。類與類之間通常有關(guān)聯(lián)、泛化(繼承)、依賴和細(xì)化等4種關(guān)系。1.關(guān)聯(lián)關(guān)聯(lián)表示兩個類的對象之間存在某種語義上的聯(lián)系。例如,作家使用計算機(jī),我們就認(rèn)為在作家和計算機(jī)之間存在某種語義連接,因此,在類圖中應(yīng)該在作家類和計算機(jī)類之間建立關(guān)聯(lián)關(guān)系。9.4.2表示關(guān)系的符號(1)普通關(guān)聯(lián)普通關(guān)聯(lián)是最常見的關(guān)聯(lián)關(guān)系,只要在類與類之間存在連接關(guān)系就可以用普通關(guān)聯(lián)表示。普通關(guān)聯(lián)的圖示符號是連接兩個類之間的直線,如圖9.6所示。通常,關(guān)聯(lián)是雙向的,可在一個方向上為關(guān)聯(lián)起一個名字,在另一個方向上起另一個名字(也可不起名字)。為避免混淆,在名字前面(或后面)加一個表示關(guān)聯(lián)方向的黑三角。圖9.6普通關(guān)聯(lián)示例在表示關(guān)聯(lián)的直線兩端可以寫上重數(shù)(multiplicity),它表示該類有多少個對象與對方的一個對象連接。重數(shù)的表示方法通常有:0…1 表示0到1個對象0…*或* 表示0到多個對象1+或1…* 表示1到多個對象1…15 表示1到15個對象3 表示3個對象如果圖中未明確標(biāo)出關(guān)聯(lián)的重數(shù),則默認(rèn)重數(shù)是1。(2)關(guān)聯(lián)的角色在任何關(guān)聯(lián)中都會涉及到參與此關(guān)聯(lián)的對象所扮演的角色(即起的作用),在某些情況下顯式標(biāo)明角色名有助于別人理解類圖。例如,圖9.7是一個遞歸關(guān)聯(lián)(即一個類與它本身有關(guān)聯(lián)關(guān)系)的例子。一個人與另一個人結(jié)婚,必然一個人扮演丈夫的角色,另一個人扮演妻子的角色。如果沒有顯式標(biāo)出角色名,則意味著用類名作為角色名。圖9.7關(guān)聯(lián)的角色(3)限定關(guān)聯(lián)限定關(guān)聯(lián)通常用在一對多或多對多的關(guān)聯(lián)關(guān)系中,可以把模型中的重數(shù)從一對多變成一對一,或從多對多簡化成多對一。在類圖中把限定詞放在關(guān)聯(lián)關(guān)系末端的一個小方框內(nèi)。例如,某操作系統(tǒng)中一個目錄下有許多文件,一個文件僅屬于一個目錄,在一個目錄內(nèi)文件名確定了惟一一個文件。圖9.8利用限定詞“文件名”表示了目錄與文件之間的關(guān)系,可見,利用限定詞把一對多關(guān)系簡化成了一對一關(guān)系。圖9.8一個受限的關(guān)聯(lián)限定提高了語義精確性,增強(qiáng)了查詢能力。在圖9.8中,限定的語法表明,文件名在其目錄內(nèi)是惟一的。因此,查找一個文件的方法就是,首先定下目錄,然后在該目錄內(nèi)查找指定的文件名。由于目錄加文件名可惟一地確定一個文件,因此,限定詞“文件名”應(yīng)該放在靠近目錄的那一端。(4)關(guān)聯(lián)類為了說明關(guān)聯(lián)的性質(zhì)可能需要一些附加信息??梢砸胍粋€關(guān)聯(lián)類來記錄這些信息。關(guān)聯(lián)中的每個連接與關(guān)聯(lián)類的一個對象相聯(lián)系。關(guān)聯(lián)類通過一條虛線與關(guān)聯(lián)連接。例如,圖9.9是一個電梯系統(tǒng)的類模型,隊列就是電梯控制器類與電梯類的關(guān)聯(lián)關(guān)系上的關(guān)聯(lián)類。從圖中可以看出,一個電梯控制器控制著4臺電梯,這樣,控制器和電梯之間的實(shí)際連接就有4個,每個連接都對應(yīng)一個隊列(對象),每個隊列(對象)存儲著來自控制器和電梯內(nèi)部按鈕的請求服務(wù)信息。電梯控制器通過讀取隊列信息,選擇一個合適的電梯為乘客服務(wù)。關(guān)聯(lián)類與一般的類一樣,也有屬性、操作和關(guān)聯(lián)。圖9.9關(guān)聯(lián)類示例2.聚集聚集也稱為聚合,是關(guān)聯(lián)的特例。聚集表示類與類之間的關(guān)系是整體與部分的關(guān)系。在陳述需求時使用的“包含”、“組成”、“分為……部分”等字句,往往意味著存在聚集關(guān)系。除了一般聚集之外,還有兩種特殊的聚集關(guān)系,分別是共享聚集和組合聚集。(1)共享聚集如果在聚集關(guān)系中處于部分方的對象可同時參與多個處于整體方對象的構(gòu)成,則該聚集稱為共享聚集。例如,一個課題組包含許多成員,每個成員又可以是另一個課題組的成員,則課題組和成員之間是共享聚集關(guān)系,如圖9.10所示。一般聚集和共享聚集的圖示符號,都是在表示關(guān)聯(lián)關(guān)系的直線末端緊挨著整體類的地方畫一個空心菱形。圖9.10共享聚集示例(2)組合聚集如果部分類完全隸屬于整體類,部分與整體共存,整體不存在了部分也會隨之消失(或失去存在價值了),則該聚集稱為組合聚集(簡稱為組成)。例如,在屏幕上打開一個窗口,它就由文本框、列表框、按鈕和菜單組成,一旦關(guān)閉了窗口,各個組成部分也同時消失,窗口和它的組成部分之間存在著組合聚集關(guān)系。圖9.11是窗口的組成,從圖上可以看出,組成關(guān)系用實(shí)心菱形表示。圖9.11組合聚集示例3.泛化UML中的泛化關(guān)系就是通常所說的繼承關(guān)系,它是通用元素和具體元素之間的一種分類關(guān)系。具體元素完全擁有通用元素的信息,并且還可以附加一些其他信息。在UML中,用一端為空心三角形的連線表示泛化關(guān)系,三角形的頂角緊挨著通用元素。注意,泛化針對類型而不針對實(shí)例,一個類可以繼承另一個類,但一個對象不能繼承另一個對象。實(shí)際上,泛化關(guān)系指出在類與類之間存在“一般-特殊”關(guān)系。泛化可進(jìn)一步劃分成普通泛化和受限泛化。(1)普通泛化普通泛化與9.2.2節(jié)中講過的繼承基本相同,對普通泛化的概念此處不再贅述。需要特別說明的是,沒有具體對象的類稱為抽象類。抽象類通常作為父類,用于描述其他類(子類)的公共屬性和行為。圖示抽象類時,在類名下方附加一個標(biāo)記值{abstract},如圖9.12所示。圖下方的兩個折角矩形是模型元素“筆記”的符號,其中的文字是注釋,分別說明兩個子類的操作drive的功能。圖9.12抽象類示例抽象類通常都具有抽象操作。抽象操作僅用來指定該類的所有子類應(yīng)具有哪些行為。抽象操作的圖示方法與抽象類相似,在操作標(biāo)記后面跟隨一個性質(zhì)串{abstract}。與抽象類相反的類是具體類,具體類有自己的對象,并且該類的操作都有具體的實(shí)現(xiàn)方法。圖9.13給出一個比較復(fù)雜的類圖示例,這個例子綜合應(yīng)用了前面講過的許多概念和圖示符號。圖9.13復(fù)雜類圖示例(2)受限泛化可以給泛化關(guān)系附加約束條件,以進(jìn)一步說明該泛化關(guān)系的使用方法或擴(kuò)充方法,這樣的泛化關(guān)系稱為受限泛化。預(yù)定義的約束有4種:多重、不相交、完全和不完全。這些約束都是語義約束。多重繼承指的是,一個子類可以同時多次繼承同一個上層基類,例如圖9.14中的水陸兩用類繼承了兩次交通工具類。與多重繼承相反的是不相交繼承,即一個子類不能多次繼承同一個基類(這樣的基類相當(dāng)于C++語言中的虛基類)。如果圖中沒有指定{多重}約束,則是不相交繼承,一般的繼承都是不相交繼承。圖9.14多重繼承示例完全繼承指的是父類的所有子類都已在類圖中窮舉出來了,圖示符號是指定{完全}約束。不完全繼承與完全繼承恰好相反,父類的子類并沒有都窮舉出來,隨著對問題理解的深入,可不斷補(bǔ)充和維護(hù),這為日后系統(tǒng)的擴(kuò)充和維護(hù)帶來很大方便。不完全繼承是一般情況下默認(rèn)的繼承關(guān)系。4.依賴和細(xì)化(1)依賴關(guān)系依賴關(guān)系描述兩個模型元素(類、用例等)之間的語義連接關(guān)系:其中一個模型元素是獨(dú)立的,另一個模型元素不是獨(dú)立的,它依賴于獨(dú)立的模型元素,如果獨(dú)立的模型元素改變了,將影響依賴于它的模型元素。在UML的類圖中,用帶箭頭的虛線連接有依賴關(guān)系的兩個類,箭頭指向獨(dú)立的類。在虛線上可以帶一個版類標(biāo)簽,具體說明依賴的種類,例如,圖9.15表示一個友元依賴關(guān)系,該關(guān)系使得B類的操作可以使用A類中私有的或保護(hù)的成員。圖9.15友元依賴關(guān)系(2)細(xì)化關(guān)系當(dāng)對同一個事物在不同抽象層次上描述時,這些描述之間具有細(xì)化關(guān)系。假設(shè)兩個模型元素A和B描述同一個事物,它們的區(qū)別是抽象層次不同,如果B是在A的基礎(chǔ)上的更詳細(xì)的描述,則稱B細(xì)化了A,或稱A細(xì)化成了B。細(xì)化的圖示符號為由元素B指向元素A的、一端為空心三角形的虛線(注意,不是實(shí)線),如圖9.16所示。細(xì)化用來協(xié)調(diào)不同階段模型之間的關(guān)系,表示各個開發(fā)階段不同抽象層次的模型之間的相關(guān)性,常常用于跟蹤模型的演變。圖9.16細(xì)化關(guān)系示例動態(tài)模型表示瞬時的、行為化的系統(tǒng)的“控制”性質(zhì),它規(guī)定了對象模型中的對象的合法變化序列。一旦建立起對象模型之后,就需要考察對象的動態(tài)行為。所有對象都具有自己的生命周期(或稱為運(yùn)行周期)。對一個對象來說,生命周期由許多階段組成,在每個特定階段中,都有適合該對象的一組運(yùn)行規(guī)律和行為規(guī)則,用以規(guī)范該對象的行為。生命周期中的階段也就是對象的狀態(tài)。9.5動態(tài)模型所謂狀態(tài),是對對象屬性值的一種抽象。當(dāng)然,在定義狀態(tài)時應(yīng)該忽略那些不影響對象行為的屬性。各對象之間相互觸發(fā)(即作用)就形成了一系列的狀態(tài)變化。我們把一個觸發(fā)行為稱作一個事件。對象對事件的響應(yīng),取決于接受該觸發(fā)的對象當(dāng)時所處的狀態(tài),響應(yīng)包括改變自己的狀態(tài)或者又形成一個新的觸發(fā)行為。狀態(tài)有持續(xù)性,它占用一段時間間隔。狀態(tài)與事件密不可分,一個事件分開兩個狀態(tài),一個狀態(tài)隔開兩個事件。事件表示時刻,狀態(tài)代表時間間隔。通常,用UML提供的狀態(tài)圖來描繪對象的狀態(tài)、觸發(fā)狀態(tài)轉(zhuǎn)換的事件以及對象的行為(對事件的響應(yīng))。每個類的動態(tài)行為用一張狀態(tài)圖來描繪,各個類的狀態(tài)圖通過共享事件合并起來,從而構(gòu)成系統(tǒng)的動態(tài)模型。也就是說,動態(tài)模型是基于事件共享而互相關(guān)聯(lián)的一組狀態(tài)圖的集合。功能模型表示變化的系統(tǒng)的“功能”性質(zhì),它指明了系統(tǒng)應(yīng)該“做什么”,因此更直接地反映了用戶對目標(biāo)系統(tǒng)的需求。通常,功能模型由一組數(shù)據(jù)流圖組成。在面向?qū)ο蠓椒▽W(xué)中,數(shù)據(jù)流圖遠(yuǎn)不如在結(jié)構(gòu)分析、設(shè)計方法中那樣重要。一般說來,與對象模型和動態(tài)模型比較起來,數(shù)據(jù)流圖并沒有增加新的信息,但是,建立功能模型有助于軟件開發(fā)人員更深入地理解問題域,改進(jìn)和完善自己的設(shè)計。因此,不能完全忽視功能模型的作用。9.6功能模型UML提供的用例圖也是進(jìn)行需求分析和建立功能模型的強(qiáng)有力工具。在UML中把用用例圖建立起來的系統(tǒng)模型稱為用例模型。用例模型描述的是外部行為者(actor)所理解的系統(tǒng)功能。用例模型的建立是系統(tǒng)開發(fā)者和用戶反復(fù)討論的結(jié)果,它描述了開發(fā)者和用戶對需求規(guī)格所達(dá)成的共識。一幅用例圖包含的模型元素有系統(tǒng)、行為者、用例及用例之間的關(guān)系。圖9.17是自動售貨機(jī)系統(tǒng)的用例圖。1.系統(tǒng)系統(tǒng)被看作是一個提供用例的黑盒子,內(nèi)部如何工作、用例如何實(shí)現(xiàn),這些對于建立用例模型來說都是不重要的。代表系統(tǒng)的方框的邊線表示系統(tǒng)的邊界,用于劃定系統(tǒng)的功能范圍,定義了系統(tǒng)所具有的功能。描述該系統(tǒng)功能的用例置于方框內(nèi),代表外部實(shí)體的行為者置于方框外。9.6.1用例圖圖9.17自動售貨機(jī)系統(tǒng)用例圖2.用例一個用例是可以被行為者感受到的、系統(tǒng)的一個完整的功能。在UML中把用例定義成系統(tǒng)完成的一系列動作,動作的結(jié)果能被特定的行為者察覺到。這些動作除了完成系統(tǒng)內(nèi)部的計算與工作外,還包括與一些行為者的通信。用例通過關(guān)聯(lián)與行為者連接,關(guān)聯(lián)指出一個用例與哪些行為者交互,這種交互是雙向的。用例具有下述特征:(1)用例代表某些用戶可見的功能,實(shí)現(xiàn)一個具體的用戶目標(biāo);(2)用例總是被行為者啟動的,并向行為者提供可識別的值;(3)用例必須是完整的。注意,用例是一個類,它代表一類功能而不是使用該功能的某個具體實(shí)例。用例的實(shí)例是系統(tǒng)的一種實(shí)際使用方法,通常把用例的實(shí)例稱為腳本。腳本是系統(tǒng)的一次具體執(zhí)行過程,例如,在自動售貨機(jī)系統(tǒng)中,張三投入硬幣購買礦泉水,系統(tǒng)收到錢后把礦泉水送出來,上述過程就是一個腳本;李四投幣買可樂,但是可樂已賣完了,于是系統(tǒng)給出提示信息并把錢退還給李四,這個過程是另一個腳本。3.行為者行為者是指與系統(tǒng)交互的人或其他系統(tǒng),它代表外部實(shí)體。使用用例并且與系統(tǒng)交互的任何人或物都是行為者。行為者代表一種角色,而不是某個具體的人或物。事實(shí)上,一個具體的人可以充當(dāng)多種不同角色。在用例圖中用直線連接行為者和用例,表示兩者之間交換信息,稱為通信聯(lián)系。行為者觸發(fā)(激活)用例,并與用例交換信息。單個行為者可與多個用例聯(lián)系;反之,一個用例也可與多個行為者聯(lián)系。對于同一個用例而言,不同行為者起的作用也不同??梢园研袨檎叻殖芍餍袨檎吆透毙袨檎?,還可分成主動行為者和被動行為者。實(shí)踐表明,行為者對確定用例是非常有用的。面對一個大型、復(fù)雜的系統(tǒng),要列出用例清單往往很困難,可以先列出行為者清單,再針對每個行為者列出它的用例。這樣做可以比較容易地建立起用例模型。4.用例之間的關(guān)系UML用例之間主要有擴(kuò)展和使用兩種關(guān)系,它們是泛化關(guān)系的兩種不同形式。(1)擴(kuò)展關(guān)系向一個用例中添加一些動作后構(gòu)成了另一個用例,這兩個用例之間的關(guān)系就是擴(kuò)展關(guān)系,后者繼承前者的一些行為,通常把后者稱為擴(kuò)展用例。例如,在自動售貨機(jī)系統(tǒng)中,“售貨”是一個基本的用例,如果顧客購買罐裝飲料,售貨功能完成得很順利,但是,如果顧客要購買用紙杯裝的散裝飲料,則不能執(zhí)行該用例提供的常規(guī)動作,而要做些改動。我們可以修改售貨用例,使之既能提供售罐裝飲料的常規(guī)動作又能提供售散裝飲料的非常規(guī)動作,但是,這將把該用例與一些特殊的判斷和邏輯混雜在一起,使正常的流程晦澀難懂。圖9.18中把常規(guī)動作放在“售貨”用例中,而把非常規(guī)動作放置于“售散裝飲料”用例中,這兩個用例之間的關(guān)系就是擴(kuò)展關(guān)系。在用例圖中,用例之間的擴(kuò)展關(guān)系圖示為帶版類《擴(kuò)展》的泛化關(guān)系。圖9.18含擴(kuò)展和使用關(guān)系的用例圖(2)使用關(guān)系當(dāng)一個用例使用另一個用例時,這兩個用例之間就構(gòu)成了使用關(guān)系。一般說來,如果在若干個用例中有某些相同的動作,則可以把這些相同的動作提取出來單獨(dú)構(gòu)成一個用例(稱為抽象用例)。這樣,當(dāng)某個用例使用該抽象用例時,就好像這個用例包含了抽象用例中的所有動作。在用例圖中,用例之間的使用關(guān)系用帶版類《使用》的泛化關(guān)系表示,如圖9.18所示。請注意擴(kuò)展與使用之間的異同:這兩種關(guān)系都意味著從幾個用例中抽取那些公共的行為并放入一個單獨(dú)的用例中,而這個用例被其他用例使用或擴(kuò)展,但是,使用和擴(kuò)展的目的是不同的。通常在描述一般行為的變化時采用擴(kuò)展關(guān)系;在兩個或多個用例中出現(xiàn)重復(fù)描述又想避免這種重復(fù)時,可以采用使用關(guān)系。幾乎在任何情況下都需要使用用例,通過用例可以獲取用戶需求,規(guī)劃和控制項(xiàng)目。獲取用例是需求分析階段的主要工作之一,而且是首先要做的工作。大部分用例將在項(xiàng)目的需求分析階段產(chǎn)生,并且隨著開發(fā)工作的深入還會發(fā)現(xiàn)更多用例,這些新發(fā)現(xiàn)的用例都應(yīng)及時補(bǔ)充進(jìn)已有的用例集中。用例集中的每個用例都是對系統(tǒng)的一個潛在的需求。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中數(shù)學(xué)人教版九年級下冊同步聽評課記錄第27章章末復(fù)習(xí)
- 瑜伽私教服務(wù)合同(2篇)
- 甲醛超標(biāo)租賃合同(2篇)
- 湘教版九年級上冊聽評課記錄:4.2 正切
- 湘教版地理七年級下冊《第一節(jié) 日本》聽課評課記錄2
- 四年級英語聽評課記錄表
- 五年級蘇教版數(shù)學(xué)上冊《認(rèn)識負(fù)數(shù)》聽評課記錄(校內(nèi)大組)
- 蘇科版數(shù)學(xué)七年級上冊3.2 代數(shù)式教聽評課記錄
- 湘師大版道德與法治九年級上冊4.1《多彩的人類文化》聽課評課記錄
- 小學(xué)數(shù)學(xué)-六年級下冊-3-2-2 圓錐的體積 聽評課記錄
- 四川省自貢市2024-2025學(xué)年上學(xué)期八年級英語期末試題(含答案無聽力音頻及原文)
- 2025-2030年中國汽車防滑鏈行業(yè)競爭格局展望及投資策略分析報告新版
- 2025年上海用人單位勞動合同(4篇)
- 2025年生物安全年度工作計劃
- 人教版數(shù)學(xué)六年級下冊全冊核心素養(yǎng)目標(biāo)教學(xué)設(shè)計
- 通用電子嘉賓禮薄
- 大學(xué)語文課件(完整版)
- 新概念英語第三冊課后習(xí)題答案詳解
- 有機(jī)化學(xué)共振論
- 家訪手記(5篇)
- 橋梁工程質(zhì)量保證措施
評論
0/150
提交評論