




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο蠓椒▽W(xué)引論n開(kāi)發(fā)模式又稱(chēng)為范型、范例、風(fēng)范或模式開(kāi)發(fā)模式又稱(chēng)為范型、范例、風(fēng)范或模式(Pattern)。開(kāi)發(fā)模式定義了開(kāi)發(fā)模式定義了n特定問(wèn)題和應(yīng)用的開(kāi)發(fā)過(guò)程中將遵循的特定問(wèn)題和應(yīng)用的開(kāi)發(fā)過(guò)程中將遵循的步驟步驟;n確定將用于表示問(wèn)題和解的那些成分的確定將用于表示問(wèn)題和解的那些成分的類(lèi)型類(lèi)型;n利用這些成分表示與問(wèn)題解決有關(guān)的利用這些成分表示與問(wèn)題解決有關(guān)的抽象抽象;n直接得到問(wèn)題的直接得到問(wèn)題的結(jié)構(gòu)結(jié)構(gòu)。n開(kāi)發(fā)模式的選擇影響到整個(gè)軟件開(kāi)發(fā)生存期。就開(kāi)發(fā)模式的選擇影響到整個(gè)軟件開(kāi)發(fā)生存期。就是說(shuō),它支配了是說(shuō),它支配了設(shè)計(jì)方法、編碼語(yǔ)言、測(cè)試和設(shè)計(jì)方法、編碼語(yǔ)言、測(cè)試和檢驗(yàn)技術(shù)檢驗(yàn)技術(shù)的
2、選擇的選擇傳統(tǒng)方法學(xué)的缺點(diǎn)n生命周期方法具有一定的先進(jìn)性。曾經(jīng)給軟件產(chǎn)業(yè)帶來(lái)巨大進(jìn)步,部分地緩解了軟件危機(jī),使用這種方法學(xué)開(kāi)發(fā)的許多中、小規(guī)模軟件項(xiàng)目都獲得了成功。n存在的問(wèn)題n生產(chǎn)率提高的幅度遠(yuǎn)不能滿(mǎn)足需要n軟件重用程度很低n軟件仍然很難維護(hù)n軟件往往不能真正滿(mǎn)足用戶(hù)的需要n當(dāng)把這種方法學(xué)應(yīng)用于大型軟件產(chǎn)品的開(kāi)發(fā)時(shí),似乎很少取得成功。n出現(xiàn)問(wèn)題的原因n僵化的瀑布模型n某些類(lèi)型的系統(tǒng)需求是模糊的n項(xiàng)目參與者之間存在通信鴻溝n預(yù)先定義的需求可能是過(guò)時(shí)的n結(jié)構(gòu)化技術(shù)的缺點(diǎn) 面向過(guò)程,功能分解n面向過(guò)程開(kāi)發(fā)模式產(chǎn)生面向過(guò)程開(kāi)發(fā)模式產(chǎn)生過(guò)程的抽象過(guò)程的抽象。n這些抽象的基礎(chǔ)是這些抽象的基礎(chǔ)是把軟件視為
3、處理流把軟件視為處理流,并,并定義定義成由一系列步驟構(gòu)成的算法成由一系列步驟構(gòu)成的算法。n每一步驟都是帶有預(yù)定輸入和特定輸出的一個(gè)每一步驟都是帶有預(yù)定輸入和特定輸出的一個(gè)過(guò)程,把這些步驟串聯(lián)在一起可過(guò)程,把這些步驟串聯(lián)在一起可產(chǎn)生合理的穩(wěn)產(chǎn)生合理的穩(wěn)定的貫通于整個(gè)程序的控制流定的貫通于整個(gè)程序的控制流,最終產(chǎn)生一個(gè),最終產(chǎn)生一個(gè)簡(jiǎn)單的具有靜態(tài)結(jié)構(gòu)的體系結(jié)構(gòu)。簡(jiǎn)單的具有靜態(tài)結(jié)構(gòu)的體系結(jié)構(gòu)。n過(guò)程性開(kāi)發(fā)模式過(guò)程性開(kāi)發(fā)模式側(cè)重建立構(gòu)成問(wèn)題解決的處理側(cè)重建立構(gòu)成問(wèn)題解決的處理流流。n數(shù)據(jù)抽象、數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)抽象、數(shù)據(jù)結(jié)構(gòu)根據(jù)算法步驟的要求開(kāi)發(fā),根據(jù)算法步驟的要求開(kāi)發(fā),它貫穿于過(guò)程,提供過(guò)程所要求操作的信
4、息。它貫穿于過(guò)程,提供過(guò)程所要求操作的信息。n系統(tǒng)的狀態(tài)是一組全局變量系統(tǒng)的狀態(tài)是一組全局變量,這組全局變量保,這組全局變量保存狀態(tài)的值,把它們從一個(gè)過(guò)程傳送到另一個(gè)存狀態(tài)的值,把它們從一個(gè)過(guò)程傳送到另一個(gè)過(guò)程。過(guò)程。軟件工程的新途徑n快速原型法快速原型法n快速原型法簡(jiǎn)介n用原型法開(kāi)發(fā)軟件的過(guò)程n 拋棄原形法n 演化原形法n面向?qū)ο蠓椒▽W(xué)面向?qū)ο蠓椒▽W(xué):到了20世紀(jì)90年代,面向?qū)ο蠓椒▽W(xué)已經(jīng)成為人們?cè)陂_(kāi)發(fā)軟件時(shí)首選的范型。面向?qū)ο蠹夹g(shù)已成為當(dāng)前最好的軟件開(kāi)發(fā)技術(shù)。9.1.1 面向?qū)ο蠓椒▽W(xué)的要點(diǎn)面向?qū)ο蠓椒▽W(xué)的要點(diǎn)n出發(fā)點(diǎn)和基本原則是盡可能模擬人類(lèi)習(xí)出發(fā)點(diǎn)和基本原則是盡可能模擬人類(lèi)習(xí)慣的思維
5、方式,使開(kāi)發(fā)軟件的方法與過(guò)慣的思維方式,使開(kāi)發(fā)軟件的方法與過(guò)程盡可能接近人類(lèi)認(rèn)識(shí)世界解決問(wèn)題的程盡可能接近人類(lèi)認(rèn)識(shí)世界解決問(wèn)題的方法與過(guò)程,也就是使描述問(wèn)題的方法與過(guò)程,也就是使描述問(wèn)題的問(wèn)題問(wèn)題空間空間與實(shí)現(xiàn)解法的與實(shí)現(xiàn)解法的解空間解空間在結(jié)構(gòu)上盡可在結(jié)構(gòu)上盡可能一致。能一致。9.1 面向?qū)ο蠓椒▽W(xué)概述面向?qū)ο蠓椒▽W(xué)的四個(gè)要點(diǎn)認(rèn)為客觀世界是由各種認(rèn)為客觀世界是由各種對(duì)象對(duì)象組成的,任何組成的,任何事物都是對(duì)象,復(fù)雜的對(duì)象可以由比較事物都是對(duì)象,復(fù)雜的對(duì)象可以由比較簡(jiǎn)單的對(duì)象以某種方式組合而成。簡(jiǎn)單的對(duì)象以某種方式組合而成。面向?qū)ο蠓椒ㄓ脤?duì)象分解取代了傳統(tǒng)方法面向?qū)ο蠓椒ㄓ脤?duì)象分解取代了傳統(tǒng)方
6、法的功能分解。的功能分解。面向?qū)ο蠓椒▽W(xué)的四個(gè)要點(diǎn)把所有對(duì)象都劃分成各種對(duì)象把所有對(duì)象都劃分成各種對(duì)象類(lèi)類(lèi),每個(gè)對(duì)象類(lèi)都,每個(gè)對(duì)象類(lèi)都定義了一組數(shù)據(jù)和方法。定義了一組數(shù)據(jù)和方法。n數(shù)據(jù)用于表示對(duì)象的靜態(tài)屬性,是對(duì)象的狀態(tài)信息。因此,每當(dāng)建立該對(duì)象類(lèi)的一個(gè)新實(shí)例時(shí),就按照類(lèi)中對(duì)數(shù)據(jù)的定義為這個(gè)新對(duì)象生成一組專(zhuān)用的數(shù)據(jù),以便描述該對(duì)象獨(dú)特的屬性值。n類(lèi)中定義的方法,是允許施加于該類(lèi)對(duì)象上的操作,是該類(lèi)所有對(duì)象共享的,并不需要為每個(gè)對(duì)象都復(fù)制操作的代碼。面向?qū)ο蠓椒▽W(xué)的四個(gè)要點(diǎn)按照子類(lèi)與父類(lèi)的關(guān)系,把若干個(gè)對(duì)象類(lèi)按照子類(lèi)與父類(lèi)的關(guān)系,把若干個(gè)對(duì)象類(lèi)組成一個(gè)層次結(jié)構(gòu)的系統(tǒng)。通常下層的組成一個(gè)層次結(jié)構(gòu)的
7、系統(tǒng)。通常下層的派生類(lèi)具有和上層的基類(lèi)相同的特性派生類(lèi)具有和上層的基類(lèi)相同的特性(包包括數(shù)據(jù)和方法括數(shù)據(jù)和方法),這種現(xiàn)象稱(chēng)為,這種現(xiàn)象稱(chēng)為繼承繼承。n但是,如果在派生類(lèi)中對(duì)某些特性又做了重新描述,則在派生類(lèi)中的這些特性將以新描述為準(zhǔn),也就是說(shuō),低層的特性將屏蔽高層的同名特性。面向?qū)ο蠓椒▽W(xué)的四個(gè)要點(diǎn)對(duì)象彼此之間僅能通過(guò)對(duì)象彼此之間僅能通過(guò)傳遞消息傳遞消息互相聯(lián)系?;ハ嗦?lián)系。n對(duì)象是進(jìn)行處理的主體,必須發(fā)消息請(qǐng)求它執(zhí)行它的某個(gè)操作,處理它的私有數(shù)據(jù)。n一切局部于該對(duì)象的私有信息,都被封裝在該對(duì)象類(lèi)的定義中,就好像裝在一個(gè)不透明的黑盒子中一樣,在外界是看不見(jiàn)的,更不能直接使用,這就是“封裝性”。
8、nOOObjects+Classes+Inheritance+ Communication with messages 面向?qū)ο缶褪羌仁褂脤?duì)象又使用類(lèi)和繼承機(jī)制,而且對(duì)象之間僅能通過(guò)傳遞消息實(shí)現(xiàn)彼此通信?;趯?duì)象的方法、基于類(lèi)的方法9.1.2 面向?qū)ο蠓椒▽W(xué)的優(yōu)點(diǎn)1. 與人類(lèi)習(xí)慣的思維方法一致與人類(lèi)習(xí)慣的思維方法一致傳統(tǒng)的程序設(shè)計(jì)技術(shù)是面向過(guò)程的設(shè)計(jì)方法,這種方法以算法為核心,把數(shù)據(jù)和過(guò)程作為相互獨(dú)立的部分,數(shù)據(jù)代表問(wèn)題空間中的客體,程序代碼則用于處理這些數(shù)據(jù)。面向?qū)ο蟮能浖_(kāi)發(fā)過(guò)程按照人們習(xí)慣的思維方式建立起問(wèn)題領(lǐng)域的對(duì)象模型:對(duì)問(wèn)題領(lǐng)域進(jìn)行自然的分解,確定需要使用的對(duì)象和類(lèi),建立適當(dāng)?shù)念?lèi)等
9、級(jí),在對(duì)象之間傳遞消息實(shí)現(xiàn)必要的聯(lián)系。2. 穩(wěn)定性好穩(wěn)定性好傳統(tǒng)的軟件開(kāi)發(fā)方法以算法為核心,開(kāi)發(fā)過(guò)程基于功能分析和功能分解,當(dāng)功能需求發(fā)生變化時(shí)將引起軟件結(jié)構(gòu)的整體修改。事實(shí)上,用戶(hù)需求變化大部分是針對(duì)功能的,因此,這樣的軟件系統(tǒng)是不穩(wěn)定的。面向?qū)ο蠓椒ㄓ脤?duì)象模擬問(wèn)題領(lǐng)域中的實(shí)體,由于現(xiàn)實(shí)世界中的實(shí)體是相對(duì)穩(wěn)定的,因此,以對(duì)象為中心構(gòu)造的軟件系統(tǒng)也是比較穩(wěn)定的。當(dāng)對(duì)系統(tǒng)的功能需求變化時(shí)僅需要作一些局部性的修改。例如,從已有類(lèi)派生出一些新的子類(lèi)以實(shí)現(xiàn)功能擴(kuò)充或修改。3. 可重用性好可重用性好重用是提高生產(chǎn)率的最主要的方法。傳統(tǒng)的軟件重用技術(shù)是利用標(biāo)準(zhǔn)函數(shù)庫(kù),實(shí)際的庫(kù)函數(shù)往往僅提供最基本、最常用的
10、功能,在開(kāi)發(fā)一個(gè)新的軟件系統(tǒng)時(shí),通常多數(shù)函數(shù)是開(kāi)發(fā)者自己編寫(xiě)的,甚至絕大多數(shù)函數(shù)都是新編的。面向?qū)ο蟮能浖夹g(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)的使用。4. 較易開(kāi)發(fā)大型軟件產(chǎn)品較易開(kāi)發(fā)大型軟件產(chǎn)品在開(kāi)發(fā)大型軟件產(chǎn)品時(shí),組織開(kāi)發(fā)人員的方法不恰當(dāng)往往是出現(xiàn)問(wèn)題的主要原因。用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件時(shí),每個(gè)對(duì)象就像一個(gè)微型程序,有自己的數(shù)據(jù)、操作、功能和用途,因此,可以把一個(gè)大型軟件產(chǎn)品分
11、解成一系列本質(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ù)性好可維護(hù)性好由于下述因素的存在,使得用面向?qū)ο蠓椒ㄋ_(kāi)發(fā)的軟件可維護(hù)性好:(1) 面向?qū)ο蟮能浖€(wěn)定性比較好。面向?qū)ο蟮能浖€(wěn)定性比較好。當(dāng)對(duì)軟件的功能或性能的要求發(fā)生變化時(shí),通常不會(huì)引起軟件的整體變化,往往只需對(duì)局部作一些修改。(2) 面向?qū)ο蟮能浖容^容易修改。面向?qū)ο蟮能浖容^容易修改。類(lèi)的獨(dú)立性好,若僅修改一個(gè)類(lèi)的內(nèi)部實(shí)現(xiàn)部分,可不影響軟件的其他部分;繼承機(jī)制和多態(tài)性機(jī)制使得對(duì)軟件的修改和擴(kuò)充
12、比較容易實(shí)現(xiàn)。(3) 面向?qū)ο蟮能浖容^容易理解。面向?qū)ο蟮能浖容^容易理解。傳統(tǒng)軟件修改所涉及的部分分散在軟件各個(gè)地方,且解空間與問(wèn)題空間的結(jié)構(gòu)很不一致,理解原有軟件的難度和工作量較大。面向?qū)ο蟮能浖夹g(shù)符合人們習(xí)慣的思維方式,比較容易理解。派生新類(lèi)來(lái)實(shí)現(xiàn)系統(tǒng)修改和擴(kuò)充時(shí)通常不需要詳細(xì)了解基類(lèi)中操作的實(shí)現(xiàn)算法。因此,了解原有系統(tǒng)的工作量可以大幅度下降。(4) 易于測(cè)試和調(diào)試。易于測(cè)試和調(diào)試。對(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)行它,觀察它是否能正確地完成要求它
13、做的工作,對(duì)類(lèi)的測(cè)試通常比較容易實(shí)現(xiàn),如果發(fā)現(xiàn)錯(cuò)誤也往往集中在類(lèi)的內(nèi)部,比較容易調(diào)試。9.1.3 噴泉模型使用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件時(shí),在開(kāi)發(fā)的早期階段定義了一系列面向問(wèn)題的對(duì)象,并且在整個(gè)開(kāi)發(fā)過(guò)程中不斷充實(shí)和擴(kuò)充這些對(duì)象。由于各階段都使用統(tǒng)一的軟件概念“對(duì)象” 和表示符號(hào),因此,整個(gè)開(kāi)發(fā)過(guò)程都是 “無(wú)縫無(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ò)的可能性。圖9.1所示的噴泉模型,是典型的面向?qū)ο蟮能浖^(guò)程模型。圖9.1 噴泉模型 圓圈較小象征著維護(hù)時(shí)間縮
14、短了。圓圈相互重疊,表示兩個(gè)活動(dòng)之間存在交迭;向下箭頭代表該階段內(nèi)的迭迭代代(或求精)“噴泉” 體現(xiàn)了面向?qū)ο箝_(kāi)發(fā)過(guò)程迭代和無(wú)縫的特性:概念和表示方法上的一致性,保證各項(xiàng)開(kāi)發(fā)活動(dòng)之間的無(wú)縫無(wú)縫過(guò)渡為避免開(kāi)發(fā)過(guò)程過(guò)分無(wú)序,應(yīng)把一個(gè)線性過(guò)程(圖中的中心垂線)作為總目標(biāo)9.2.1 對(duì)象對(duì)象n問(wèn)題域中某個(gè)實(shí)體的抽象,設(shè)立某個(gè)對(duì)象就反映了軟件信息保存有關(guān)它的信息并且與它進(jìn)行交互的能力。n每個(gè)對(duì)象可用它本身的每個(gè)對(duì)象可用它本身的一組屬性一組屬性和它可以執(zhí)行和它可以執(zhí)行的的一組操作一組操作來(lái)定義。來(lái)定義。n屬性屬性一般只能通過(guò)一般只能通過(guò)執(zhí)行對(duì)象的操作執(zhí)行對(duì)象的操作來(lái)改變。來(lái)改變。n操作操作又稱(chēng)為方法或服務(wù)
15、,它描述了又稱(chēng)為方法或服務(wù),它描述了對(duì)象執(zhí)行的對(duì)象執(zhí)行的功能功能,若通過(guò)消息傳遞,還可以為其它對(duì)象使,若通過(guò)消息傳遞,還可以為其它對(duì)象使用。用。9.2 面向?qū)ο蟮母拍顚?duì)象的形象表示:錄音機(jī)對(duì)象處于不同狀態(tài)時(shí),做同一個(gè)操作所得效果不同。n軟件通過(guò)對(duì)象與外界的界面界面來(lái)操作對(duì)象,界面界面也就是該對(duì)象向公眾開(kāi)放的操作。也就是該對(duì)象向公眾開(kāi)放的操作。只需知道它向外界提供的接口形式,無(wú)須知道內(nèi)部實(shí)現(xiàn)算法,簡(jiǎn)單方便,具有極高的安全性和可靠性。定義1: 對(duì)象是具有相同狀態(tài)的一組操作的集合。這個(gè)定義從面向?qū)ο蟪绦蛟O(shè)計(jì)的角度看“對(duì)象”。定義2: 對(duì)象是對(duì)問(wèn)題域中某個(gè)東西的抽象,這種抽象反映了系統(tǒng)保存有關(guān)這個(gè)東西
16、的信息或與它交互的能力。即對(duì)象是對(duì)屬性值和操作的封裝。這個(gè)定義著重從信息模擬的角度看待“對(duì)象”。定義3: 對(duì)象 =ID,MS,DS,MI。其中,ID是標(biāo)識(shí)或名字,MS是操作集合,DS是數(shù)據(jù)結(jié)構(gòu),MI是對(duì)象受理的消息名集合(即對(duì)外接口)。這個(gè)定義是一個(gè)形式化的定義。2. 對(duì)象的定義對(duì)象的定義對(duì)象的定義對(duì)象的定義總之,對(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í),按照消息模式找出
17、與之相匹配的操作,并執(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ì)象,可以用圖9.3所示的自動(dòng)機(jī)來(lái)模擬: 圖9.3 用自動(dòng)機(jī)模擬對(duì)象3 對(duì)象的特點(diǎn)對(duì)象的特點(diǎn)1、以數(shù)據(jù)為中心。操作圍繞對(duì)其數(shù)據(jù)所需做的處理來(lái)設(shè)置,而且操作的結(jié)果往往與當(dāng)時(shí)的所處的狀態(tài)(數(shù)據(jù)值)有關(guān)。2、對(duì)象是主動(dòng)的。程序不能直接從外部直接加工它的私有數(shù)據(jù)。3、實(shí)現(xiàn)了數(shù)據(jù)封裝。數(shù)據(jù)對(duì)外隱藏,不可見(jiàn)。4、本質(zhì)上是并行的。不同對(duì)象各自獨(dú)立地處理自身的數(shù)據(jù),彼此通過(guò)發(fā)消息傳遞信息完成通信。5、模塊獨(dú)立性好。對(duì)象內(nèi)部各種
18、元素彼此結(jié)合得很緊密,內(nèi)聚性相當(dāng)強(qiáng)。對(duì)象的元素(數(shù)據(jù)和方法)基本上都被封裝在對(duì)象內(nèi)部,與外界的聯(lián)系少,對(duì)象之間的耦合較松。n類(lèi)(Class)n就是對(duì)具有相同數(shù)據(jù)和相同操作的一組相似就是對(duì)具有相同數(shù)據(jù)和相同操作的一組相似對(duì)象的定義。對(duì)象的定義。 如:張三、李四等都是人類(lèi) 不同的圓、三角形等9.2.2 其他概念n例:經(jīng)典的形體問(wèn)題,可以用于計(jì)算機(jī)輔助設(shè)計(jì)系統(tǒng)或游戲模擬中。這里基本類(lèi)型是“形體”,每個(gè)形體有大小、顏色、位置等。每個(gè)形體能被繪制、擦除、移動(dòng)、著色等。n由此,可以派生出特殊類(lèi)型的形體:圓、正方形、三角形等,它們中的每一個(gè)都有另外的特性和行為,例如,某些形體可以翻轉(zhuǎn)。有些行為可以不同(計(jì)算
19、形體的面積)。n類(lèi)型層次結(jié)構(gòu)既體現(xiàn)了形體間的類(lèi)似,又體現(xiàn)了它們之間的區(qū)別。 其他概念n實(shí)例(Instance)n就是由某個(gè)特定的類(lèi)所描述的一個(gè)具體的對(duì)象。類(lèi)在現(xiàn)實(shí)世界并不真正存在。n當(dāng)使用“對(duì)象”這個(gè)術(shù)語(yǔ)時(shí),既可以指一個(gè)具體的對(duì)象,也可以泛指一般的對(duì)象,但是,當(dāng)使用“實(shí)例”這個(gè)術(shù)語(yǔ)時(shí),必然是指一個(gè)具體的對(duì)象。其他概念n消息(Message)n就是要求某個(gè)對(duì)象執(zhí)行在定義它的那個(gè)類(lèi)中所定義的某個(gè)操作的規(guī)格說(shuō)明。通常,一個(gè)消息由下述三部分組成:n接收消息的對(duì)象n消息選擇符(即消息名)n零個(gè)和多個(gè)變?cè)?MyCircle.show(green) MyCircle接收到這個(gè)消息后,將執(zhí)行在Circle類(lèi)
20、中所定義的Show操作。其他概念n方法(Method)n就是對(duì)象所能執(zhí)行的操作,也就是類(lèi)中所定義的服務(wù)。n方法描述了對(duì)象執(zhí)行操作的算法,響應(yīng)消息的方法。例如:在Circle類(lèi)中給出成員函數(shù)Show(int color)的定義, 使Circle類(lèi)的對(duì)象能響應(yīng)消息Show(GREEN).其他概念n屬性(Attribute)n就是類(lèi)中所定義的數(shù)據(jù),它是對(duì)客觀世界實(shí)體所具有的性質(zhì)的抽象。類(lèi)的每個(gè)實(shí)例都有自己特有的屬性值。n如Circle類(lèi)中定義的代表圓心坐標(biāo)、半徑、顏色等的數(shù)據(jù)成員,就是圓的屬性。n封裝(encapsulation)n一個(gè)對(duì)象好像是一個(gè)不透明的黑盒子,表示對(duì)象狀態(tài)的數(shù)據(jù)和實(shí)現(xiàn)操作的代碼
21、與局部數(shù)據(jù),都被封裝在黑盒子里面,從外面是看不見(jiàn)的,更不能從外面直接訪問(wèn)或修改這些數(shù)據(jù)和代碼。n使用一個(gè)對(duì)象的時(shí)候,只需知道它向外界提供的接口形式,無(wú)須知道它的數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)和實(shí)現(xiàn)操作的算法。n繼承(繼承(Inheritance)n繼承是指能夠直接獲得已有的性質(zhì)和特征,而不必重復(fù)定義它們。在面向?qū)ο蟮募夹g(shù)中,繼承是子類(lèi)自動(dòng)地共享基類(lèi)中定義的數(shù)據(jù)和方法地機(jī)制。n新類(lèi)的定義可以是既存類(lèi)所聲明的數(shù)據(jù)和新類(lèi)所增加的聲明的組合。新類(lèi)復(fù)用既存的定義,而不要求修改既存類(lèi)。既存類(lèi)可當(dāng)做基類(lèi)來(lái)引用,則新類(lèi)相應(yīng)地可當(dāng)做派生類(lèi)來(lái)引用n繼承表示了基本類(lèi)型和派生類(lèi)型之間的相似性。一個(gè)基本類(lèi)型具有所有由它派生出來(lái)的類(lèi)型所共
22、有的特性和行為。 A的操作A的變量 類(lèi)AA的實(shí)例變量 從A繼承特性B的操作B的變量 類(lèi)B繼承來(lái)的A的實(shí)例變量B的實(shí)例變量類(lèi)AA的實(shí)例a1類(lèi)B:A的子類(lèi)B的實(shí)例b1實(shí)現(xiàn)繼承機(jī)制的原理實(shí)現(xiàn)繼承機(jī)制的原理例1:垃圾再生機(jī)要對(duì)垃圾進(jìn)行分類(lèi)。這里基本類(lèi)型是“垃圾”,每件垃圾有重量、價(jià)值等等,并且可以被破碎、融化或分解。這樣,可以派生出更特殊的垃圾類(lèi)型,它們可以有另外的特性(瓶子有顏色)或行為(鋁可以被壓碎,鋼可以被磁化)。另外,有些行為可以不同(紙的價(jià)值取決于它的種類(lèi)和狀態(tài))。 n繼承具有傳遞性。一個(gè)類(lèi)實(shí)際上繼承了它所在的類(lèi)等級(jí)中在它上層的全部基類(lèi)的所有描述。n軟件的可修改性大大增加。擴(kuò)充功能時(shí),派生類(lèi)
23、的方法可以調(diào)用基類(lèi)的方法,并在此基礎(chǔ)上增加必要的程序代碼;完全改變時(shí),可以在派生類(lèi)中實(shí)現(xiàn)一個(gè)同名算法;增加新功能時(shí),可以在派生類(lèi)中實(shí)現(xiàn)一個(gè)新的方法。n軟件重用其他概念n多態(tài)性(Polymorphism)n指子類(lèi)對(duì)象可以像父類(lèi)對(duì)象那樣使用,同樣的消息既可以發(fā)送給父類(lèi)對(duì)象也可以發(fā)送給子類(lèi)對(duì)象。n多態(tài)性機(jī)制不僅增加了面向?qū)ο筌浖到y(tǒng)的靈活性,進(jìn)一步減少了信息冗余,而且顯著提高了軟件的可重用性和可擴(kuò)充性。n如果試圖把派生類(lèi)型的對(duì)象看作它們的基本類(lèi)型(圓看作形體,自行車(chē)看作車(chē)輛,鸕鶿看作鳥(niǎo)),就有一個(gè)問(wèn)題:如果一個(gè)函數(shù)告訴一個(gè)一般形體去繪制它自己,或者告訴一個(gè)一般的車(chē)輛去行駛,或者告訴一只一般的鳥(niǎo)去飛,
24、則編譯器在編譯時(shí)就不能確切地知道應(yīng)當(dāng)執(zhí)行哪段代碼。n同樣的問(wèn)題是,消息發(fā)送時(shí),程序員并不想知道將執(zhí)行哪段代碼。繪圖函數(shù)能等同地應(yīng)用于圓、正方形或三角形,對(duì)象根據(jù)它的特殊類(lèi)型來(lái)執(zhí)行合適的代碼。如果增加一個(gè)新的子類(lèi),不用修改函數(shù)調(diào)用,就可以執(zhí)行不同的代碼。編譯器不能確切地知道執(zhí)行哪段代碼,那么它應(yīng)該怎么辦呢? 為了解決這一問(wèn)題,面向?qū)ο笳Z(yǔ)言采用“滯后聯(lián)編”的思想。當(dāng)給對(duì)象發(fā)送消息時(shí),在程序運(yùn)行之前不去確定被調(diào)用的代碼。編譯器保證這個(gè)被調(diào)用的函數(shù)存在,并完成參數(shù)和返回值的類(lèi)型檢查,但是它不知道將執(zhí)行的準(zhǔn)確代碼。在C語(yǔ)言中,多態(tài)性時(shí)通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)的。在類(lèi)在類(lèi)等級(jí)不同層次中可以說(shuō)明名字、參數(shù)特征和返回
25、值類(lèi)等級(jí)不同層次中可以說(shuō)明名字、參數(shù)特征和返回值類(lèi)型都相同的虛擬成員函數(shù),而不同層次的類(lèi)中的虛函型都相同的虛擬成員函數(shù),而不同層次的類(lèi)中的虛函數(shù)實(shí)現(xiàn)算法各不相同。虛函數(shù)機(jī)制使得程序員能在一數(shù)實(shí)現(xiàn)算法各不相同。虛函數(shù)機(jī)制使得程序員能在一個(gè)類(lèi)等級(jí)中使用相同函數(shù)的多個(gè)不同版本,個(gè)類(lèi)等級(jí)中使用相同函數(shù)的多個(gè)不同版本,在運(yùn)行時(shí)在運(yùn)行時(shí)刻刻才根據(jù)接收消息的對(duì)象所屬于的類(lèi),決定到底執(zhí)行才根據(jù)接收消息的對(duì)象所屬于的類(lèi),決定到底執(zhí)行哪個(gè)特定的版本哪個(gè)特定的版本.這稱(chēng)為這稱(chēng)為動(dòng)態(tài)聯(lián)編動(dòng)態(tài)聯(lián)編,也叫滯后聯(lián)編。,也叫滯后聯(lián)編。n函數(shù)重載是指在同一作用域內(nèi)的若干個(gè)參數(shù)特征不同的函數(shù)可以使用相同的函數(shù)名字。n運(yùn)算符重載是
26、指同一個(gè)運(yùn)算符可以施加于不同類(lèi)型的操作數(shù)上面。n在C中,函數(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)的靈活性和可讀性。重載(Overloading)9.3 面向?qū)ο蠼模型為了理解事物而對(duì)事物作出的一種抽象,是對(duì)事物的一種無(wú)歧義的書(shū)面描述。n面向?qū)ο蠓椒ㄗ罨镜脑瓌t,是按照人們習(xí)慣的思維方式,用面向?qū)ο蟮挠^點(diǎn)建立問(wèn)題域的模型,開(kāi)發(fā)出盡可能自然地表現(xiàn)求解方法的軟件。n用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件,通常需要建立三種形式的模型
27、,它們分別是描述系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的對(duì)象模型,描述系統(tǒng)控制結(jié)構(gòu)的動(dòng)態(tài)模型和描述系統(tǒng)功能的功能模型。n對(duì)象模型是最重要、最基本、最核心的。在面向?qū)ο蠓治鲞^(guò)程中,構(gòu)造出完全獨(dú)立于實(shí)現(xiàn)在面向?qū)ο蠓治鲞^(guò)程中,構(gòu)造出完全獨(dú)立于實(shí)現(xiàn)的應(yīng)用域模型;在面向?qū)ο笤O(shè)計(jì)過(guò)程中,把求的應(yīng)用域模型;在面向?qū)ο笤O(shè)計(jì)過(guò)程中,把求解域的結(jié)構(gòu)逐漸加入到模型中;在實(shí)現(xiàn)階段,解域的結(jié)構(gòu)逐漸加入到模型中;在實(shí)現(xiàn)階段,把應(yīng)用域和求解域的結(jié)構(gòu)都編成程序代碼并進(jìn)把應(yīng)用域和求解域的結(jié)構(gòu)都編成程序代碼并進(jìn)行嚴(yán)格的測(cè)試驗(yàn)證。行嚴(yán)格的測(cè)試驗(yàn)證。對(duì)象模型化技術(shù)OMT對(duì)象模型n對(duì)象模型表示靜態(tài)的、結(jié)構(gòu)化的“數(shù)據(jù)”性質(zhì)。它是對(duì)模擬客觀世界實(shí)體的對(duì)象以及對(duì)象彼
28、此間的關(guān)系的映射,描述了系統(tǒng)的靜態(tài)結(jié)構(gòu)。n目標(biāo)是從客觀世界中提煉出對(duì)具體應(yīng)用有價(jià)值的概念。n用適當(dāng)?shù)慕UZ(yǔ)言來(lái)表達(dá)模型,建模語(yǔ)言由記號(hào)(即模型中使用的符號(hào))和使用記號(hào)的規(guī)則(語(yǔ)法、語(yǔ)義和語(yǔ)用)組成。9.4.1 類(lèi)圖的基本符號(hào)類(lèi)圖描述類(lèi)及類(lèi)與類(lèi)之間的靜態(tài)關(guān)系。類(lèi)圖是一種靜態(tài)模型,它是創(chuàng)建其他UML圖的基礎(chǔ)。一個(gè)系統(tǒng)可以由多張類(lèi)圖來(lái)描述,一個(gè)類(lèi)也可以出現(xiàn)在幾張類(lèi)圖中。1. 定義類(lèi)UML中類(lèi)的圖形符號(hào)為長(zhǎng)方形,用兩條橫線把長(zhǎng)方形分成上、中、下3個(gè)區(qū)域(下面兩個(gè)區(qū)域可省略),3個(gè)區(qū)域分別放類(lèi)的名字、屬性和服務(wù),如圖9.5所示。表示類(lèi)&對(duì)象的圖形符號(hào)n類(lèi)&對(duì)象:一個(gè)類(lèi)及屬于該類(lèi)的對(duì)象。類(lèi)
29、名屬性服務(wù)類(lèi)名屬性服務(wù)類(lèi)&對(duì)象符號(hào) 類(lèi)的圖形符號(hào) 名字應(yīng)該是富于描述性的、簡(jiǎn)潔而且無(wú)二義性的2. 定義屬性UML描述屬性的語(yǔ)法格式如下:可見(jiàn)性 屬性名: 類(lèi)型名=初值性質(zhì)串可見(jiàn)性(即可訪問(wèn)性)有3種:公有的(public)、私有的(private)和保護(hù)的(protected),分別用加號(hào)(+)、減號(hào)(-)和井號(hào)(#)表示。n如果未聲明可見(jiàn)性,則表示該屬性的可見(jiàn)性尚未定義。注意,沒(méi)有默認(rèn)的可見(jiàn)性。n屬性名和類(lèi)型名之間用冒號(hào)(:)分隔。類(lèi)型名表示該屬性的數(shù)據(jù)類(lèi)型,它可以是基本數(shù)據(jù)類(lèi)型,也可以是用戶(hù)自定義的類(lèi)型。在創(chuàng)建類(lèi)的實(shí)例時(shí)應(yīng)給其屬性賦值,如果給某個(gè)屬性定義了初值,則該初值可作為創(chuàng)建實(shí)
30、例時(shí)這個(gè)屬性的默認(rèn)值。類(lèi)型名和初值之間用等號(hào)(=)隔開(kāi)。用花括號(hào)括起來(lái)的性質(zhì)串明確地列出該屬性所有可能的取值。枚舉類(lèi)型的屬性往往用性質(zhì)串列出可以選用的枚舉值,不同枚舉值之間用逗號(hào)分隔。也可以用性質(zhì)串說(shuō)明屬性的其他性質(zhì),例如,約束說(shuō)明只讀表明該屬性是只讀屬性。例如,“發(fā)貨單”類(lèi)的屬性“管理員”,在UML類(lèi)圖中像下面那樣描述:-管理員: String=“未定”類(lèi)的屬性中還可以有一種能被該類(lèi)所有對(duì)象共享的屬性,稱(chēng)為類(lèi)的作用域?qū)傩?,也稱(chēng)為類(lèi)變量。C+語(yǔ)言中的靜態(tài)數(shù)據(jù)成員就是這樣的屬性。類(lèi)變量在類(lèi)圖中表示為帶下劃線的屬性,例如,發(fā)貨單類(lèi)的類(lèi)變量“貨單數(shù)”,用來(lái)統(tǒng)計(jì)發(fā)貨單的總數(shù),在該類(lèi)所有對(duì)象中這個(gè)屬性的
31、值都是一樣的,下面是對(duì)這個(gè)屬性的描述:-貨單數(shù): Integer3. 定義服務(wù)服務(wù)也就是操作,UML描述操作的語(yǔ)法格式如下:可見(jiàn)性操作名(參數(shù)表): 返回值類(lèi)型性質(zhì)串操作可見(jiàn)性的定義方法與屬性相同。參數(shù)表是用逗號(hào)分隔的形式參數(shù)的序列。描述一個(gè)參數(shù)的語(yǔ)法如下:參數(shù)名: 類(lèi)型名=默認(rèn)值當(dāng)操作的調(diào)用者未提供實(shí)在參數(shù)時(shí),該參數(shù)就使用默認(rèn)值。與屬性類(lèi)似,在類(lèi)中也可定義類(lèi)作用域操作,在類(lèi)圖中表示為帶下劃線的操作。這種操作只能存取本類(lèi)的類(lèi)作用域?qū)傩浴?.4.2 表示關(guān)系的符號(hào)類(lèi)圖由類(lèi)及類(lèi)與類(lèi)之間的關(guān)系組成。定義了類(lèi)之后就可以定義類(lèi)與類(lèi)之間的各種關(guān)系了。類(lèi)與類(lèi)之間通常有關(guān)聯(lián)、泛化(繼承)、依賴(lài)和細(xì)化等4種關(guān)系
32、。1. 關(guān)聯(lián)關(guān)聯(lián)表示兩個(gè)類(lèi)的對(duì)象之間存在某種語(yǔ)義上的聯(lián)系。例如,作家使用計(jì)算機(jī),我們就認(rèn)為在作家和計(jì)算機(jī)之間存在某種語(yǔ)義連接,因此,在類(lèi)圖中應(yīng)該在作家類(lèi)和計(jì)算機(jī)類(lèi)之間建立關(guān)聯(lián)關(guān)系。(1) 普通關(guān)聯(lián)只要在類(lèi)與類(lèi)之間存在連接關(guān)系就可以用普通關(guān)聯(lián)表示。圖示符號(hào)是連接兩個(gè)類(lèi)之間的直線,如圖9.6所示。通常關(guān)聯(lián)是雙向的,可在一個(gè)方向上為關(guān)聯(lián)起一個(gè)名字,在另一個(gè)方向上起另一個(gè)名字(也可不起名字)。為避免混淆,在名字前面(或后面)加一個(gè)表示關(guān)聯(lián)方向的黑三角。在表示關(guān)聯(lián)的直線兩端可以寫(xiě)上重?cái)?shù),它表示該類(lèi)有多少個(gè)對(duì)象與對(duì)方的一個(gè)對(duì)象連接。重?cái)?shù)的表示方法通常有:01表示0到1個(gè)對(duì)象0*或*表示0到多個(gè)對(duì)象1+或1
33、*表示1到多個(gè)對(duì)象115表示1到15個(gè)對(duì)象3表示3個(gè)對(duì)象如果圖中未明確標(biāo)出關(guān)聯(lián)的重?cái)?shù),則默認(rèn)重?cái)?shù)是1。(2) 關(guān)聯(lián)的角色在任何關(guān)聯(lián)中都會(huì)涉及到參與此關(guān)聯(lián)的對(duì)象所扮演的角色(即起的作用),顯式標(biāo)明角色名有助于別人理解類(lèi)圖。例如圖9.7是一個(gè)遞歸關(guān)遞歸關(guān)聯(lián)聯(lián)(即一個(gè)類(lèi)與它本身有關(guān)聯(lián)關(guān)系)的例子。如果沒(méi)有顯式標(biāo)出角色名,則意味著用類(lèi)名作為角色名。(3) 限定關(guān)聯(lián)限定關(guān)聯(lián)可以把模型中的重?cái)?shù)從一對(duì)多變成一對(duì)一,或從多對(duì)多簡(jiǎn)化成多對(duì)一。在類(lèi)圖中把限定詞放在關(guān)聯(lián)關(guān)系末端的一個(gè)小方框內(nèi)。例如,某操作系統(tǒng)中一個(gè)目錄下有許多文件,一個(gè)文件僅屬于一個(gè)目錄,在一個(gè)目錄內(nèi)文件名確定了惟一一個(gè)文件。圖9.8利用限定詞“文
34、件名”表示了目錄與文件之間的關(guān)系,可見(jiàn),利用限定詞把一對(duì)多關(guān)系簡(jiǎn)化成了一對(duì)一關(guān)系。圖9.8 一個(gè)受限的關(guān)聯(lián)限定提高了語(yǔ)義精確性,增強(qiáng)了查詢(xún)能力。圖中限定的語(yǔ)法表明,文件名在其目錄內(nèi)是惟一的。因此,查找一個(gè)文件的方法就是,首先定下目錄,然后在該目錄內(nèi)查找指定的文件名。由于目錄加文件名可惟一地確定一個(gè)文件,因此,限定詞“文件名”應(yīng)該放在靠近目錄的那一端。(4) 關(guān)聯(lián)類(lèi)引入一個(gè)關(guān)聯(lián)類(lèi)來(lái)記錄說(shuō)明關(guān)聯(lián)的性質(zhì)需要的一些附加信息。關(guān)聯(lián)中的每個(gè)連接與關(guān)聯(lián)類(lèi)的一個(gè)對(duì)象相聯(lián)系。關(guān)聯(lián)類(lèi)通過(guò)一條虛線與關(guān)聯(lián)連接。隊(duì)列就是電梯控制器類(lèi)與電梯類(lèi)的關(guān)聯(lián)關(guān)系上的關(guān)聯(lián)類(lèi)。圖9.9 電梯系統(tǒng)的類(lèi)模型從圖中可以看出,一個(gè)電梯控制器控
35、制著4臺(tái)電梯,這樣控制器和電梯之間的實(shí)際連接就有4個(gè),每個(gè)連接都對(duì)應(yīng)一個(gè)隊(duì)列(對(duì)象),每個(gè)隊(duì)列(對(duì)象)存儲(chǔ)著來(lái)自控制器和電梯內(nèi)部按鈕的請(qǐng)求服務(wù)信息。電梯控制器通過(guò)讀取隊(duì)列信息,選擇一個(gè)合適的電梯為乘客服務(wù)。關(guān)聯(lián)類(lèi)與一般的類(lèi)一樣,也有屬性、操作和關(guān)聯(lián)。2. 聚集聚集也稱(chēng)為聚合,是關(guān)聯(lián)的特例。聚集表示類(lèi)與類(lèi)之間的關(guān)系是整體與部分的關(guān)系。在陳述需求時(shí)使用的“包含”、“組成”、“分為部分”等字句,往往意味著存在聚集關(guān)系。除了一般聚集之外,還有兩種特殊的聚集關(guān)系,分別是共享聚集和組合聚集。(1) 共享聚集如果在聚集關(guān)系中處于部分方的對(duì)象可同時(shí)參與多個(gè)處于整體方對(duì)象的構(gòu)成,則該聚集稱(chēng)為共享聚集。一般聚集和
36、共享聚集的圖示符號(hào),都是在表示關(guān)聯(lián)關(guān)系的直線末端緊挨著整體類(lèi)的地方畫(huà)一個(gè)空心菱形。例如,一個(gè)課題組包含許多成員,每個(gè)成員又可以是另一個(gè)課題組的成員,則課題組和成員之間是共享聚集關(guān)系,如圖所示。(2) 組合聚集如果部分類(lèi)完全隸屬于整體類(lèi),部分與整體共存,整體不存在了部分也會(huì)隨之消失(或失去存在價(jià)值了),則該聚集稱(chēng)為組合聚集(簡(jiǎn)稱(chēng)為組成)。組成關(guān)系用實(shí)心菱形表示:3. 泛化UML中的泛化關(guān)系即繼承關(guān)系,是通用元素和具體元素之間的一種分類(lèi)關(guān)系。具體元素完全擁有通用元素的信息,且還可以附加一些其他信息。在UML中,用一端為空心三角形的連線表示泛化關(guān)系,三角形的頂角緊挨著通用元素。注意,泛化針對(duì)類(lèi)型而不
37、針對(duì)實(shí)例,一個(gè)類(lèi)可以繼承另一個(gè)類(lèi),但一個(gè)對(duì)象不能繼承另一個(gè)對(duì)象。實(shí)際上,泛化關(guān)系指出在類(lèi)與類(lèi)之間存在“一般-特殊”關(guān)系。泛化可進(jìn)一步劃分成普通泛化和受限泛化。(1) 普通泛化普通泛化與繼承基本相同。沒(méi)有具體對(duì)象的類(lèi)稱(chēng)為抽象類(lèi)。抽象類(lèi)通常作為父類(lèi),用于描述其他類(lèi)(子類(lèi))的公共屬性和行為。圖示抽象類(lèi)時(shí),在類(lèi)名下方附加一個(gè)標(biāo)記值abstract。抽象類(lèi)通常都具有抽象操作。抽象操作僅用來(lái)指定該類(lèi)的所有子類(lèi)應(yīng)具有哪些行為。抽象操作的圖示方法與抽象類(lèi)相似,在操作標(biāo)記后面跟隨一個(gè)性質(zhì)串a(chǎn)bstract。折角矩形是模型元素“筆記”的符號(hào),文字是注釋?zhuān)謩e說(shuō)明兩個(gè)子類(lèi)的操作drive的功能具體類(lèi)有自己的對(duì)象,并
38、且操作都有具體的實(shí)現(xiàn)方法。抽象類(lèi)泛化圖9.13 復(fù)雜類(lèi)圖示例(2) 受限泛化可以給泛化關(guān)系附加約束條件,以進(jìn)一步說(shuō)明該泛化關(guān)系的使用方法或擴(kuò)充方法,這樣的泛化關(guān)系稱(chēng)為受限泛化。預(yù)定義的約束有4種: 多重、不相交、完全和不完全。這些約束都是語(yǔ)義約束。多重繼承多重繼承指的是,一個(gè)子類(lèi)可以同時(shí)多次繼承同一個(gè)上層基類(lèi),例如圖9.14中的水陸兩用類(lèi)繼承了兩次交通工具類(lèi)。不相交繼承不相交繼承,即一個(gè)子類(lèi)不能多次繼承同一個(gè)基類(lèi)。如果圖中沒(méi)有指定多重約束,則是不相交繼承,一般的繼承都是不相交繼承。圖9.14 多重繼承示例完全繼承完全繼承指的是父類(lèi)的所有子類(lèi)都已在類(lèi)圖中窮舉出來(lái)了,圖示符號(hào)是指定完全約束。不完全
39、繼承不完全繼承與完全繼承恰好相反,父類(lèi)的子類(lèi)并沒(méi)有都窮舉出來(lái),隨著對(duì)問(wèn)題理解的深入,可不斷補(bǔ)充和維護(hù),這為日后系統(tǒng)的擴(kuò)充和維護(hù)帶來(lái)很大方便。不完全繼承是一般情況下默認(rèn)的繼承關(guān)系。4. 依賴(lài)和細(xì)化(1) 依賴(lài)關(guān)系依賴(lài)關(guān)系描述兩個(gè)模型元素(類(lèi)、用例等)之間的語(yǔ)義連接關(guān)系: 其中一個(gè)模型元素是獨(dú)立的,另一個(gè)模型元素不是獨(dú)立的,它依賴(lài)于獨(dú)立的模型元素,如果獨(dú)立的模型元素改變了,將影響依賴(lài)于它的模型元素。如:一個(gè)類(lèi)向另一個(gè)類(lèi)發(fā)送消息,一個(gè)類(lèi)是另一個(gè)類(lèi)的數(shù)據(jù)成員,一個(gè)類(lèi)是另一個(gè)類(lèi)的某個(gè)操作參數(shù)等。圖9.15 友元依賴(lài)關(guān)系在類(lèi)圖中,用帶箭頭的虛線帶箭頭的虛線連接有依賴(lài)關(guān)系的兩個(gè)類(lèi),箭頭指向獨(dú)立的類(lèi)。在虛線上
40、可以帶一個(gè)版類(lèi)標(biāo)簽,具體說(shuō)明依賴(lài)的種類(lèi).該關(guān)系使得B類(lèi)的操作可以使用A類(lèi)中私有的或保護(hù)的成員。(2) 細(xì)化關(guān)系假設(shè)兩個(gè)模型元素A和B描述同一個(gè)事物,它們的區(qū)別是抽象層次不同,如果B是在A的基礎(chǔ)上的更詳細(xì)的描述,則稱(chēng)B細(xì)化了A,或稱(chēng)A細(xì)化成了B。圖示符號(hào)為由元素B指向元素A的、一端為空心三角形的虛線空心三角形的虛線,如圖9.16所示。細(xì)化用來(lái)協(xié)調(diào)不同階段模型之間的關(guān)系,表示各個(gè)開(kāi)發(fā)階段不同抽象層次的模型之間的相關(guān)性,常常用于跟蹤模型的演變。概念層說(shuō)明層實(shí)現(xiàn)層類(lèi)圖分為3個(gè)抽象層次需求分析階段,描述應(yīng)用領(lǐng)域的概念設(shè)計(jì)階段,描述類(lèi)與類(lèi)之間的接口需求分析階段,描述軟件系統(tǒng)中的實(shí)現(xiàn) 接口可能因?yàn)閷?shí)現(xiàn)環(huán)境、
41、運(yùn)行特性或用戶(hù)的不同而具有多種實(shí)現(xiàn)9.5 動(dòng)態(tài)模型建立起對(duì)象模型之后,就需要考察對(duì)象的動(dòng)態(tài)行為n每個(gè)類(lèi)的動(dòng)態(tài)行為用一張狀態(tài)圖來(lái)描繪,各個(gè)類(lèi)的狀態(tài)圖通過(guò)共享事件合并起來(lái),從而構(gòu)成系統(tǒng)的動(dòng)態(tài)模型。動(dòng)態(tài)模型是基于事件共享而互相關(guān)聯(lián)的一組狀態(tài)圖的集合。術(shù)語(yǔ)n狀態(tài)狀態(tài):是對(duì)象在其生命周期中的某個(gè)特定階段所處的某種情形,它是對(duì)影響對(duì)象行為的屬性值的一種抽象。各對(duì)象之間相互觸發(fā)(即作用)就形成了一系列的狀態(tài)變化。n事件事件:一個(gè)觸發(fā)行為,它是對(duì)引起對(duì)象從一種狀態(tài)轉(zhuǎn)換到另一種狀態(tài)的現(xiàn)實(shí)世界中的事件的抽象。對(duì)象對(duì)事件的響應(yīng),取決于接受該觸發(fā)的對(duì)象當(dāng)時(shí)所處的狀態(tài),響應(yīng)包括改變自己的狀態(tài)或者又形成一個(gè)新的觸發(fā)行為。
42、n狀態(tài)與事件密不可分,一個(gè)事件分開(kāi)兩個(gè)狀態(tài),一個(gè)狀態(tài)隔開(kāi)兩個(gè)事件。事件表示時(shí)刻,狀態(tài)代表時(shí)間間隔。9.6 功能模型n表示變化的系統(tǒng)的“功能”性質(zhì),它指明了系統(tǒng)應(yīng)該“做什么”,因此更直接地反映了用戶(hù)對(duì)目標(biāo)系統(tǒng)的需求。n建立功能模型有助于軟件開(kāi)發(fā)人員更深入地理解問(wèn)題域,改進(jìn)和完善自己的設(shè)計(jì)。n通常,功能模型由一組數(shù)據(jù)流圖數(shù)據(jù)流圖組成,9.6.1 用例圖nUML提供的用例圖用例圖也是進(jìn)行需求分析和建立功能模型的強(qiáng)有力工具。在UML中把用用例圖建立起來(lái)的系統(tǒng)模型稱(chēng)為用例模型。一幅用例圖包含一幅用例圖包含的模型元素有系的模型元素有系統(tǒng)、行為者、用統(tǒng)、行為者、用例及用例之間的例及用例之間的關(guān)系。關(guān)系。圖圖
43、9.17是自動(dòng)售貨是自動(dòng)售貨機(jī)系統(tǒng)的用例圖。機(jī)系統(tǒng)的用例圖。1. 系統(tǒng)系統(tǒng)被看作是一個(gè)提供用例的黑盒子,內(nèi)部如何工作、用例如何實(shí)現(xiàn),這些對(duì)于建立用例模型來(lái)說(shuō)都是不重要的。代表系統(tǒng)的方框的邊線表示系統(tǒng)的邊界,用于劃定系統(tǒng)的功能范圍,定義了系統(tǒng)所具有的功能。描述該系統(tǒng)功能的用例置于方框內(nèi),代表外部實(shí)體的行為者置于方框外。2. 用例在UML中把用例定義成系統(tǒng)完成的一系列動(dòng)作,動(dòng)作的結(jié)果能被特定的行為者察覺(jué)到。這些動(dòng)作除了完成系統(tǒng)內(nèi)部的計(jì)算與工作外,還包括與一些行為者的通信。用例通過(guò)關(guān)聯(lián)與行為者連接,關(guān)聯(lián)指出一個(gè)用例與哪些行為者交互,這種交互是雙向的。用例具有下述特征:(1) 用例代表某些用戶(hù)可見(jiàn)的功
44、能,實(shí)現(xiàn)一個(gè)具體的用戶(hù)目標(biāo);(2) 用例總是被行為者啟動(dòng)的,并向行為者提供可識(shí)別的值;(3) 用例必須是完整的。n 用例是一個(gè)類(lèi),它代表一類(lèi)功能而不是使用該功能的某個(gè)具體實(shí)例。n 用例的實(shí)例是系統(tǒng)的一種實(shí)際使用方法,通常把用例的實(shí)例稱(chēng)為腳本。腳本是系統(tǒng)的一次具體執(zhí)行過(guò)程。3. 行為者n 指使用用例并且與系統(tǒng)交互的人或其他系統(tǒng),它代表外部實(shí)體。n 行為者代表一種角色,而不是某個(gè)具體的人或物,一個(gè)具體的人可以充當(dāng)多種不同角色。n 在用例圖中用直線連接行為者和用例,表示兩者之間交換信息,稱(chēng)為通信聯(lián)系。行為者觸發(fā)(激活)用例,并與用例交換信息。n 單個(gè)行為者可與多個(gè)用例聯(lián)系;反之,一個(gè)用例也可與多個(gè)行
45、為者聯(lián)系,不同行為者起的作用也不同??梢园研袨檎叻殖芍餍袨檎吆透毙袨檎?,還可分成主動(dòng)行為者和被動(dòng)行為者。n 實(shí)踐表明,行為者對(duì)確定用例是非常有用的。面對(duì)一個(gè)大型、復(fù)雜的系統(tǒng),要列出用例清單往往很困難,可以先列出行為者清單,再針對(duì)每個(gè)行為者列出它的用例。這樣做可以比較容易地建立起用例模型。4. 用例之間的關(guān)系UML用例之間主要有擴(kuò)展和使用兩種關(guān)系,它們是泛化關(guān)系的兩種不同形式。(1) 擴(kuò)展關(guān)系向一個(gè)用例中添加一些動(dòng)作后構(gòu)成了另一個(gè)用例,后者繼承前者的一些行為,通常把后者稱(chēng)為擴(kuò)展用例。(2) 使用關(guān)系如果在若干個(gè)用例中有某些相同的動(dòng)作,則可以把這些相同的動(dòng)作提取出來(lái)單獨(dú)構(gòu)成一個(gè)抽象用例。當(dāng)某個(gè)用例
46、使用該抽象用例時(shí),就好像包含了抽象用例中的所有動(dòng)作。擴(kuò)展與使用之間的異同:n這兩種關(guān)系都意味著從幾個(gè)用例中抽取那些公共的行為并放入一個(gè)單獨(dú)的用例中,而這個(gè)用例被其他用例使用或擴(kuò)展,但是,使用和擴(kuò)展的目的是不同的。n通常在描述一般行為的變化時(shí)采用擴(kuò)展關(guān)系;在兩個(gè)或多個(gè)用例中出現(xiàn)重復(fù)描述又想避免這種重復(fù)時(shí),可以采用使用關(guān)系。9.6.2 用例建模獲取用例是需求分析階段首先要做的主要工作之一。大部分用例將在項(xiàng)目的需求分析階段產(chǎn)生,并且隨著開(kāi)發(fā)工作的深入還會(huì)發(fā)現(xiàn)更多用例,這些新發(fā)現(xiàn)的用例都應(yīng)及時(shí)補(bǔ)充進(jìn)已有的用例集中。用例集中的每個(gè)用例都是對(duì)系統(tǒng)的一個(gè)潛在的需求。一個(gè)用例模型用例模型由若干幅用例圖組成。創(chuàng)建用例模型的工作包括: 定義系統(tǒng),尋找行為者和用例,描述用例,定義用例之間的關(guān)系,確認(rèn)模型。其中,尋找行為者和用例是關(guān)鍵。1. 尋找行為者為獲取用例首先要找出系統(tǒng)的行為者,可以通過(guò)請(qǐng)系統(tǒng)的用戶(hù)回答一些問(wèn)題的辦法來(lái)發(fā)現(xiàn)行為者。下述問(wèn)題有助于發(fā)現(xiàn)行為者:誰(shuí)將使用系統(tǒng)的主要功能(主行為者)?誰(shuí)需要借助系統(tǒng)的支持來(lái)完成日常工作?誰(shuí)來(lái)維護(hù)和管理系統(tǒng)(副行為者)?系統(tǒng)控制哪些硬件設(shè)備?系統(tǒng)需要與哪些其他系統(tǒng)交互?哪些人或系統(tǒng)對(duì)本系統(tǒng)產(chǎn)生的結(jié)果(值)感興趣?2. 尋找用例一旦找到了行為者,就可以通過(guò)請(qǐng)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)離婚合同全文
- 新能源汽車(chē)銷(xiāo)售代理合同
- 商品房買(mǎi)賣(mài)合同示例
- 畢業(yè)生檔案托管合同協(xié)議書(shū)
- 廣告投放合同「樣本」
- 多人合伙經(jīng)營(yíng)合同范例大全
- 屋頂防水修繕項(xiàng)目合同
- 戶(hù)外廣告LED大屏租賃合同
- 稻谷購(gòu)銷(xiāo)合同樣本
- 腎性貧血的治療課件
- 團(tuán)意操作流程詳解課件
- SH/T 0356-1996燃料油
- GB/T 9846.4-2004膠合板第4部分:普通膠合板外觀分等技術(shù)條件
- GB/T 17836-1999通用航空機(jī)場(chǎng)設(shè)備設(shè)施
- GB/T 13012-2008軟磁材料直流磁性能的測(cè)量方法
- 2023年全國(guó)高中生物聯(lián)賽競(jìng)賽試題和答案
- 第1課中華優(yōu)秀傳統(tǒng)文化的內(nèi)涵與特點(diǎn)課件(共28張PPT)
- 男襯衫縫制工藝課件
- 小學(xué)語(yǔ)文中高學(xué)段單元整體教學(xué)的實(shí)踐研究課題中期報(bào)告
- 《木蘭詩(shī)》第二課時(shí)(公開(kāi)課)課件
- 核電項(xiàng)目人橋吊車(chē)抗震計(jì)算書(shū)版
評(píng)論
0/150
提交評(píng)論