




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章面向?qū)ο蠓治?.1分析過(guò)程9.2需求陳述9.3建立對(duì)象模型9.4建立動(dòng)態(tài)模型9.5建立功能模型9.6定義服務(wù)9.7面向?qū)ο蠓治鰧?shí)例9.8小結(jié) 9.1分析過(guò)程
9.1.1概述
面向?qū)ο蠓治鼍褪浅槿『驼碛脩粜枨蟛⒔?wèn)題域精確模型的過(guò)程。
通常,面向?qū)ο蠓治鲞^(guò)程從分析陳述用戶需求的文件開(kāi)始??赡苡捎脩?包括出資開(kāi)發(fā)該軟件的業(yè)主代表及最終用戶)單方面寫出需求陳述,也可能由系統(tǒng)分析員配合用戶,共同寫出需求陳述。當(dāng)軟件項(xiàng)目采用招標(biāo)方式確定開(kāi)發(fā)單位時(shí),“標(biāo)書”往往可以作為初步的需求陳述。需求陳述通常是不完整、不準(zhǔn)確的,而且往往是非正式的。通過(guò)分析,可以發(fā)現(xiàn)和改正原始陳述中的二義性和不一致性,補(bǔ)充遺漏的內(nèi)容,從而使需求陳述更完整、更準(zhǔn)確。因此,不應(yīng)該認(rèn)為需求陳述是一成不變的,而應(yīng)該把它作為細(xì)化和完善實(shí)際需求的基礎(chǔ)。在分析需求陳述的過(guò)程中,系統(tǒng)分析員需要反復(fù)多次地與用戶協(xié)商、討論、交流信息,還應(yīng)該調(diào)研,了解現(xiàn)有的類似的系統(tǒng)。正如以前多次講過(guò)的,快速建立起一個(gè)可在計(jì)算機(jī)上運(yùn)行的原型系統(tǒng),非常有助于分析員和用戶之間的交流和理解,從而能更正確地提煉出用戶的需求。接下來(lái),系統(tǒng)分析員應(yīng)該深入理解用戶需求,抽象出目標(biāo)系統(tǒng)的本質(zhì)屬性,并用模型準(zhǔn)確地表示出來(lái)。用自然語(yǔ)言書寫的需求陳述,通常是有二義性的,內(nèi)容往往不完整、不一致。分析模型應(yīng)該成為對(duì)問(wèn)題的精確而又簡(jiǎn)潔的表示。后續(xù)的設(shè)計(jì)階段將以分析模型為基礎(chǔ)。通過(guò)建立分析模型,能夠糾正在開(kāi)發(fā)早期對(duì)問(wèn)題域的誤解。
在面向?qū)ο蠼5倪^(guò)程中,系統(tǒng)分析員必須認(rèn)真向領(lǐng)域?qū)<覍W(xué)習(xí),因?yàn)榻_^(guò)程,尤其是分類工作往往有很大難度。繼承關(guān)系的建立實(shí)質(zhì)上是知識(shí)抽取的過(guò)程,它必須反映出一定深度的領(lǐng)域知識(shí),這不是系統(tǒng)分析員單方面努力所能做到的,必須有領(lǐng)域?qū)<业拿芮信浜喜拍芡瓿?。在面向?qū)ο蠼5倪^(guò)程中,還應(yīng)該仔細(xì)研究以前針對(duì)相同的或類似的問(wèn)題域進(jìn)行的面向?qū)ο蠓治鏊玫降慕Y(jié)果。由于面向?qū)ο蠓治鼋Y(jié)果的穩(wěn)定性和可重用性,這些結(jié)果在當(dāng)前項(xiàng)目中往往有許多是可以重用的。9.1.2三個(gè)子模型與五個(gè)層次
面向?qū)ο蠼5玫降哪P桶到y(tǒng)的三個(gè)要素,即靜態(tài)結(jié)構(gòu)(對(duì)象模型)、交互次序(動(dòng)態(tài)模型)和數(shù)據(jù)變換(功能模型)。解決的問(wèn)題不同,這三個(gè)子模型的重要程度也不同:幾乎解決任何一個(gè)問(wèn)題,都需要從客觀世界實(shí)體及實(shí)體間的相互關(guān)系中抽象出極有價(jià)值的對(duì)象模型;當(dāng)問(wèn)題涉及交互作用和時(shí)序時(shí)(例如用戶界面及過(guò)程控制等),動(dòng)態(tài)模型是重要的;解決運(yùn)算量很大的問(wèn)題時(shí)(例如高級(jí)語(yǔ)言編譯、科學(xué)與工程計(jì)算等),則涉及重要的功能模型。動(dòng)態(tài)模型和功能模型中都包含了對(duì)象模型中的操作(即服務(wù)或方法)。復(fù)雜問(wèn)題(大型系統(tǒng))的對(duì)象模型通常由下述五個(gè)層次組成:主題層(也稱為范疇層)、類與對(duì)象層、結(jié)構(gòu)層、屬性層和服務(wù)層。
這五個(gè)層次很像疊在一起的五張透明塑料片,它們一層比一層顯現(xiàn)出對(duì)象模型的更多細(xì)節(jié)。在概念上,這五個(gè)層次是整個(gè)模型的五張水平切片。
在本書前面章節(jié)中已經(jīng)講述了類與對(duì)象(即UML的“類”)、結(jié)構(gòu)(即類或?qū)ο笾g的關(guān)系)、屬性和服務(wù)的概念,現(xiàn)在再簡(jiǎn)要地介紹一下主題(或范疇)的概念。主題是指導(dǎo)讀者(包括系統(tǒng)分析員、軟件設(shè)計(jì)人員、領(lǐng)域?qū)<?、管理人員、用戶等,總之,“讀者”泛指所有需要讀懂系統(tǒng)模型的人)理解大型、復(fù)雜模型的一種機(jī)制。也就是說(shuō),通過(guò)劃分主題,把一個(gè)大型、復(fù)雜的對(duì)象模型分解成幾個(gè)不同的概念范疇。心理研究表明,人類的短期記憶能力一般限于一次記憶5~9個(gè)對(duì)象,這就是著名的7±2原則。面向?qū)ο蠓治鰪南率鰞蓚€(gè)方面來(lái)體現(xiàn)這條原則:控制可見(jiàn)性和指導(dǎo)讀者的注意力。
首先,面向?qū)ο蠓治鐾ㄟ^(guò)控制讀者能見(jiàn)到的層次數(shù)目來(lái)控制可見(jiàn)性。其次,面向?qū)ο蠓治鲈黾恿艘粋€(gè)主題層,它可以從一個(gè)相當(dāng)高的層次描述總體模型,并對(duì)讀者的注意力加以指導(dǎo)。上述五個(gè)層次對(duì)應(yīng)著在面向?qū)ο蠓治鲞^(guò)程中建立對(duì)象模型的五項(xiàng)主要活動(dòng):找出類與對(duì)象;識(shí)別結(jié)構(gòu);識(shí)別主題;定義屬性;定義服務(wù)。必須強(qiáng)調(diào)指出的是,我們說(shuō)的是“五項(xiàng)活動(dòng)”,而沒(méi)有說(shuō)五個(gè)步驟。事實(shí)上,這五項(xiàng)工作完全沒(méi)有必要順序完成,也無(wú)須徹底完成一項(xiàng)工作以后再開(kāi)始另外一項(xiàng)工作。雖然這五項(xiàng)活動(dòng)的抽象層次不同,但是在進(jìn)行面向?qū)ο蠓治鰰r(shí)并不需要嚴(yán)格遵守自頂向下的原則。人們往往喜歡先在一個(gè)較高的抽象層次上工作,如果在思考過(guò)程中突然想到一個(gè)具體事物,就會(huì)把注意力轉(zhuǎn)移到深入分析發(fā)掘這個(gè)具體領(lǐng)域上,然后又返回到原先所在的較高的抽象層次。例如,分析員找出一個(gè)類與對(duì)象,想到在這個(gè)類中應(yīng)該包含的一個(gè)服務(wù),于是把這個(gè)服務(wù)的名字寫在服務(wù)層,然后又返回到類與對(duì)象層,繼續(xù)尋找問(wèn)題域中的另一個(gè)類與對(duì)象。通常在完整地定義每個(gè)類中的服務(wù)之前,需要先建立起動(dòng)態(tài)模型和功能模型,通過(guò)對(duì)這兩種模型的研究,能夠更正確、更合理地確定每個(gè)類應(yīng)該提供哪些服務(wù)。
綜上所述,在概念上可以認(rèn)為,面向?qū)ο蠓治龃篌w上按照下列順序進(jìn)行:尋找類與對(duì)象、識(shí)別結(jié)構(gòu)、識(shí)別主題、定義屬性、建立動(dòng)態(tài)模型、建立功能模型、定義服務(wù)。但是,正如前面已經(jīng)多次強(qiáng)調(diào)指出過(guò)的,分析不可能嚴(yán)格地按照預(yù)定順序進(jìn)行,大型、復(fù)雜系統(tǒng)的模型需要反復(fù)構(gòu)造多遍才能建成。通常,先構(gòu)造出模型的子集,然后再逐漸擴(kuò)充,直到完全、充分地理解了整個(gè)問(wèn)題,才能最終把模型建立起來(lái)。分析也不是一個(gè)機(jī)械的過(guò)程。大多數(shù)需求陳述都缺乏必要的信息,所缺少的信息主要從用戶和領(lǐng)域?qū)<夷抢铽@取,同時(shí)也需要從分析員對(duì)問(wèn)題域的背景知識(shí)中提取。在分析過(guò)程中,系統(tǒng)分析員必須與領(lǐng)域?qū)<壹坝脩舴磸?fù)交流,以便澄清二義性,改正錯(cuò)誤的概念,補(bǔ)足缺少的信息。面向?qū)ο蠼⒌南到y(tǒng)模型,盡管在最終完成之前還是不準(zhǔn)確、不完整的,但對(duì)做到準(zhǔn)確、無(wú)歧義的交流仍然是大有益處的。 9.2需求陳述
9.2.1書寫要點(diǎn)
通常,需求陳述的內(nèi)容包括:?jiǎn)栴}范圍、功能需求、性能需求、應(yīng)用環(huán)境及假設(shè)條件等??傊?,需求陳述應(yīng)該闡明“做什么”而不是“怎樣做”。它應(yīng)該描述用戶的需求而不是提出解決問(wèn)題的方法;應(yīng)該指出哪些是系統(tǒng)必要的性質(zhì),哪些是任選的性質(zhì);應(yīng)該避免對(duì)設(shè)計(jì)策略施加過(guò)多的約束,也不要描述系統(tǒng)的內(nèi)部結(jié)構(gòu),因?yàn)檫@樣做將限制實(shí)現(xiàn)的靈活性。對(duì)系統(tǒng)性能及系統(tǒng)與外界環(huán)境交互協(xié)議的描述,是合適的需求。此外,對(duì)采用的軟件工程標(biāo)準(zhǔn)、模塊構(gòu)造準(zhǔn)則、將來(lái)可能做的擴(kuò)充以及可維護(hù)性要求等方面的描述,也都是適當(dāng)?shù)男枨?。書寫需求陳述時(shí),要盡力做到語(yǔ)法正確,而且應(yīng)該慎重選用名詞、動(dòng)詞、形容詞和同義詞。
不少用戶書寫的需求陳述,都把實(shí)際需求和設(shè)計(jì)決策混為一談。系統(tǒng)分析員必須把需求與實(shí)現(xiàn)策略區(qū)分開(kāi),后者是一類偽需求,分析員至少應(yīng)該認(rèn)識(shí)到它們不是問(wèn)題域的本質(zhì)性質(zhì)。
需求陳述可簡(jiǎn)可繁。對(duì)人們熟悉的傳統(tǒng)問(wèn)題的陳述,可能相當(dāng)詳細(xì),相反,對(duì)陌生領(lǐng)域項(xiàng)目的需求,開(kāi)始時(shí)可能寫不出具體細(xì)節(jié)。絕大多數(shù)需求陳述都是有二義性的、不完整的,甚至不一致的。某些需求有明顯錯(cuò)誤,還有一些需求雖然表述得很準(zhǔn)確,但它們對(duì)系統(tǒng)行為存在不良影響或者實(shí)現(xiàn)起來(lái)造價(jià)太高。另外一些需求初看起來(lái)很合理,但卻并沒(méi)有真正反映用戶的需要。應(yīng)該看到,需求陳述僅僅是理解用戶需求的出發(fā)點(diǎn),它并不是一成不變的文檔,不能指望沒(méi)有經(jīng)過(guò)全面、深入分析的需求陳述是完整、準(zhǔn)確、有效的。隨后進(jìn)行的面向?qū)ο蠓治龅哪康模褪侨嫔钊氲乩斫鈫?wèn)題域和用戶的真實(shí)需求,建立起問(wèn)題域的精確模型。
系統(tǒng)分析員必須與用戶及領(lǐng)域?qū)<颐芮信浜?、協(xié)同工作,共同提煉和整理用戶需求。在這個(gè)過(guò)程中,很可能需要快速建立起原型系統(tǒng),以便與用戶更有效地交流。9.2.2例子
圖9.1所示的自動(dòng)取款機(jī)(ATM)系統(tǒng),是本書講述面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)時(shí)使用的實(shí)例。圖9.1ATM系統(tǒng)下面陳述對(duì)ATM系統(tǒng)的需求。
某銀行擬開(kāi)發(fā)一個(gè)自動(dòng)取款機(jī)系統(tǒng),它是一個(gè)由自動(dòng)取款機(jī)(ATM)、中央計(jì)算機(jī)、分行計(jì)算機(jī)及柜員終端組成的網(wǎng)絡(luò)系統(tǒng)。ATM和中央計(jì)算機(jī)由總行投資購(gòu)買??傂袚碛卸嗯_(tái)ATM,分別設(shè)在全市各主要街道上,分行負(fù)責(zé)提供分行計(jì)算機(jī)和柜員終端,柜員終端設(shè)在分行營(yíng)業(yè)廳及分行下屬的各個(gè)儲(chǔ)蓄所內(nèi)。該系統(tǒng)的軟件開(kāi)發(fā)成本由各個(gè)分行分?jǐn)偂?/p>
銀行柜員使用柜員終端處理儲(chǔ)戶提交的儲(chǔ)蓄事務(wù)。儲(chǔ)戶可以用現(xiàn)金或支票向自己擁有的某個(gè)賬戶內(nèi)存款或開(kāi)新賬戶,也可以從自己的賬戶中取款。通常,一個(gè)儲(chǔ)戶可能擁有多個(gè)賬戶。柜員負(fù)責(zé)把儲(chǔ)戶提交的存款或取款事務(wù)輸進(jìn)柜員終端,接收儲(chǔ)戶交來(lái)的現(xiàn)金或支票,或付給儲(chǔ)戶現(xiàn)金。柜員終端與相應(yīng)的分行計(jì)算機(jī)通信,分行計(jì)算機(jī)具體處理針對(duì)某個(gè)賬戶的事務(wù)并且維護(hù)賬戶。
擁有銀行賬戶的儲(chǔ)戶有權(quán)申請(qǐng)領(lǐng)取現(xiàn)金兌換卡,使用現(xiàn)金兌換卡可以通過(guò)ATM訪問(wèn)自己的賬戶。目前僅限于用現(xiàn)金兌換卡在ATM上提取現(xiàn)金(即取款),或查詢有關(guān)自己賬戶的信息(例如某個(gè)指定賬戶上的余額)。將來(lái)可能還要求使用ATM辦理轉(zhuǎn)賬、存款等事務(wù)。
所謂現(xiàn)金兌換卡,就是一張?zhí)刂频拇趴ǎ厦嬗蟹中写a和卡號(hào)。分行代碼唯一標(biāo)識(shí)總行下屬的一個(gè)分行,卡號(hào)確定了這張卡可以訪問(wèn)哪些賬戶。通常,一張卡可以訪問(wèn)儲(chǔ)戶的若干個(gè)賬戶,但是不一定能訪問(wèn)這個(gè)儲(chǔ)戶的全部賬戶。每張現(xiàn)金兌換卡僅屬于一個(gè)儲(chǔ)戶所有,但是,同一張卡可能有多個(gè)副本,因此,必須考慮同時(shí)在若干臺(tái)ATM上使用同樣的現(xiàn)金兌換卡的可能性。也就是說(shuō),系統(tǒng)應(yīng)該能夠處理并發(fā)的訪問(wèn)。
當(dāng)用戶把現(xiàn)金兌換卡插入ATM之后,ATM就與用戶交互,以獲取有關(guān)這次事務(wù)的信息,并與中央計(jì)算機(jī)交換關(guān)于事務(wù)的信息。首先,ATM要求用戶輸入密碼,接下來(lái)ATM把從這張卡上讀到的信息以及用戶輸入的密碼傳給中央計(jì)算機(jī),請(qǐng)求中央計(jì)算機(jī)核對(duì)這些信息并處理這次事務(wù)。中央計(jì)算機(jī)根據(jù)卡上的分行代碼確定這次事務(wù)與分行的對(duì)應(yīng)關(guān)系,并且委托相應(yīng)的分行計(jì)算機(jī)驗(yàn)證用戶密碼。如果用戶輸入的密碼是正確的,ATM就要求用戶選擇事務(wù)類型(取款、查詢等)。當(dāng)用戶選擇取款時(shí),ATM請(qǐng)求用戶輸入取款額。最后,ATM從現(xiàn)金出口吐出現(xiàn)金,并且打印出賬單交給用戶。
9.3建立對(duì)象模型
面向?qū)ο蠓治鍪滓墓ぷ魇墙?wèn)題域的對(duì)象模型。這個(gè)模型描述了現(xiàn)實(shí)世界中的“類與對(duì)象”以及它們之間的關(guān)系,表示了目標(biāo)系統(tǒng)的靜態(tài)數(shù)據(jù)結(jié)構(gòu)。靜態(tài)數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)用細(xì)節(jié)依賴較少,比較容易確定。當(dāng)用戶的需求變化時(shí),靜態(tài)數(shù)據(jù)結(jié)構(gòu)相對(duì)來(lái)說(shuō)比較穩(wěn)定。因此,用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)絕大多數(shù)軟件時(shí),首先都需要建立對(duì)象模型,然后再建立另外兩個(gè)子模型。
需求陳述、應(yīng)用領(lǐng)域的專業(yè)知識(shí)以及關(guān)于客觀世界的常識(shí),是建立對(duì)象模型時(shí)的主要信息來(lái)源。如前所述,對(duì)象模型通常有五個(gè)層次。典型的工作步驟是:首先確定對(duì)象類和關(guān)聯(lián)(因?yàn)樗鼈冇绊懴到y(tǒng)整體結(jié)構(gòu)和解決問(wèn)題的方法),對(duì)于大型復(fù)雜問(wèn)題還要進(jìn)一步劃分出若干個(gè)主題;然后給類和關(guān)聯(lián)增添屬性,以進(jìn)一步描述它們;接下來(lái)利用適當(dāng)?shù)睦^承關(guān)系進(jìn)一步合并和組織類。而對(duì)類中操作的最后確定,則需等到建立了動(dòng)態(tài)模型和功能模型之后,因?yàn)檫@兩個(gè)子模型更準(zhǔn)確地描述了對(duì)類中提供的服務(wù)的需求。應(yīng)該再一次強(qiáng)調(diào)指出的是,人認(rèn)識(shí)客觀世界的過(guò)程是一個(gè)漸進(jìn)過(guò)程,是在繼承前人知識(shí)的基礎(chǔ)上,經(jīng)反復(fù)迭代而不斷深化的。因此,面向?qū)ο蠓治霾豢赡車?yán)格按照順序線性進(jìn)行。初始的分析模型通常都是不準(zhǔn)確、不完整甚至包含錯(cuò)誤的,必須在隨后的反復(fù)分析中加以擴(kuò)充和更正。此外,在面向?qū)ο蠓治龅拿恳徊剑紤?yīng)該仔細(xì)分析研究以前針對(duì)相同的或類似的問(wèn)題域進(jìn)行面向?qū)ο蠓治鏊玫降慕Y(jié)果,并盡可能在本項(xiàng)目中重用這些結(jié)果。以后在講述面向?qū)ο蠓治龅木唧w過(guò)程時(shí),對(duì)上述內(nèi)容將不再贅述。9.3.1確定類與對(duì)象
1.找出候選的類與對(duì)象
對(duì)象是對(duì)問(wèn)題域中有意義的事物的抽象,它們既可能是物理實(shí)體,也可能是抽象概念。具體地說(shuō),大多數(shù)客觀事物可分為下述五類:
(1)可感知的物理實(shí)體,例如飛機(jī)、汽車、書和房屋等。
(2)人或組織的角色,例如醫(yī)生、教師、雇主、雇員、計(jì)算機(jī)系和財(cái)務(wù)處等。
(3)應(yīng)該記憶的事件,例如飛行、演出、訪問(wèn)和交通事故等。
(4)兩個(gè)或多個(gè)對(duì)象的相互作用,通常具有交易或接觸的性質(zhì),例如購(gòu)買、納稅和結(jié)婚等。
(5)需要說(shuō)明的概念,例如保險(xiǎn)政策和版權(quán)法等。
在分析所面臨的問(wèn)題時(shí),可以參照上列五類常見(jiàn)事物,找出在當(dāng)前問(wèn)題域中的候選類與對(duì)象。
另一種更簡(jiǎn)單的分析方法是所謂的非正式分析。這種分析方法以用自然語(yǔ)言書寫的需求陳述為依據(jù),把陳述中的名詞作為類與對(duì)象的候選者,用形容詞作為確定屬性的線索,把動(dòng)詞作為服務(wù)(操作)的候選者。當(dāng)然,用這種簡(jiǎn)單方法確定的候選者是非常不準(zhǔn)確的,其中往往包含大量不正確的或不必要的事物,還必須經(jīng)過(guò)更進(jìn)一步的嚴(yán)格篩選。通常,非正式分析是更詳細(xì)、更精確的正式的面向?qū)ο蠓治龅囊粋€(gè)很好的開(kāi)端。下面以ATM系統(tǒng)為例,說(shuō)明非正式分析過(guò)程。認(rèn)真閱讀9.2.2節(jié)給出的需求陳述,從陳述中找出下列名詞,可以把它們作為類與對(duì)象的初步的候選者。
銀行,自動(dòng)取款機(jī)(ATM),系統(tǒng),中央計(jì)算機(jī),分行計(jì)算機(jī),柜員終端,網(wǎng)絡(luò),總行,分行,軟件,成本,市,街道,營(yíng)業(yè)廳,儲(chǔ)蓄所,柜員,儲(chǔ)戶,現(xiàn)金,支票,賬戶,事務(wù),現(xiàn)金兌換卡,余額,磁卡,分行代碼,卡號(hào),用戶,副本,信息,密碼,類型,取款額,賬單,訪問(wèn)。通常,在需求陳述中不會(huì)一個(gè)不漏地寫出問(wèn)題域中所有有關(guān)的類與對(duì)象。因此,分析員應(yīng)該根據(jù)領(lǐng)域知識(shí)或常識(shí)進(jìn)一步把隱含的類與對(duì)象提取出來(lái)。例如,在ATM系統(tǒng)的需求陳述中雖然沒(méi)寫“通信鏈路”和“事務(wù)日志”,但是,根據(jù)領(lǐng)域知識(shí)和常識(shí)可以知道,在ATM系統(tǒng)中應(yīng)該包含這兩個(gè)實(shí)體。
2.篩選出正確的類與對(duì)象
顯然,僅通過(guò)一個(gè)簡(jiǎn)單、機(jī)械的過(guò)程不可能正確地完成分析工作。非正式分析僅僅幫助我們找到一些候選的類與對(duì)象,接下來(lái)應(yīng)該嚴(yán)格考察每個(gè)候選對(duì)象,從中去掉不正確的或不必要的,僅保留確實(shí)應(yīng)該記錄其信息或需要其提供服務(wù)的那些對(duì)象。篩選時(shí)主要依據(jù)下列標(biāo)準(zhǔn),刪除不正確或不必要的類與對(duì)象。
(1)冗余。如果兩個(gè)類表達(dá)了同樣的信息,則應(yīng)該保留在此問(wèn)題域中最富于描述力的名稱。
以ATM系統(tǒng)為例,上面用非正式分析法得出了34個(gè)候選的類,其中儲(chǔ)戶與用戶、現(xiàn)金兌換卡與磁卡及副本分別描述了相同的兩類信息,因此,應(yīng)該去掉“用戶”、“磁卡”、“副本”等冗余的類,僅保留“儲(chǔ)戶”和“現(xiàn)金兌換卡”這兩個(gè)類。
(2)無(wú)關(guān)?,F(xiàn)實(shí)世界中存在許多對(duì)象,不能把它們都納入到系統(tǒng)中去,僅需要把與本問(wèn)題密切相關(guān)的類與對(duì)象放進(jìn)目標(biāo)系統(tǒng)中即可。有些類在其他問(wèn)題中可能很重要,但與當(dāng)前要解決的問(wèn)題無(wú)關(guān),同樣也應(yīng)該把它們刪掉。以ATM系統(tǒng)為例,這個(gè)系統(tǒng)并不處理分?jǐn)傑浖_(kāi)發(fā)成本的問(wèn)題,而且ATM和柜員終端放置的地點(diǎn)與本軟件的關(guān)系也不大。因此,應(yīng)該去掉候選類“成本”、“市”、“街道”、“營(yíng)業(yè)廳”和“儲(chǔ)蓄所”。
(3)籠統(tǒng)。在需求陳述中常常使用一些籠統(tǒng)的、泛指的名詞,雖然在初步分析時(shí)把它們作為候選的類與對(duì)象列出來(lái)了,但是,要么系統(tǒng)無(wú)須記憶有關(guān)它們的信息,要么在需求陳述中有更明確、更具體的名詞對(duì)應(yīng)它們所暗示的事務(wù),因此,通常把這些籠統(tǒng)的或模糊的類去掉。以ATM系統(tǒng)為例,“銀行”實(shí)際指總行或分行,“訪問(wèn)”在這里實(shí)際指事務(wù),“信息”的具體內(nèi)容在需求陳述中隨后就指明了。此外還有一些籠統(tǒng)含糊的名詞??傊?,在本例中應(yīng)該去掉“銀行”、“網(wǎng)絡(luò)”、“系統(tǒng)”、“軟件”、“信息”和“訪問(wèn)”等候選類。
(4)屬性。在需求陳述中有些名詞實(shí)際上描述的是其他對(duì)象的屬性,應(yīng)該把這些名詞從候選類與對(duì)象中去掉。當(dāng)然,如果某個(gè)性質(zhì)具有很強(qiáng)的獨(dú)立性,則應(yīng)把它作為類而不是作為屬性。
在ATM系統(tǒng)的例子中,“現(xiàn)金”、“支票”、“取款額”、“賬單”、“余額”、“分行代碼”、“卡號(hào)”、“密碼”和“類型”等,實(shí)際上都應(yīng)該作為屬性對(duì)待。
(5)操作。在需求陳述中,有時(shí)可能使用一些既可作為名詞,又可作為動(dòng)詞的詞,應(yīng)該慎重考慮它們?cè)诒締?wèn)題中的含義,以便正確地決定把它們作為類還是作為類中定義的操作。
例如,談到電話時(shí)通常把“撥號(hào)”當(dāng)作動(dòng)詞,當(dāng)構(gòu)造電話模型時(shí)確實(shí)應(yīng)該把它作為一個(gè)操作,而不是一個(gè)類。但是,在開(kāi)發(fā)電話的自動(dòng)記賬系統(tǒng)時(shí),“撥號(hào)”需要有自己的屬性(例如日期、時(shí)間、受話地點(diǎn)等),因此應(yīng)該把它作為一個(gè)類??傊旧砭哂袑傩孕瑾?dú)立存在的操作,應(yīng)該作為類與對(duì)象。
(6)實(shí)現(xiàn)。在分析階段不應(yīng)該過(guò)早地考慮怎樣實(shí)現(xiàn)目標(biāo)系統(tǒng)。因此,應(yīng)該去掉僅和實(shí)現(xiàn)有關(guān)的候選的類與對(duì)象。在設(shè)計(jì)和實(shí)現(xiàn)階段,這些類與對(duì)象可能是重要的,但在分析階段過(guò)早地考慮它們反而會(huì)分散我們的注意力。
在ATM系統(tǒng)的例子中,“事務(wù)日志”無(wú)非是對(duì)一系列事務(wù)的記錄,它的確切表示方式是面向?qū)ο笤O(shè)計(jì)的議題;“通信鏈路”在邏輯上是一種聯(lián)系,在系統(tǒng)實(shí)現(xiàn)時(shí)它是關(guān)聯(lián)類的物理實(shí)現(xiàn)??傊?,應(yīng)該暫時(shí)去掉“事務(wù)日志”和“通信鏈路”這兩個(gè)類,在設(shè)計(jì)或?qū)崿F(xiàn)時(shí)再考慮它們。
綜上所述,在ATM系統(tǒng)的例子中,經(jīng)過(guò)初步篩選,剩下下列類與對(duì)象:ATM、中央計(jì)算機(jī)、分行計(jì)算機(jī)、柜員終端、總行、分行、柜員、儲(chǔ)戶、賬戶、事務(wù)和現(xiàn)金兌換卡。9.3.2確定關(guān)聯(lián)
多數(shù)人習(xí)慣于在初步分析確定了問(wèn)題域中的類與對(duì)象之后,接下來(lái)就分析確定類與對(duì)象之間存在的關(guān)聯(lián)關(guān)系。當(dāng)然,這樣的工作順序并不是絕對(duì)必要的。由于在整個(gè)開(kāi)發(fā)過(guò)程中面向?qū)ο蟾拍詈捅硎痉?hào)的一致性,分析員在選取自己習(xí)慣的工作方式時(shí)擁有相當(dāng)大的靈活性。
如前所述,兩個(gè)或多個(gè)對(duì)象之間的相互依賴、相互作用的關(guān)系就是關(guān)聯(lián)。分析、確定關(guān)聯(lián),能促使分析員考慮問(wèn)題域的邊緣情況,有助于發(fā)現(xiàn)那些尚未被發(fā)現(xiàn)的類與對(duì)象。
在分析、確定關(guān)聯(lián)的過(guò)程中,不必花過(guò)多的精力去區(qū)分關(guān)聯(lián)和聚集。事實(shí)上,聚集不過(guò)是一種特殊的關(guān)聯(lián),是關(guān)聯(lián)的一個(gè)特例。
1.初步確定關(guān)聯(lián)
在需求陳述中使用的描述性動(dòng)詞或動(dòng)詞詞組,通常表示關(guān)聯(lián)關(guān)系。因此,在初步確定關(guān)聯(lián)時(shí),大多數(shù)關(guān)聯(lián)可以通過(guò)直接提取需求陳述中的動(dòng)詞詞組而得出。通過(guò)分析需求陳述,還能發(fā)現(xiàn)一些在陳述中隱含的關(guān)聯(lián)。最后,分析員還應(yīng)該與用戶及領(lǐng)域?qū)<矣懻搯?wèn)題域?qū)嶓w間的相互依賴、相互作用關(guān)系,根據(jù)領(lǐng)域知識(shí)再進(jìn)一步補(bǔ)充一些關(guān)聯(lián)。
以ATM系統(tǒng)為例,經(jīng)過(guò)分析初步確定出下列關(guān)聯(lián):
(1)直接提取動(dòng)詞短語(yǔ)得出的關(guān)聯(lián):①ATM、中央計(jì)算機(jī)、分行計(jì)算機(jī)及柜員終端組成網(wǎng)絡(luò)。
②總行擁有多臺(tái)ATM。
③ATM設(shè)在主要街道上。
④分行提供分行計(jì)算機(jī)和柜員終端。
⑤柜員終端設(shè)在分行營(yíng)業(yè)廳及儲(chǔ)蓄所內(nèi)。
⑥分行分?jǐn)傑浖_(kāi)發(fā)成本。
⑦儲(chǔ)戶擁有賬戶。
⑧分行計(jì)算機(jī)處理針對(duì)賬戶的事務(wù)。
⑨分行計(jì)算機(jī)維護(hù)賬戶。
⑩柜員終端與分行計(jì)算機(jī)通信。
(2)需求陳述中隱含的關(guān)聯(lián):
①總行由各個(gè)分行組成。
②分行保管賬戶。
③總行擁有中央計(jì)算機(jī)。
④系統(tǒng)維護(hù)事務(wù)日志。
⑤系統(tǒng)提供必要的安全性。
⑥儲(chǔ)戶擁有現(xiàn)金兌換卡。
(3)根據(jù)問(wèn)題域知識(shí)得出的關(guān)聯(lián):
①現(xiàn)金兌換卡訪問(wèn)賬戶。
②分行雇用柜員。
2.篩選
經(jīng)初步分析得出的關(guān)聯(lián)只能作為候選的關(guān)聯(lián),還需經(jīng)過(guò)進(jìn)一步篩選,以去掉不正確的或不必要的關(guān)聯(lián)。篩選時(shí)主要根據(jù)下述標(biāo)準(zhǔn)刪除候選的關(guān)聯(lián):
(1)已刪去的類之間的關(guān)聯(lián)。如果在分析確定類與對(duì)象的過(guò)程中已經(jīng)刪掉了某個(gè)候選類,則與這個(gè)類有關(guān)的關(guān)聯(lián)也應(yīng)該刪去,或用其他類重新表達(dá)這個(gè)關(guān)聯(lián)。
以ATM系統(tǒng)為例,由于已經(jīng)刪去了“系統(tǒng)”、“網(wǎng)絡(luò)”、“市”、“街道”、“成本”、“軟件”、“事務(wù)日志”、“現(xiàn)金”、“營(yíng)業(yè)廳”、“儲(chǔ)蓄所”和“賬單”等候選類,因此,與這些類有關(guān)的下列八個(gè)關(guān)聯(lián)也應(yīng)該刪去:●?ATM、中央計(jì)算機(jī)、分行計(jì)算機(jī)及柜員終端組成網(wǎng)絡(luò)。
●?ATM設(shè)在主要街道上。
●分行分?jǐn)傑浖_(kāi)發(fā)成本。
●系統(tǒng)提供必要的安全性。
●系統(tǒng)維護(hù)事務(wù)日志。
●?ATM吐出現(xiàn)金。
●?ATM打印賬單。
●柜員終端設(shè)在分行營(yíng)業(yè)廳及儲(chǔ)蓄所內(nèi)。
(2)與問(wèn)題無(wú)關(guān)的或應(yīng)在實(shí)現(xiàn)階段考慮的關(guān)聯(lián)。應(yīng)該把處在本問(wèn)題域之外的關(guān)聯(lián)或與實(shí)現(xiàn)密切相關(guān)的關(guān)聯(lián)刪去。
例如,在ATM系統(tǒng)的例子中,“系統(tǒng)處理并發(fā)的訪問(wèn)”并沒(méi)有標(biāo)明對(duì)象之間的新關(guān)聯(lián),它只不過(guò)提醒我們?cè)趯?shí)現(xiàn)階段需要使用實(shí)現(xiàn)并發(fā)訪問(wèn)的算法,以處理并發(fā)事務(wù)。
(3)瞬時(shí)事件。關(guān)聯(lián)應(yīng)該描述問(wèn)題域的靜態(tài)結(jié)構(gòu),而不應(yīng)該是一個(gè)瞬時(shí)事件。
以ATM系統(tǒng)為例,“ATM讀現(xiàn)金兌換卡”描述了ATM與用戶交互周期中的一個(gè)動(dòng)作,它并不是ATM與現(xiàn)金兌換卡之間的固有關(guān)系,因此應(yīng)該刪去。類似地,還應(yīng)該刪去“ATM用戶交互”這個(gè)候選的關(guān)聯(lián)。
如果用動(dòng)作表述的需求隱含了問(wèn)題域的某種基本結(jié)構(gòu),則應(yīng)該用適當(dāng)?shù)膭?dòng)詞詞組重新表示這個(gè)關(guān)聯(lián)。例如,在ATM系統(tǒng)的需求陳述中,“中央計(jì)算機(jī)確定事務(wù)與分行的對(duì)應(yīng)關(guān)系”隱含了結(jié)構(gòu)上“中央計(jì)算機(jī)與分行通信”的關(guān)系。
(4)三元關(guān)聯(lián)。三個(gè)或三個(gè)以上對(duì)象之間的關(guān)聯(lián)大多可以分解為二元關(guān)聯(lián)或用詞組描述成限定的關(guān)聯(lián)。
在ATM系統(tǒng)的例子中,“柜員輸入針對(duì)賬戶的事務(wù)”可以分解成“柜員輸入事務(wù)”和“事務(wù)修改賬戶”這樣兩個(gè)二元關(guān)聯(lián)。而“分行計(jì)算機(jī)處理針對(duì)賬戶的事務(wù)”也可以做類似的分解。
“ATM與中央計(jì)算機(jī)交換關(guān)于事務(wù)的信息”這個(gè)候選的關(guān)聯(lián),實(shí)際上隱含了“ATM與中央計(jì)算機(jī)通信”和“在ATM上輸入事務(wù)”這兩個(gè)二元關(guān)聯(lián)。
(5)派生關(guān)聯(lián)。應(yīng)該去掉那些可以用其他關(guān)聯(lián)定義的冗余關(guān)聯(lián)。
例如,在ATM系統(tǒng)的例子中,“總行擁有多臺(tái)ATM”實(shí)質(zhì)上是“總行擁有中央計(jì)算機(jī)”和“ATM與中央計(jì)算機(jī)通信”這兩個(gè)關(guān)聯(lián)組合的結(jié)果。而“分行計(jì)算機(jī)維護(hù)賬戶”的實(shí)際含義是“分行保管賬戶”和“事務(wù)修改賬戶”。
3.進(jìn)一步完善
應(yīng)該進(jìn)一步完善經(jīng)篩選后余下的關(guān)聯(lián),通常從下述幾個(gè)方面進(jìn)行改進(jìn):
(1)正名。好的名字是幫助讀者理解的關(guān)鍵因素之一。因此,應(yīng)該仔細(xì)選擇含義更明確的名字作為關(guān)聯(lián)名。
例如,“分行提供分行計(jì)算機(jī)和柜員終端”不如改為“分行擁有分行計(jì)算機(jī)”和“分行擁有柜員終端”。
(2)分解。為了能夠適用于不同的關(guān)聯(lián),必要時(shí)應(yīng)該分解以前確定的類與對(duì)象。
例如,在ATM系統(tǒng)中,應(yīng)該把“事務(wù)”分解成“遠(yuǎn)程事務(wù)”和“柜員事務(wù)”。
(3)補(bǔ)充。發(fā)現(xiàn)了遺漏的關(guān)聯(lián)就應(yīng)該及時(shí)補(bǔ)上。
例如,在ATM系統(tǒng)中把“事務(wù)”分解成上述兩類之后,需要補(bǔ)充“柜員輸入柜員事務(wù)”、“柜員事務(wù)輸進(jìn)柜員終端”、“在ATM上輸入遠(yuǎn)程事務(wù)”和“遠(yuǎn)程事務(wù)由現(xiàn)金兌換卡授權(quán)”等關(guān)聯(lián)。
(4)標(biāo)明重?cái)?shù)。應(yīng)該初步判定各個(gè)關(guān)聯(lián)的類型,并粗略地確定關(guān)聯(lián)的重?cái)?shù)。但是,無(wú)須為此花費(fèi)過(guò)多精力,因?yàn)樵诜治鲞^(guò)程中隨著認(rèn)識(shí)的逐漸深入重?cái)?shù)也會(huì)經(jīng)常改動(dòng)。
圖9.2是經(jīng)上述分析過(guò)程之后得出的ATM系統(tǒng)原始的類圖。圖9.2ATM系統(tǒng)原始的類圖9.3.3劃分主題
在開(kāi)發(fā)大型、復(fù)雜系統(tǒng)的過(guò)程中,為了降低復(fù)雜程度,人們習(xí)慣于把系統(tǒng)再進(jìn)一步劃分成幾個(gè)不同的主題,也就是在概念上把系統(tǒng)包含的內(nèi)容分解成若干個(gè)范疇。
在開(kāi)發(fā)很小的系統(tǒng)時(shí),可能根本無(wú)須引入主題層;對(duì)于含有較多對(duì)象的系統(tǒng),則往往先識(shí)別出類與對(duì)象和關(guān)聯(lián),然后劃分主題,并用它作為指導(dǎo)開(kāi)發(fā)者和用戶觀察整個(gè)模型的一種機(jī)制;對(duì)于規(guī)模極大的系統(tǒng),則首先由高級(jí)分析員粗略地識(shí)別對(duì)象和關(guān)聯(lián),然后初步劃分主題,經(jīng)進(jìn)一步分析,對(duì)系統(tǒng)結(jié)構(gòu)有更深入的了解之后,再進(jìn)一步修改和精煉主題。應(yīng)該按問(wèn)題領(lǐng)域而不是用功能分解方法來(lái)確定主題。此外,應(yīng)該按照使不同主題內(nèi)的對(duì)象相互間依賴和交互最少的原則來(lái)確定主題。
以ATM系統(tǒng)為例,可以把它劃分成總行(包含總行和中央計(jì)算機(jī)這兩個(gè)類)、分行(包含分行、分行計(jì)算機(jī)、柜員終端、柜員事務(wù)、柜員和賬戶等類)和ATM(包含ATM、遠(yuǎn)程事務(wù)、現(xiàn)金兌換卡和儲(chǔ)戶等類)三個(gè)主題。事實(shí)上,我們描述的是一個(gè)簡(jiǎn)化的ATM系統(tǒng)。為了簡(jiǎn)單起見(jiàn),在下面討論這個(gè)例子時(shí)將忽略主題層。9.3.4確定屬性
屬性是對(duì)象的性質(zhì),借助于屬性我們能對(duì)類與對(duì)象和結(jié)構(gòu)有更深入、更具體的認(rèn)識(shí)。注意,在分析階段不要用屬性來(lái)表示對(duì)象間的關(guān)系,使用關(guān)聯(lián)能夠表示兩個(gè)對(duì)象間的任何關(guān)系,而且能把關(guān)系表示得更清晰、更醒目。
一般來(lái)說(shuō),確定屬性的過(guò)程包括分析和選擇兩個(gè)步驟。
1.分析
通常,在需求陳述中用名詞詞組表示屬性,例如“汽車的顏色”或“光標(biāo)的位置”。往往用形容詞表示可枚舉的具體屬性,例如“紅色的”、“打開(kāi)的”。但是,不可能在需求陳述中找到所有屬性,分析員還必須借助于領(lǐng)域知識(shí)和常識(shí)才能分析得出需要的屬性。幸運(yùn)的是,屬性對(duì)問(wèn)題域的基本結(jié)構(gòu)影響很小。隨著時(shí)間的推移,問(wèn)題域中的類始終保持穩(wěn)定,屬性卻可能改變了。相應(yīng)地,類中方法的復(fù)雜程度也將改變。
屬性的確定既與問(wèn)題域有關(guān),也和目標(biāo)系統(tǒng)的任務(wù)有關(guān)。應(yīng)該僅考慮與具體應(yīng)用直接相關(guān)的屬性,不要考慮那些超出所要解決的問(wèn)題范圍的屬性。在分析過(guò)程中應(yīng)該首先找出最重要的屬性,以后再逐漸把其余屬性增添進(jìn)去。在分析階段不要考慮那些純粹用于實(shí)現(xiàn)的屬性。
2.選擇
認(rèn)真考察經(jīng)初步分析而確定下來(lái)的那些屬性,從中刪掉不正確的或不必要的屬性。通常有以下幾種常見(jiàn)情況:
(1)誤把對(duì)象當(dāng)作屬性。如果某個(gè)實(shí)體的獨(dú)立存在比它的值更重要,則應(yīng)把它作為一個(gè)對(duì)象而不是對(duì)象的屬性。在具體應(yīng)用領(lǐng)域中具有自身性質(zhì)的實(shí)體,必然是對(duì)象。同一個(gè)實(shí)體在不同應(yīng)用領(lǐng)域中,到底應(yīng)該作為對(duì)象還是屬性,需要具體分析才能確定。例如,在郵政目錄中,“城市”是一個(gè)屬性,而在人口普查中卻應(yīng)該把“城市”當(dāng)作對(duì)象。
(2)誤把關(guān)聯(lián)類的屬性當(dāng)作一般對(duì)象的屬性。如果某個(gè)性質(zhì)依賴于某個(gè)關(guān)聯(lián)鏈的存在,則該性質(zhì)是關(guān)聯(lián)類的屬性,在分析階段不應(yīng)該把它作為一般對(duì)象的屬性。特別是在多對(duì)多關(guān)聯(lián)中,關(guān)聯(lián)類屬性很明顯,即使是在以后的開(kāi)發(fā)階段中,也不能把它歸并成相互關(guān)聯(lián)的兩個(gè)對(duì)象中任意一個(gè)的屬性。
(3)把限定誤當(dāng)成屬性。正如前文所述,正確使用限定詞往往可以減少關(guān)聯(lián)的重?cái)?shù)。如果把某個(gè)屬性值固定下來(lái)以后能減少關(guān)聯(lián)的重?cái)?shù),則應(yīng)該考慮把這個(gè)屬性重新表述成一個(gè)限定詞。在ATM系統(tǒng)的例子中,“分行代碼”、“賬號(hào)”、“雇員號(hào)”和“站號(hào)”等都是限定詞。
(4)誤把內(nèi)部狀態(tài)當(dāng)成了屬性。如果某個(gè)性質(zhì)是對(duì)象的非公開(kāi)的內(nèi)部狀態(tài),則應(yīng)該從對(duì)象模型中刪掉這個(gè)屬性。
(5)過(guò)于細(xì)化。在分析階段應(yīng)該忽略那些對(duì)大多數(shù)操作都沒(méi)有影響的屬性。
(6)存在不一致的屬性。類應(yīng)該是簡(jiǎn)單而且一致的。如果得出一些看起來(lái)與其他屬性毫不相關(guān)的屬性,則應(yīng)該考慮把該類分解成兩個(gè)不同的類。
經(jīng)過(guò)篩選之后,得到ATM系統(tǒng)中各個(gè)類的屬性,如圖9.3所示。圖中還標(biāo)出了一些限定詞。
●“卡號(hào)”實(shí)際上是一個(gè)限定詞。在研究卡號(hào)含義的過(guò)程中,發(fā)現(xiàn)以前在分析確定關(guān)聯(lián)的過(guò)程中遺漏了“分行發(fā)放現(xiàn)金兌換卡”這個(gè)關(guān)聯(lián),現(xiàn)在把這個(gè)關(guān)聯(lián)補(bǔ)上,卡號(hào)是這個(gè)關(guān)聯(lián)上的限定詞?!瘛胺中写怼笔顷P(guān)聯(lián)“分行組成總行”上的限定詞。
●“賬號(hào)”是關(guān)聯(lián)“分行保管賬戶”上的限定詞。
●“雇員號(hào)”是“分行雇用柜員”上的限定詞。
●“站號(hào)”是“分行擁有柜員終端”、“柜員終端與分行計(jì)算機(jī)通信”及“中央計(jì)算機(jī)與ATM通信”等三個(gè)關(guān)聯(lián)上的限定詞。
應(yīng)該說(shuō)明的是,我們討論的ATM系統(tǒng)是一個(gè)經(jīng)過(guò)簡(jiǎn)化后的例子,而不是一個(gè)完整的實(shí)際應(yīng)用系統(tǒng)。因此,圖9.3中示出的屬性遠(yuǎn)較實(shí)際應(yīng)用系統(tǒng)中的屬性少。圖9.3ATM系統(tǒng)對(duì)象模型中的屬性9.3.5識(shí)別繼承關(guān)系
確定了類中應(yīng)該定義的屬性之后,就可以利用繼承機(jī)制共享公共性質(zhì),并對(duì)系統(tǒng)中眾多的類加以組織。正如以前曾經(jīng)強(qiáng)調(diào)指出過(guò)的,繼承關(guān)系的建立實(shí)質(zhì)上是知識(shí)抽取的過(guò)程,它應(yīng)該反映出一定深度的領(lǐng)域知識(shí),因此必須有領(lǐng)域?qū)<颐芮信浜喜拍芡瓿?。通常,許多歸納關(guān)系都是根據(jù)客觀世界現(xiàn)有的分類模式建立起來(lái)的,只要可能,就應(yīng)該使用現(xiàn)有的概念。
一般說(shuō)來(lái),可以使用兩種方式建立繼承(即泛化)關(guān)系。
(1)自底向上:抽象出現(xiàn)有類的共同性質(zhì)而泛化出父類,這個(gè)過(guò)程實(shí)質(zhì)上模擬了人類歸納思維的過(guò)程。例如,在ATM系統(tǒng)中,“遠(yuǎn)程事務(wù)”和“柜員事務(wù)”是類似的,可以泛化出父類“事務(wù)”;類似地,可以從“ATM”和“柜員終端”泛化出父類“輸入站”。
(2)自頂向下:把現(xiàn)有類細(xì)化成更具體的子類,這模擬了人類的演繹思維的過(guò)程。從應(yīng)用域中常常能明顯看出應(yīng)該做的自頂向下的具體化工作。例如,帶有形容詞修飾的名詞詞組往往暗示了一些具體類。但是,在分析階段應(yīng)該避免過(guò)度細(xì)化。
利用多重繼承可以提高共享程度,但是同時(shí)也增加了概念上以及實(shí)現(xiàn)時(shí)的復(fù)雜程度。使用多重繼承機(jī)制時(shí),通常應(yīng)該指定一個(gè)主要父類,從它繼承大部分屬性和行為,次要父類只補(bǔ)充一些屬性和行為。
圖9.4是增加了繼承關(guān)系之后的ATM對(duì)象模型。圖9.4帶有繼承關(guān)系的ATM對(duì)象模型9.3.6反復(fù)修改
僅僅經(jīng)過(guò)一次建模過(guò)程很難得到完全正確的對(duì)象模型。事實(shí)上,軟件開(kāi)發(fā)過(guò)程就是一個(gè)多次反復(fù)修改、逐步完善的過(guò)程。在建模的任何一個(gè)步驟中,如果發(fā)現(xiàn)了模型的缺陷,都必須返回到前期階段進(jìn)行修改。由于面向?qū)ο蟮母拍詈头?hào)在整個(gè)開(kāi)發(fā)過(guò)程中都是一致的,因此遠(yuǎn)比使用結(jié)構(gòu)分析、設(shè)計(jì)技術(shù)更容易實(shí)現(xiàn)反復(fù)修改、逐步完善的過(guò)程。
實(shí)際上,有些細(xì)化工作(例如定義服務(wù))是在建立了動(dòng)態(tài)模型和功能模型之后才進(jìn)行的。在實(shí)際工作中,建模的步驟并不一定嚴(yán)格按照前面講述的次序進(jìn)行。分析員可以合并幾個(gè)步驟的工作放在一起完成,也可以按照自己的習(xí)慣交換前述各項(xiàng)工作的次序,還可以先初步完成幾項(xiàng)工作,再返回來(lái)加以完善。但是,如果你是初次接觸面向?qū)ο蠓椒ǎ瑒t最好先按本書所述次序,嘗試用面向?qū)ο蠓椒?,開(kāi)發(fā)幾個(gè)較小的系統(tǒng),取得一些實(shí)踐經(jīng)驗(yàn)后,再總結(jié)出更適合自己的工作方式。
下面以ATM系統(tǒng)為例,討論可能做的修改。
(1)分解“現(xiàn)金兌換卡”類。實(shí)際上,“現(xiàn)金兌換卡”有兩個(gè)相對(duì)獨(dú)立的功能,它既是鑒別儲(chǔ)戶使用ATM權(quán)限的卡,又是ATM獲得分行代碼和卡號(hào)等數(shù)據(jù)的數(shù)據(jù)載體。因此,把“現(xiàn)金兌換卡”類分解為“卡權(quán)限”和“現(xiàn)金兌換卡”兩個(gè)類,將使每個(gè)類的功能更單一。其中:前一個(gè)類標(biāo)志儲(chǔ)戶訪問(wèn)賬戶的權(quán)限,后一個(gè)類是含有分行代碼和卡號(hào)的數(shù)據(jù)載體。多張現(xiàn)金兌換卡可能對(duì)應(yīng)著相同的訪問(wèn)權(quán)限。
(2)“事務(wù)”由“更新”組成。通常,一個(gè)事務(wù)包含對(duì)賬戶的若干次更新。這里所說(shuō)的更新,指的是對(duì)賬戶所做的一個(gè)動(dòng)作(取款、存款或查詢)?!案隆彪m然代表一個(gè)動(dòng)作,但是它有自己的屬性(類型、金額等),應(yīng)該獨(dú)立存在,因此應(yīng)該把它作為類。
(3)把“分行”與“分行計(jì)算機(jī)”合并。區(qū)分“分行”與“分行計(jì)算機(jī)”,對(duì)于分析這個(gè)系統(tǒng)來(lái)說(shuō),并沒(méi)有多大意義,為簡(jiǎn)單起見(jiàn),應(yīng)該把它們合并。類似地,應(yīng)該合并“總行”和“中央計(jì)算機(jī)”。
圖9.5給出了修改后的ATM對(duì)象模型,與修改前比較起來(lái),它更簡(jiǎn)單、更清晰。圖9.5修改后的ATM對(duì)象模型 9.4建立動(dòng)態(tài)模型
本書前面的章節(jié)已經(jīng)介紹了動(dòng)態(tài)模型的概念和表示方法,本節(jié)結(jié)合ATM系統(tǒng)之例,進(jìn)一步講述建立動(dòng)態(tài)模型的方法。
對(duì)于僅存儲(chǔ)靜態(tài)數(shù)據(jù)的系統(tǒng)(例如數(shù)據(jù)庫(kù))來(lái)說(shuō),動(dòng)態(tài)模型并沒(méi)有什么意義。然而在開(kāi)發(fā)交互式系統(tǒng)時(shí),動(dòng)態(tài)模型卻起著很重要的作用。如果收集輸入信息是目標(biāo)系統(tǒng)的一項(xiàng)主要工作,則在開(kāi)發(fā)這類應(yīng)用系統(tǒng)時(shí)建立正確的動(dòng)態(tài)模型是至關(guān)重要的。建立動(dòng)態(tài)模型的第一步,是編寫典型交互行為的腳本。雖然腳本中不可能包括每個(gè)偶然事件,但是,至少必須保證不遺漏常見(jiàn)的交互行為。接下來(lái)從腳本中提取出事件,確定觸發(fā)每個(gè)事件的動(dòng)作對(duì)象以及接受事件的目標(biāo)對(duì)象。第三步,排列事件發(fā)生的次序,確定每個(gè)對(duì)象可能有的狀態(tài)及狀態(tài)間的轉(zhuǎn)換關(guān)系,并用狀態(tài)圖描繪它們。最后,比較各個(gè)對(duì)象的狀態(tài)圖,檢查它們之間的一致性,確保事件之間的匹配。9.4.1編寫腳本
所謂“腳本”,原意是指“表演戲曲、話劇,拍攝電影、電視劇等所依據(jù)的本子,里面記載臺(tái)詞、故事情節(jié)等”。在建立動(dòng)態(tài)模型的過(guò)程中,腳本是指系統(tǒng)在某一執(zhí)行期間內(nèi)出現(xiàn)的一系列事件。腳本描述用戶(或其他外部設(shè)備)與目標(biāo)系統(tǒng)之間的一個(gè)或多個(gè)典型的交互過(guò)程,以便對(duì)目標(biāo)系統(tǒng)的行為有更具體的認(rèn)識(shí)。編寫腳本的目的是保證不遺漏重要的交互步驟,它有助于確保整個(gè)交互過(guò)程的正確性和清晰性。
腳本描寫的范圍并不是固定的,既可以包括系統(tǒng)中發(fā)生的全部事件,也可以只包括由某些特定對(duì)象觸發(fā)的事件。腳本描寫的范圍主要由編寫腳本的具體目的決定。即使在需求陳述中已經(jīng)描寫了完整的交互過(guò)程,也還需要花很大精力構(gòu)思交互的形式。例如,ATM系統(tǒng)的需求陳述里,雖然表明了應(yīng)從儲(chǔ)戶那里獲取有關(guān)事務(wù)的信息,但并沒(méi)有準(zhǔn)確說(shuō)明獲取信息的具體過(guò)程,對(duì)動(dòng)作次序的要求也是模糊的。因此,編寫腳本的過(guò)程,實(shí)質(zhì)上就是分析用戶對(duì)系統(tǒng)交互行為的要求的過(guò)程。在編寫腳本的過(guò)程中,需要與用戶充分交換意見(jiàn),編寫后還應(yīng)該經(jīng)過(guò)他們的審查與修改。編寫腳本時(shí),首先編寫正常情況的腳本。然后,考慮特殊情況,例如輸入或輸出的數(shù)據(jù)為最大值(或最小值)。最后,考慮出錯(cuò)情況,例如,輸入的值為非法值或響應(yīng)失敗。對(duì)大多數(shù)交互式系統(tǒng)來(lái)說(shuō),出錯(cuò)處理都是最難實(shí)現(xiàn)的部分。如果可能,應(yīng)該允許用戶“異常中止”一個(gè)操作或“取消”一個(gè)操作。此外,還應(yīng)該提供諸如“幫助”和狀態(tài)查詢之類的在基本交互行為之上的“通用”交互行為。
腳本描述事件序列。每當(dāng)系統(tǒng)中的對(duì)象與用戶(或其他外部設(shè)備)交換信息時(shí),就發(fā)生一個(gè)事件。所交換的信息值就是該事件的參數(shù)(例如,“輸入密碼”事件的參數(shù)是所輸入的密碼)。也有許多事件是無(wú)參數(shù)的,這樣的事件僅傳遞一個(gè)信息——該事件已經(jīng)發(fā)生了。對(duì)于每個(gè)事件,都應(yīng)該指明觸發(fā)該事件的動(dòng)作對(duì)象(例如系統(tǒng)、用戶或其他外部事物)、接受事件的目標(biāo)對(duì)象以及該事件的參數(shù)。
圖9.6和圖9.7分別給出了ATM系統(tǒng)的正常情況腳本和異常情況腳本。圖9.6ATM系統(tǒng)的正常情況腳本圖9.7ATM系統(tǒng)的異常情況腳本9.4.2設(shè)想用戶界面
大多數(shù)交互行為都可以分為應(yīng)用邏輯和用戶界面兩部分。通常,系統(tǒng)分析員首先集中精力考慮系統(tǒng)的信息流和控制流,而不是首先考慮用戶界面。事實(shí)上,采用不同界面(例如命令行或圖形用戶界面),可以實(shí)現(xiàn)同樣的程序邏輯。應(yīng)用邏輯是內(nèi)在的、本質(zhì)的內(nèi)容,用戶界面是外在的表現(xiàn)形式。動(dòng)態(tài)模型著重表示應(yīng)用系統(tǒng)的控制邏輯。
但是,用戶界面的美觀程度、方便程度、易學(xué)程度以及效率等,是用戶使用系統(tǒng)時(shí)最先感受到的,用戶對(duì)系統(tǒng)的“第一印象”往往從界面得來(lái),用戶界面的好壞對(duì)用戶是否喜歡、是否接受一個(gè)系統(tǒng)起很重要的作用。因此,在分析階段也不能完全忽略用戶界面。在這個(gè)階段用戶界面的細(xì)節(jié)并不太重要,重要的是在這種界面下的信息交換方式。我們的目的是確保能夠完成全部必要的信息交換,而不會(huì)丟失重要的信息。
不經(jīng)過(guò)實(shí)際使用很難評(píng)價(jià)一個(gè)用戶界面的優(yōu)劣,因此,軟件開(kāi)發(fā)人員往往快速地建立起用戶界面的原型,供用戶試用與評(píng)價(jià)。
圖9.8是初步設(shè)想出的ATM界面格式。圖9.8ATM的界面格式9.4.3畫事件跟蹤圖
1.確定事件
應(yīng)該仔細(xì)分析每個(gè)腳本,以便從中提取出所有外部事件。事件包括系統(tǒng)與用戶(或外部設(shè)備)交互的所有信號(hào)、輸入、輸出、中斷和動(dòng)作等。從腳本中容易找出正常事件,但是應(yīng)該小心仔細(xì),不要遺漏了異常事件和出錯(cuò)條件。
傳遞信息的對(duì)象的動(dòng)作也是事件。例如,儲(chǔ)戶插入現(xiàn)金兌換卡、儲(chǔ)戶輸入密碼和ATM吐出現(xiàn)金等都是事件。大多數(shù)對(duì)象到對(duì)象的交互行為都對(duì)應(yīng)著事件。應(yīng)該把對(duì)控制流產(chǎn)生相同效果的那些事件組合在一起作為一類事件,并給它們?nèi)∫粋€(gè)唯一的名字。例如,“吐出現(xiàn)金”是一個(gè)事件類,盡管這類事件中的每個(gè)個(gè)別事件的參數(shù)值不同(吐出的現(xiàn)金數(shù)額不同),然而這并不影響控制流。但是,應(yīng)該把對(duì)控制流有不同影響的那些事件區(qū)分開(kāi)來(lái),不要誤把它們組合在一起。例如“賬戶有效”、“賬戶無(wú)效”、“密碼錯(cuò)”等都是不同的事件。一般來(lái)說(shuō),不同應(yīng)用系統(tǒng)對(duì)相同事件的響應(yīng)并不相同,因此,在最終分類所有事件之前,必須先畫出狀態(tài)圖。如果從狀態(tài)圖中看出某些事件之間的差異對(duì)系統(tǒng)行為并沒(méi)有影響,則可以忽略這些事件間的差異。經(jīng)過(guò)分析,應(yīng)該區(qū)分出每類事件的發(fā)送對(duì)象和接受對(duì)象。一類事件相對(duì)它的發(fā)送對(duì)象來(lái)說(shuō)是輸出事件,但是相對(duì)它的接受對(duì)象來(lái)說(shuō)則是輸入事件。有時(shí)一個(gè)對(duì)象把事件發(fā)送給自己,在這種情況下,該事件既是輸出事件又是輸入事件。
2.畫出事件跟蹤圖
從腳本中提取出各類事件并確定了每類事件的發(fā)送對(duì)象和接受對(duì)象之后,就可以用事件跟蹤圖把事件序列以及事件與對(duì)象的關(guān)系,形象而清晰地表示出來(lái)。事件跟蹤圖實(shí)質(zhì)上是擴(kuò)充的腳本,而且可以把它看做是簡(jiǎn)化的UML順序圖。在事件跟蹤圖中,一條豎線代表一個(gè)對(duì)象,每個(gè)事件用一條水平的箭頭線表示,箭頭方向從事件的發(fā)送對(duì)象指向接受對(duì)象。時(shí)間從上向下遞增,也就是說(shuō),畫在最上面的水平箭頭線代表最先發(fā)生的事件,畫在最下面的水平箭頭線所代表的事件最晚發(fā)生。箭頭線之間的間距并沒(méi)有具體含義,圖中僅用箭頭線在垂直方向上的相對(duì)位置表示事件發(fā)生的先后,并不表示兩個(gè)事件之間的精確時(shí)間差。
圖9.9是ATM系統(tǒng)正常情況下的事件跟蹤圖。圖9.9ATM系統(tǒng)正常情況腳本的事件跟蹤圖9.4.4畫狀態(tài)圖
狀態(tài)圖描繪事件與對(duì)象狀態(tài)的關(guān)系。當(dāng)對(duì)象接受了一個(gè)事件以后,它的下一個(gè)狀態(tài)取決于當(dāng)前狀態(tài)及所接受的事件。由事件引起的狀態(tài)改變稱為“轉(zhuǎn)換”。如果一個(gè)事件并不引起當(dāng)前狀態(tài)發(fā)生轉(zhuǎn)換,則可忽略這個(gè)事件。
通常,用一張狀態(tài)圖描繪一類對(duì)象的行為,它確定了由事件序列引出的狀態(tài)序列。但是,也不是任何一個(gè)類都需要有一張狀態(tài)圖描繪它的行為。很多對(duì)象僅響應(yīng)與過(guò)去歷史無(wú)關(guān)的那些輸入事件,或者把歷史作為不影響控制流的參數(shù)。對(duì)于這類對(duì)象來(lái)說(shuō),狀態(tài)圖是不必要的。系統(tǒng)分析員應(yīng)該集中精力僅考慮具有重要交互行為的那些類。從一張事件跟蹤圖出發(fā)畫狀態(tài)圖時(shí),應(yīng)該集中精力僅考慮影響一類對(duì)象的事件,也就是說(shuō),僅考慮事件跟蹤圖中指向某條豎線的那些箭頭線。把這些事件作為狀態(tài)圖中的有向邊(即箭頭線),邊上標(biāo)以事件名。兩個(gè)事件之間的間隔就是一個(gè)狀態(tài)。
一般來(lái)說(shuō),如果同一個(gè)對(duì)象對(duì)相同事件的響應(yīng)不同,則這個(gè)對(duì)象就處在不同狀態(tài)。應(yīng)該盡量給每個(gè)狀態(tài)取個(gè)有意義的名字。通常,從事件跟蹤圖中當(dāng)前考慮的豎線射出的箭頭線,是這條豎線代表的對(duì)象達(dá)到某個(gè)狀態(tài)時(shí)所做的行為(往往是引起另一類對(duì)象狀態(tài)轉(zhuǎn)換的事件)。根據(jù)一張事件跟蹤圖畫出狀態(tài)圖之后,再把其他腳本的事件跟蹤圖合并到已畫出的狀態(tài)圖中。為此需在事件跟蹤圖中找出以前考慮過(guò)的腳本的分支點(diǎn)(例如“驗(yàn)證賬戶”就是一個(gè)分支點(diǎn),因?yàn)轵?yàn)證的結(jié)果可能是“有效賬戶”,也可能是“無(wú)效賬戶”),然后把其他腳本中的事件序列并入已有的狀態(tài)圖中,作為一條可選的路徑。
考慮完正常事件之后再考慮邊界情況和特殊情況,其中包括在不適當(dāng)?shù)臅r(shí)候發(fā)生的事件(例如系統(tǒng)正在處理某個(gè)事務(wù)時(shí),用戶要求取消該事務(wù))。有時(shí)用戶(或外部設(shè)備)不能做出快速響應(yīng),然而某些資源又必須及時(shí)收回,于是在一定間隔后就產(chǎn)生了“超時(shí)”事件。對(duì)用戶出錯(cuò)情況往往需要花費(fèi)很多精力處理,并且會(huì)使原來(lái)清晰、緊湊的程序結(jié)構(gòu)變得復(fù)雜、繁瑣,但是,出錯(cuò)處理是不能省略的。當(dāng)狀態(tài)圖覆蓋了所有腳本,包含了影響某類對(duì)象狀態(tài)的全部事件時(shí),該類的狀態(tài)圖就構(gòu)造出來(lái)了。利用這張狀態(tài)圖可能會(huì)發(fā)現(xiàn)一些遺漏的情況。測(cè)試完整性和出錯(cuò)處理能力的最好方法,是設(shè)想各種可能出現(xiàn)的情況,多問(wèn)幾個(gè)“如果……,則……”的問(wèn)題。
以ATM系統(tǒng)為例?!癆TM”、“柜員終端”、“總行”和“分行”都是主動(dòng)對(duì)象,它們相互發(fā)送事件;而“現(xiàn)金兌換卡”、“事務(wù)”和“賬戶”是被動(dòng)對(duì)象,并不發(fā)送事件?!皟?chǔ)戶”和“柜員”雖然也是動(dòng)作對(duì)象,但是,它們都是系統(tǒng)外部的因素,無(wú)須在系統(tǒng)內(nèi)實(shí)現(xiàn)它們。因此,只需要考慮“ATM”、“總行”、“柜員終端”和“分行”的狀態(tài)圖。圖9.10、圖9.11和圖9.12分別是“ATM”、“總行”和“分行”的狀態(tài)圖。由于“柜員終端”的狀態(tài)圖和“ATM”的狀態(tài)圖類似,為節(jié)省篇幅把它省略了。這些狀態(tài)圖都是簡(jiǎn)化的,尤其對(duì)異常情況和出錯(cuò)情況的考慮是相當(dāng)粗略的(例如,圖9.10并沒(méi)有表示在網(wǎng)絡(luò)通信鏈路不通時(shí)的系統(tǒng)行為。實(shí)際上,在這種情況下,ATM停止處理儲(chǔ)戶事務(wù))。圖9.10ATM類的狀態(tài)圖圖9.11總行類的狀態(tài)圖圖9.12分行類的狀態(tài)圖9.4.5審查動(dòng)態(tài)模型
各個(gè)類的狀態(tài)圖通過(guò)共享事件合并起來(lái),構(gòu)成了系統(tǒng)的動(dòng)態(tài)模型。在完成了每個(gè)具有重要交互行為的類的狀態(tài)圖之后,應(yīng)該檢查系統(tǒng)級(jí)的完整性和一致性。一般來(lái)說(shuō),每個(gè)事件都應(yīng)該既有發(fā)送對(duì)象又有接受對(duì)象。當(dāng)然,有時(shí)發(fā)送者和接受者是同一個(gè)對(duì)象。對(duì)于沒(méi)有前驅(qū)或沒(méi)有后繼的狀態(tài)應(yīng)該著重審查,如果這個(gè)狀態(tài)既不是交互序列的起點(diǎn)也不是終點(diǎn),則發(fā)現(xiàn)了一個(gè)錯(cuò)誤。
應(yīng)該審查每個(gè)事件,跟蹤它對(duì)系統(tǒng)中各個(gè)對(duì)象所產(chǎn)生的效果,以保證它們與每個(gè)腳本都匹配。以ATM系統(tǒng)為例。在總行類的狀態(tài)圖中,事件“分行代碼錯(cuò)”是由總行發(fā)出的,但是在ATM類的狀態(tài)圖中并沒(méi)有一個(gè)狀態(tài)接受這個(gè)事件。因此,在ATM類的狀態(tài)圖中應(yīng)該再補(bǔ)充一個(gè)狀態(tài)“do/顯示分行代碼錯(cuò)信息”,它接受由前驅(qū)狀態(tài)“do/驗(yàn)證賬戶”發(fā)出的事件“分行代碼錯(cuò)”,它的后繼狀態(tài)是“退卡”。
9.5建立功能模型
功能模型表明了系統(tǒng)中數(shù)據(jù)之間的依賴關(guān)系以及有關(guān)的數(shù)據(jù)處理功能,它由一組數(shù)據(jù)流圖組成。其中的處理功能可以用IPO圖(或表)和偽碼等多種方式進(jìn)一步描述。
通常在建立了對(duì)象模型和動(dòng)態(tài)模型之后再建立功能模型。
本節(jié)結(jié)合ATM系統(tǒng)的例子,再?gòu)?fù)習(xí)一遍有關(guān)數(shù)據(jù)流圖的概念和畫法。9.5.1畫出基本系統(tǒng)模型圖
基本系統(tǒng)模型由若干個(gè)數(shù)據(jù)源點(diǎn)/終點(diǎn)及一個(gè)處理框組成,這個(gè)處理框代表了系統(tǒng)加工、變換數(shù)據(jù)的整體功能?;鞠到y(tǒng)模型指明了目標(biāo)系統(tǒng)的邊界。由數(shù)據(jù)源點(diǎn)輸入的數(shù)據(jù)和輸出到數(shù)據(jù)終點(diǎn)的數(shù)據(jù),是系統(tǒng)與外部世界之間的交互事件的參數(shù)。
圖9.13是ATM系統(tǒng)的基本系統(tǒng)模型。盡管在儲(chǔ)蓄所內(nèi)儲(chǔ)戶的事務(wù)是由柜員通過(guò)柜員終端提交給系統(tǒng)的,但是信息的來(lái)源和最終接受者都是儲(chǔ)戶,因此,本系統(tǒng)的數(shù)據(jù)源點(diǎn)/終點(diǎn)為儲(chǔ)戶。另一個(gè)數(shù)據(jù)源點(diǎn)是現(xiàn)金兌換卡,因?yàn)橄到y(tǒng)從它上面讀取分行代碼和卡號(hào)等信息。圖9.13ATM系統(tǒng)的基本系統(tǒng)模型9.5.2畫出功能級(jí)數(shù)據(jù)流圖
把基本系統(tǒng)模型中單一的處理框分解成若干個(gè)處理框,以描述系統(tǒng)加工變換數(shù)據(jù)的基本功能,就得到功能級(jí)數(shù)據(jù)流圖。
ATM系統(tǒng)的功能級(jí)數(shù)據(jù)流圖如圖9.14所示。圖9.14ATM系統(tǒng)的功能級(jí)數(shù)據(jù)流圖9.5.3描述處理框功能
把數(shù)據(jù)流圖分解細(xì)化到一定程度之后,就應(yīng)該描述圖中各個(gè)處理框的功能。應(yīng)該注意的是,要著重描述每個(gè)處理框所代表的功能,而不是實(shí)現(xiàn)功能的具體算法。
描述既可以是說(shuō)明性的,也可以是過(guò)程性的。說(shuō)明性描述規(guī)定了輸入值和輸出值之間的關(guān)系,以及輸出值應(yīng)遵循的規(guī)律。過(guò)程性描述則通過(guò)算法說(shuō)明“做什么”。一般來(lái)說(shuō),說(shuō)明性描述優(yōu)于過(guò)程性描述,因?yàn)檫@類描述中通常不會(huì)隱含具體實(shí)現(xiàn)方面的考慮。
ATM系統(tǒng)數(shù)據(jù)流圖中大多數(shù)處理框的功能都比較簡(jiǎn)單。作為一個(gè)例子,圖9.15給出了對(duì)“更新賬戶”這個(gè)處理功能的描述。圖9.15對(duì)更新賬戶功能的描述
9.6定義服務(wù)
9.6.1常規(guī)行為
在分析階段可以認(rèn)為,類中定義的每個(gè)屬性都是可以訪問(wèn)的,也就是說(shuō),假設(shè)在每個(gè)類中都定義了讀、寫該類每個(gè)屬性的操作。但是,通常無(wú)需在對(duì)象圖中顯式表示這些常規(guī)操作。9.6.2從事件導(dǎo)出的操作
狀態(tài)圖中發(fā)往對(duì)象的事件也就是該對(duì)象接收到的消息,因此該對(duì)象必須有由消息選擇符指定的操作,這個(gè)操作修改對(duì)象狀態(tài)(即屬性值)并啟動(dòng)相應(yīng)的服務(wù)。例如,在ATM系統(tǒng)中,發(fā)往ATM對(duì)象的事件“中止”,啟動(dòng)該對(duì)象的服務(wù)“打印賬單”;發(fā)往分行的事件“請(qǐng)分行驗(yàn)卡”,啟動(dòng)該對(duì)象的服務(wù)“驗(yàn)證卡號(hào)”;而事件“處理分行事務(wù)”,啟動(dòng)的是分行對(duì)象的服務(wù)“更新賬戶”??梢钥闯?,所啟動(dòng)的這些服務(wù)通常就是接受事件的對(duì)象在相應(yīng)狀態(tài)的行為。9.6.3與數(shù)據(jù)流圖中處理框?qū)?yīng)的操作
數(shù)據(jù)流圖中的每個(gè)處理框都與一個(gè)對(duì)象(也可能是若干個(gè)對(duì)象)上的操作相對(duì)應(yīng)。應(yīng)該仔細(xì)對(duì)照狀態(tài)圖和數(shù)據(jù)流圖,以便更正確地確定對(duì)象應(yīng)該提供的服務(wù)。例如,在ATM系統(tǒng)中,從狀態(tài)圖上看出分行對(duì)象應(yīng)該提供“驗(yàn)證卡號(hào)”服務(wù),而在數(shù)據(jù)流圖上與之對(duì)應(yīng)的處理框是“驗(yàn)卡”。根據(jù)實(shí)際應(yīng)該完成的功能看,該對(duì)象提供的這個(gè)服務(wù)應(yīng)該是“驗(yàn)卡”。
9.6.4利用繼承減少冗余操作
應(yīng)該盡量利用繼承機(jī)制來(lái)減少所需定義的服務(wù)數(shù)目。只要不違背領(lǐng)域知識(shí)和常識(shí),就盡量抽取出相似類的公共屬性和操作,以建立這些類的新父類,并在類等級(jí)的不同層次中正確地定義各個(gè)服務(wù)。
9.7面向?qū)ο蠓治鰧?shí)例
9.7.1需求陳述
我們將要討論的是電梯的控制問(wèn)題,下面給出對(duì)這個(gè)問(wèn)題的描述。
在一幢有m層樓的大廈中需要一套控制n部電梯的產(chǎn)品,要求這n部電梯根據(jù)下列約束條件在樓層間移動(dòng):
C1:每部電梯有m個(gè)按鈕,每個(gè)按鈕代表一個(gè)樓層。當(dāng)按下一個(gè)按鈕時(shí)該按鈕指示燈亮,同時(shí)電梯駛向相應(yīng)的樓層,當(dāng)?shù)竭_(dá)由按鈕指定的樓層時(shí)指示燈熄滅。
C2:除了大廈的最低層和最高層之外,每層樓都有兩個(gè)按鈕分別指示電梯上行和下行。當(dāng)這兩個(gè)按鈕之一被按下時(shí),相應(yīng)的指示燈亮;當(dāng)電梯到達(dá)此樓層時(shí)燈熄滅,電梯向要求的方向移動(dòng)。
C3:當(dāng)電梯無(wú)升降動(dòng)作時(shí),關(guān)門并停在當(dāng)前樓層。
9.7.2建立對(duì)象模型
1.精確地定義問(wèn)題
應(yīng)該盡可能簡(jiǎn)潔地定義所需要的產(chǎn)品,最好只用一句話來(lái)描述目標(biāo)系統(tǒng)。例如,對(duì)電梯系統(tǒng)可以像下面這樣描述:
在一個(gè)m層樓的大廈里,用每層樓的按鈕和電梯內(nèi)的按鈕來(lái)控制n部電梯的移動(dòng)。
2.提出非形式化策略
為了提出一種解決上述問(wèn)題的非形式化策略,必須確定問(wèn)題的約束條件。在9.7.1小節(jié)中已經(jīng)對(duì)電梯問(wèn)題提出了三種約束。最好能用一小段文字把非形式化策略清楚地表達(dá)出來(lái)。
對(duì)電梯問(wèn)題來(lái)說(shuō),解決問(wèn)題的非形式化策略可表達(dá)如下:
在一幢有m層樓的大廈里,用電梯內(nèi)的和每個(gè)樓層的按鈕來(lái)控制n部電梯的移動(dòng)。當(dāng)按下電梯按鈕以請(qǐng)求在某一指定樓層停下時(shí),按鈕指示燈亮;當(dāng)請(qǐng)求獲得滿足時(shí),指示燈熄滅;當(dāng)電梯無(wú)升降操作時(shí),關(guān)門并停在當(dāng)前樓層。
3.把策略形式化
在以上這段描述非形式化策略的文字中,共有八個(gè)不同的名詞:按鈕、電梯、樓層、移動(dòng)、大廈、指示燈、請(qǐng)求和門。這些名詞所代表的事物可作為類的初步候選者。其中,樓層和大廈是處于問(wèn)題邊界之外的,因此可以忽略;移動(dòng)、指示燈、請(qǐng)求和門可以作為其他類的屬性。例如,指示燈(的狀態(tài))可作為按鈕類的屬性,門(的狀態(tài))可作為電梯類的屬性。經(jīng)過(guò)上述篩選后只剩下兩個(gè)候選類,即電梯和按鈕。
在非形式化策略中實(shí)際上指定了兩類按鈕,因此,應(yīng)該為按鈕類定義兩個(gè)子類——電梯按鈕和樓層按鈕??偨Y(jié)以上分析結(jié)果,得出圖9.16所示的對(duì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 結(jié)婚禮品采購(gòu)方案(3篇)
- 甘肅銀行面試實(shí)戰(zhàn)模擬題庫(kù):深度解析面試技巧與答案
- 財(cái)政規(guī)問(wèn)題督查方案(3篇)
- 2025建行基金考試題庫(kù)及答案
- 2025年陸豐市市直機(jī)關(guān)遴選考試筆試試題(含答案)
- 2026屆吉林市四平市化學(xué)高一上期末質(zhì)量檢測(cè)模擬試題含解析
- 駕照考試題庫(kù)及答案
- 2025-2030中國(guó)文化用品制造市場(chǎng)供需前景及未來(lái)產(chǎn)銷需求分析報(bào)告
- 骨科學(xué)考試題庫(kù)及答案
- 幕墻施工培訓(xùn)課件
- 2025年小學(xué)教研室教學(xué)計(jì)劃
- 2025年福建省中小學(xué)教師招聘考試試卷-教育綜合基礎(chǔ)知識(shí)試題及答案
- 會(huì)展物品租賃管理辦法
- 2025年安徽省初中學(xué)業(yè)水平考試中考物理真題試卷(中考真題+答案)
- 2025年放射醫(yī)學(xué)技術(shù)師中級(jí)技術(shù)職稱考試試題(附答案)
- 販賣人口罪與強(qiáng)迫勞動(dòng)罪
- 新員工入職職業(yè)道德培訓(xùn)
- 婚內(nèi)債務(wù)隔離協(xié)議書范本
- 2025秋部編版(2024)八年級(jí)上冊(cè)語(yǔ)文上課課件 第三單元 閱讀綜合實(shí)踐
- 高中英語(yǔ)必背3500單詞表完整版
- 電網(wǎng)工程設(shè)備材料信息參考價(jià)2025年第一季度
評(píng)論
0/150
提交評(píng)論