版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第10章面向?qū)ο蟮姆椒▽W10.1面向?qū)ο蟮母拍?0.2面向?qū)ο蟮哪P?0.3面向?qū)ο蟮姆治?0.4面向?qū)ο蟮脑O計10.5面向?qū)ο蟮膶崿F(xiàn)10.6面向?qū)ο蠛突趯ο蟮膮^(qū)別10.7實戰(zhàn)訓練 10.1面向?qū)ο蟮母拍?/p>
面向?qū)ο?ObjectOriented,OO)是當前計算機界關心的重點,它是20世紀90年代軟件開發(fā)方法的主流。面向?qū)ο蟮母拍詈蛻靡殉搅顺绦蛟O計和軟件開發(fā),擴展到很寬的范圍,如數(shù)據(jù)庫系統(tǒng)、交互式界面、應用結(jié)構(gòu)、應用平臺、分布式系統(tǒng)、網(wǎng)絡管理結(jié)構(gòu)、CAD技術、人工智能等領域。
起初,“面向?qū)ο蟆笔菍V冈诔绦蛟O計中采用封裝、繼承、抽象等設計方法。可是,這個定義顯然不再適合現(xiàn)在的情況。面向?qū)ο蟮乃枷胍呀?jīng)涉及軟件開發(fā)的各個方面,如面向?qū)ο蟮姆治?ObjectOrientedAnalysis,OOA)、面向?qū)ο蟮脑O計(ObjectOrientedDesign,OOD)以及我們經(jīng)常說的面向?qū)ο蟮木幊虒崿F(xiàn)(ObjectOrientedProgramming,OOP)。10.1.1傳統(tǒng)開發(fā)方法存在的問題
1.軟件重用性差
重用性是指同一事物不經(jīng)修改或稍加修改就可多次重復使用的性質(zhì)。傳統(tǒng)的程序設計通過庫函數(shù)的方式來實現(xiàn)重用。實踐表明,標準函數(shù)庫缺乏靈活性,往往難以適應不同應用場合的不同要求。對于用戶自己設計的功能模塊,對它的重用也有限制:一方面要保證功能完全相同,否則需要進行修改;另一方面,過程和數(shù)據(jù)是相互依賴的,功能的變化往往涉及數(shù)據(jù)結(jié)構(gòu)的改變,如果新的應用中的數(shù)據(jù)與原來模塊中的數(shù)據(jù)不同,那么在對數(shù)據(jù)進行修改的同時,功能模塊也需要修改。
2.軟件可維護性差
軟件工程強調(diào)軟件的可維護性,強調(diào)文檔資料的重要性,規(guī)定最終的軟件產(chǎn)品應該由完整、一致的配置成分組成。在軟件開發(fā)過程中,始終強調(diào)軟件的可讀性、可修改性和可測試性是軟件重要的質(zhì)量指標。實踐證明,用傳統(tǒng)方法開發(fā)出來的軟件,維護時其費用和成本仍然很高,其原因是可修改性差,維護困難,導致可維護性差。
3.開發(fā)出的軟件不能滿足用戶需要
用傳統(tǒng)的結(jié)構(gòu)化方法開發(fā)大型軟件系統(tǒng)涉及各種不同領域的知識,在開發(fā)需求模糊或需求動態(tài)變化的系統(tǒng)時,所開發(fā)出的軟件系統(tǒng)往往不能真正滿足用戶的需要。用結(jié)構(gòu)化方法開發(fā)的軟件,其穩(wěn)定性、可修改性和可重用性都比較差,這是因為結(jié)構(gòu)化方法的本質(zhì)是功能分解,從代表目標系統(tǒng)整體功能的單個處理著手,自頂向下,不斷把復雜的處理分解為子處理,這樣一層一層地分解下去,直到僅剩下若干個容易實現(xiàn)的子功能處理為止,然后用相應的工具來描述各個最底層的處理。因此,結(jié)構(gòu)化方法是圍繞實現(xiàn)處理功能的“過程”來構(gòu)造系統(tǒng)的。然而,用戶需求的變化大部分是針對功能的,因此,這種變化對于基于過程的設計來說是災難性的。用這種方法設計出來的系統(tǒng)結(jié)構(gòu)常常是不穩(wěn)定的,用戶需求的變化往往造成系統(tǒng)結(jié)構(gòu)的較大變化,從而需要花費很大代價才能實現(xiàn)這種變化。10.1.2面向?qū)ο蟮幕靖拍?/p>
1.對象
對象是人們要進行研究的任何事物,從最簡單的整數(shù)到復雜的飛機等均可看做對象,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計劃或事件。我們所指的對象是計算機中的對象,是對現(xiàn)實中對象的模擬,它抽象出現(xiàn)實世界中對象的特征和行為,分別用數(shù)據(jù)和函數(shù)刻畫,并封裝成一個整體。模擬后的計算機對象既能體現(xiàn)現(xiàn)實世界事物的狀態(tài),也具有相應的行為。
在不同領域中對于對象有不同理解。一般認為,對象就是一種事物,一個實體。在面向?qū)ο箢I域中,最好從以下兩個角度來理解它,一是從概念上講什么是對象,二是在實際系統(tǒng)中如何實現(xiàn)一個對象。從概念上講,對象是代表著正在創(chuàng)建的系統(tǒng)中的一個實體。例如,對于一個商品銷售系統(tǒng),顧客、商品、柜臺、廠家等都是對象,這些對象對于實現(xiàn)系統(tǒng)的完整功能都是必要的。
從實現(xiàn)形式上講,對象是一個狀態(tài)和操作(方法)的封裝體。狀態(tài)是由對象的數(shù)據(jù)結(jié)構(gòu)的內(nèi)容和值定義的;方法是一系列的實現(xiàn)步驟,它是由若干操作構(gòu)成的。
對象實現(xiàn)了信息隱藏,對象與外部是通過操作接口聯(lián)系的,方法的具體實現(xiàn)外部是不可見的。封裝的目的就是阻止非法的訪問,操作接口提供了這個對象的功能。對象是通過消息與另一個對象傳遞信息的,每當一個操作被調(diào)用時,就有一條消息被發(fā)送到這個對象上,消息帶來了將被執(zhí)行的這個操作的詳細內(nèi)容。一般來講,消息傳遞的語法隨系統(tǒng)不同而不同,其他組成部分包括目標對象、所請求的方法和參數(shù)。
2.對象的狀態(tài)和行為
對象具有狀態(tài),一個對象用數(shù)據(jù)值來描述它的狀態(tài)。對象還有操作,用于改變對象的狀態(tài)。對象及其操作就是對象的行為。對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對象的統(tǒng)一體中。
3.類
我們習慣上把具有相同或相似性質(zhì)的對象劃分成類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象。
類是創(chuàng)建對象的樣板,它包含著所創(chuàng)建對象的狀態(tài)描述和方法的定義。類的完整描述包含了外部接口和內(nèi)部算法以及數(shù)據(jù)結(jié)構(gòu)的形式。由一個特定的類所創(chuàng)建的對象稱為這個類的實例,因此類是對象的抽象及描述,它是具有共同行為的若干對象的統(tǒng)一描述體。類中要包含生成對象的具體方法。類是抽象數(shù)據(jù)類型的實現(xiàn)。一個類的所有對象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實現(xiàn)操作的代碼,而各個對象有著各自不同的狀態(tài),即私有的存儲。因此,類是所有對象共同的行為和不同狀態(tài)的集合體。
類具有屬性,屬性是對象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。類具有操作,操作是對象的行為的抽象,用操作名和實現(xiàn)該操作的方法來描述。
4.類的結(jié)構(gòu)
在客觀世界中有若干類,這些類之間有一定的結(jié)構(gòu)關系。通常有兩種主要的結(jié)構(gòu)關系,即一般—具體結(jié)構(gòu)關系和整體—部分結(jié)構(gòu)關系。
①一般—具體結(jié)構(gòu)稱為分類結(jié)構(gòu),也可以說是“或”關系或者是“isa”關系。
②整體—部分結(jié)構(gòu)稱為組裝結(jié)構(gòu),它們之間的關系是一種“與”關系,或者是“hasa”關系。
5.消息和方法
對象之間進行通信的結(jié)構(gòu)叫做消息。在對象的操作中,當一個消息發(fā)送給某個對象時,消息中包含接收對象去執(zhí)行某種操作的信息。發(fā)送一條消息至少要包括說明接收消息的對象名、發(fā)送給該對象的消息名(即對象名、方法名)。一般還要對參數(shù)加以說明,參數(shù)可以是認識該消息的對象所知道的變量名,或者是所有對象都知道的全局變量名。
類中操作的實現(xiàn)過程叫做方法,一個方法包含方法名、參數(shù)、方法體。
對象、類和消息傳遞如圖10.1所示。圖10.1對象、類和消息傳遞10.1.3面向?qū)ο蟮奶卣?/p>
面向?qū)ο蟮奶卣靼ǎ?/p>
(1)對象唯一性。每個對象都有自身唯一的標識,通過這種標識可找到相應的對象。在對象的整個生命期中,它的標識都不改變。不同的對象不能有相同的標識。
(2)分類性。分類性是指將具有一致的數(shù)據(jù)結(jié)構(gòu)(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質(zhì),而忽略其他一些無關內(nèi)容。任何類的劃分都是主觀的,但必須與具體的應用有關。
(3)繼承性。繼承性是子類自動共享父類數(shù)據(jù)結(jié)構(gòu)和方法的機制,這是類之間的一種關系。在定義和實現(xiàn)一個類的時候,可以在一個已經(jīng)存在的類的基礎之上來進行,把這個已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并加入若干新的內(nèi)容。
繼承性是面向?qū)ο蟪绦蛟O計語言不同于其他語言的最重要的特點,是其他語言所沒有的。在類層次中,子類只繼承一個父類的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為單重繼承。在類層次中,若子類繼承了多個父類的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為多重繼承。在軟件開發(fā)中,類的繼承性使所建立的軟件具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它減少了對象、類的創(chuàng)建工作量,增加了代碼的可重用性。類的繼承性提供了類的規(guī)范的等級結(jié)構(gòu)。通過類的繼承關系,使公共的特性能夠共享,提高了軟件的重用性。
(4)多態(tài)性。多態(tài)性是指相同的操作或函數(shù)、過程可作用于多種類型的對象上并獲得不同的結(jié)果。換句話說,不同的對象收到同一消息可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性。多態(tài)性允許每個對象以適合自身的方式去響應共同的消息。多態(tài)性增強了軟件的靈活性和重用性。10.1.4面向?qū)ο蟮囊?/p>
面向?qū)ο蟮囊匕ǎ?/p>
(1)抽象。抽象是指強調(diào)實體的本質(zhì)、內(nèi)在的屬性。在系統(tǒng)開發(fā)中,抽象指的是在決定如何實現(xiàn)對象之前的對象的意義和行為。使用抽象可以盡可能避免過早地考慮一些細節(jié)。類實現(xiàn)了對象的數(shù)據(jù)(即狀態(tài))和行為的抽象。
(2)封裝性(信息隱藏)。封裝性是保證軟件部件具有優(yōu)良的模塊性的基礎。面向?qū)ο蟮念愂欠庋b良好的模塊,類定義將其說明(用戶可見的外部接口)與實現(xiàn)(用戶不可見的內(nèi)部實現(xiàn))顯式地分開,其內(nèi)部實現(xiàn)按其具體定義的作用域提供保護。對象是封裝的最基本單位。封裝防止了因程序相互依賴而帶來的變動影響。面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、有力。
(3)共享性。面向?qū)ο蠹夹g在不同級別上促進了同一類中的共享。同一類中的對象有著相同數(shù)據(jù)結(jié)構(gòu),這些對象之間存在結(jié)構(gòu)、行為特征的共享關系。共享性分為兩種。一種是在同一應用的類層次結(jié)構(gòu)中,存在繼承關系的各相似子類中,存在數(shù)據(jù)結(jié)構(gòu)和行為的繼承,使各相似子類共享共同的結(jié)構(gòu)和行為。使用繼承來實現(xiàn)代碼的共享,這也是面向?qū)ο蟮闹饕獌?yōu)點之一。另一種共享是在不同應用中的共享。面向?qū)ο蟛粌H允許在同一應用中共享信息,而且為未來目標的可重用設計準備了條件。通過類庫這種機制和結(jié)構(gòu)可實現(xiàn)不同應用中的信息共享。
(4)強調(diào)對象結(jié)構(gòu)而不是程序結(jié)構(gòu)。10.1.5面向?qū)ο蟮拈_發(fā)方法
目前,面向?qū)ο箝_發(fā)方法的研究已日趨成熟,國際上已有不少面向?qū)ο螽a(chǎn)品出現(xiàn)。面向?qū)ο箝_發(fā)方法有Coad方法、Booch方法和OMT方法等。
1.Booch方法
Booch最先描述了面向?qū)ο蟮能浖_發(fā)方法的基本問題,指出面向?qū)ο箝_發(fā)是一種根本不同于傳統(tǒng)的功能分解的設計方法。面向?qū)ο蟮能浖纸飧咏藢陀^事務的理解,而功能分解只通過問題空間的轉(zhuǎn)換來獲得。
2.Coad方法
Coad方法是1989年Coad和Yourdon提出的面向?qū)ο箝_發(fā)方法。該方法的主要優(yōu)點是通過多年來大系統(tǒng)開發(fā)的經(jīng)驗與面向?qū)ο蟾拍畹挠袡C結(jié)合,在對象、結(jié)構(gòu)、屬性和操作的認定方面提出了一套系統(tǒng)的原則。該方法從需求角度進一步進行類和類層次結(jié)構(gòu)的認定。盡管Coad方法沒有引入類和類層次結(jié)構(gòu)的術語,但事實上已經(jīng)在分類結(jié)構(gòu)、屬性、操作、消息關聯(lián)等概念中體現(xiàn)了類和類層次結(jié)構(gòu)的特征。
3.OMT方法
OMT方法是1991年由JamesRumbaugh等5人提出來的,其經(jīng)典著作為《面向?qū)ο蟮慕Ec設計》。該方法是一種新興的面向?qū)ο蟮拈_發(fā)方法,開發(fā)工作的基礎是對真實世界的對象建模,然后圍繞這些對象使用分析模型來進行獨立于語言的設計。面向?qū)ο蟮慕:驮O計促進了對需求的理解,有利于開發(fā)更清晰、更容易維護的軟件系統(tǒng)。該方法為大多數(shù)應用領域的軟件開發(fā)提供了一種實際的、高效的保證,努力尋求一種問題求解的實際方法。
4.UML(UnifiedModelingLanguage)語言
軟件工程領域在1995~1997年取得了前所未有的進展,其成果超過軟件工程領域過去15年的成就總和,其中最重要的成果之一就是統(tǒng)一建模語言(UML)的出現(xiàn)。UML將是面向?qū)ο蠹夹g領域內(nèi)占主導地位的標準建模語言。
UML不僅統(tǒng)一了Booch方法、OMT方法、OOSE方法的表示方法,而且對其作了進一步的發(fā)展,最終統(tǒng)一為大眾普遍接受的標準建模語言。UML是一種定義良好、易于表達、功能強大且普遍適用的建模語言。它融入了軟件工程領域的新思想、新方法和新技術。它的作用域不僅限于支持面向?qū)ο蟮姆治雠c設計,還支持從需求分析開始的軟件開發(fā)全過程。 10.2面向?qū)ο蟮哪P?/p>
10.2.1對象模型
對象模型表示了靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)數(shù)據(jù)性質(zhì),描述了系統(tǒng)的靜態(tài)結(jié)構(gòu),它是從客觀世界實體的對象關系角度來描述和表現(xiàn)對象間相互關系的。該模型主要關心系統(tǒng)中對象的結(jié)構(gòu)、屬性和操作,它是分析階段三個模型的核心,是其他兩個模型的框架。
1.對象和類
(1)對象。對象建模的目的就是描述對象。
10.2類的符號表示
(2)類。通過將對象抽象成類,我們可以使問題抽象化。抽象增強了模型的歸納能力。類的符號表示如圖10.2所示。
(3)屬性。屬性指的是類中對象所具有的性質(zhì)(數(shù)據(jù)值)。
(4)操作和方法。操作是類中對象所使用的一種功能或變換。類中的各對象可以共享操作,每個操作都有一個目標對象作為其隱含參數(shù)。方法是類的操作的實現(xiàn)步驟。
2.關聯(lián)
關聯(lián)用于描述類與類之間的連接。由于對象是類的實例,因此,類與類之間的關聯(lián)也就是其對象之間的關聯(lián)。類與類之間有多種連接方式,每種連接的含義各不相同(語義的連接),但外部表示形式相似,故統(tǒng)稱為關聯(lián)。關聯(lián)關系一般都是雙向的,即關聯(lián)的對象雙方彼此都能與對方通信。反過來說,如果某兩個類的對象之間存在可以互相通信的關系,或者說對象雙方能夠感知另一方,那么這兩個類之間就存在關聯(lián)關系。描述這種關系常用的字句是“彼此知道”、“互相連接”等。
根據(jù)不同的含義,關聯(lián)可分為普通關聯(lián)、遞歸關聯(lián)、限定關聯(lián)、或關聯(lián)、有序關聯(lián)、三元關聯(lián)(見圖10.3)和聚合等七種。比較常用的關聯(lián)有普通關聯(lián)、遞歸關聯(lián)和聚合。圖10.3三元關聯(lián)
(1)普通關聯(lián)。普通關聯(lián)是最常見的一種關聯(lián),只要類與類之間存在連接關系,就可以用普通關聯(lián)表示。比如,作家使用計算機,計算機會將處理結(jié)果等信息返回給作家,那么,在其各自所對應的類之間就存在普通關聯(lián)關系。普通關聯(lián)的圖示是連接兩個類之間的直線,如圖10.4所示。圖10.4普通關聯(lián)示例由于關聯(lián)是雙向的,可以在關聯(lián)的一個方向上為關聯(lián)起一個名字,而在另一個方向上起另一個名字(也可不起名字)。名字通常緊挨著直線書寫。為了避免混淆,在名字的前面或后面帶一個表示關聯(lián)方向的黑三角,黑三角的尖角指明這個關聯(lián)只能用在尖角所指的類上。
如果類與類之間的關聯(lián)是單向的,則稱為導航關聯(lián)。導航關聯(lián)采用實線箭頭連接兩個類,只在箭頭所指的方向上才有這種關聯(lián)關系。如圖10.5所示,圖中只表示某人可以擁有汽車,但汽車被人擁有的情況沒有表示出來。其實,雙向的普通關聯(lián)可以看做導航關聯(lián)的特例,只不過省略了表示兩個關聯(lián)方向的箭頭罷了。圖10.5導航關聯(lián)示例除了上述的圖示方式外,還可以在類圖中圖示關聯(lián)中的數(shù)量關系——重數(shù)。比如,一個人可以擁有零輛車或多輛車。表示數(shù)量關系時,用重數(shù)說明數(shù)量或數(shù)量范圍,即有多少個對象能被連接起來。例如:
0..1表示零到1個對象;
0..*或*表示零到多個對象;
5..17表示5到17個對象;
2表示2個對象。如果圖中沒有明確標識關聯(lián)的重數(shù),那就意味著是1。類圖中,重數(shù)標識處在表示關聯(lián)關系的某一方向上直線的末端。圖10.6中關聯(lián)的含義是:人可以擁有零到多輛車,車可以被1至多個人擁有。而圖10.5則只說明人可以擁有零至多輛車。圖10.6關聯(lián)的重數(shù)示例(2)遞歸關聯(lián)。如果一個類與它本身有關聯(lián)關系,那么這種關聯(lián)稱為遞歸關聯(lián)。
任何關聯(lián)關系中都涉及與此關聯(lián)有關的角色,也就是與此關聯(lián)相連的類中的對象所扮演的角色。比如,在圖10.7中的“結(jié)婚”遞歸關聯(lián)關系中,一個人與另一個人結(jié)婚,必然有一個人扮演的是丈夫角色,另一個人是妻子角色。圖10.7關聯(lián)中的角色示例關聯(lián)中的角色通常用字符串命名。在類圖中,把角色的名字放置在與此角色有關的關聯(lián)關系(直線)的末端,并且緊挨著使用該角色的類。角色名是關聯(lián)的一個組成部分,建模者可根據(jù)需要選用。引入角色的好處是能夠指明類和類對象之間的聯(lián)系。注意,角色名不是類的組成部分,一個類可以在不同的關聯(lián)中扮演不同的角色。
(3)聚合。聚合是關聯(lián)的特例。如果類與類之間的關系具有“整體與部分”的特點,則把這樣的關聯(lián)稱為聚合。例如,汽車由車輪、發(fā)動機、底盤等構(gòu)成,則汽車的類與表示輪子的類、發(fā)動機的類、底盤的類之間的關系就具有“整體與部分”的特點,因此,這是一個聚合關系。識別聚合關系的常用方法是尋找“由……構(gòu)成”、“包含”、“是……的一部分”等字句,這些字句很好地反映了相關類之間的“整體與部分”關系。
聚合的圖示方式為,在表示關聯(lián)關系的直線末端加一個空心的小菱形,空心菱形緊挨著具有整體性質(zhì)的類,如圖10.8所示。聚合關系中可以出現(xiàn)重數(shù)、角色(僅用于表示部分的類)和限定詞,也可以給聚合關系命名,圖10.8所示的聚合關系表示海軍由許多軍艦組成。圖10.8聚合的示例除去上述的一般聚合外,聚合還有兩種特殊的聚合方式,即共享聚合和復合聚合。
如果聚合關系中處于部分方的對象同時參與了多個處于整體方對象的構(gòu)成,則該聚合稱為共享聚合。比如,一個球隊(整體方)由多個球員(部分方)組成,但是一個球員還可能加入多個球隊,球隊和球員之間的這種關系就是共享聚合。共享聚合關系可以通過聚合的重數(shù)反映出來(不必引入另外的圖示符號)。如果作為整體方的類的重數(shù)不是1,那么該聚合就是共享聚合,如圖10.9所示。圖10.9共享聚合示例如果構(gòu)成整體類的部分類完全隸屬于整體類,則這樣的聚合稱為復合聚合。換句話說,如果沒有整體類則部分類也沒有存在的價值,部分類的存在是因為有整體類的存在。
比如,窗口由文本框、列表框、按鈕和菜單組成。整體方的重數(shù)必須是0或1,部分方的重數(shù)可取任意范圍值,如圖10.10所示。圖10.10復合聚合示例
3.繼承
一個類的所有信息(屬性或操作)能被另一個類繼承,繼承某個類的子類中不僅可以有屬于自己的信息,而且還擁有了被繼承類中的信息。
比如,小汽車是交通工具,如果定義了一個交通工具類表示關于交通工具的抽象信息(發(fā)動、行駛等),那么這些信息(通用元素)可以繼承到小汽車類(具體元素)中。引入繼承的好處在于,由于把一般的公共信息放在父類中,因此處理某個具體特殊情況時只需定義該情況的個別信息即可。公共信息從父類中繼承得來,增強了系統(tǒng)的靈活性、易維護性和可擴充性。程序員只要定義新擴充或更改的信息就可以了,舊的信息完全不必修改(仍可繼續(xù)使用),這大大縮短了維護系統(tǒng)的時間。繼承某類所有信息的具體類稱為子類,被繼承類稱為父類??梢詮母割愔欣^承的信息有屬性、操作和所有的關聯(lián)關系。
父類與子類的繼承關系圖示為一個帶空心三角形的直線,空心三角形緊挨著父類。如圖10.11所示,交通工具是父類,其他類是從其派生出的子類。圖10.11繼承關系示例類的繼承關系可以是多層的。也就是說,一個子類本身還可以作為另一個類的父類,層層繼承下去。如圖10.12所示,“車”是“交通工具”的子類,同時又是“卡車”的父類。圖10.12類的多層繼承示例
(1)識別繼承關系。確定了類中應該定義的屬性之后,就可以利用繼承機制共享公共性質(zhì),并對系統(tǒng)中眾多的類加以組織。繼承關系的建立實質(zhì)上是知識抽取的過程,它應該反映出一定深度的領域知識,因此必須有領域?qū)<颐芮信浜喜拍芡瓿伞TS多歸納關系都是根據(jù)客觀世界現(xiàn)有的分類模式建立起來的,只要可能,就應該使用現(xiàn)有的概念。
一般來說,可以使用兩種方式建立繼承(即歸納)關系。
●自底向上:抽象出現(xiàn)有類的共同性質(zhì)并泛化出父類,這個過程實質(zhì)上模擬了人類歸納思維的過程?!褡皂斚蛳拢喊熏F(xiàn)有類細化成更具體的子類,這模擬了人類的演繹思維過程。從應用域中常常能明顯看出應該做的自頂向下的具體化工作。例如,帶有形容詞修飾的名詞詞組往往暗示了一些具體類。但是,在分析階段應該避免過度細化。
使用多重繼承機制時,通常應該指定一個主要父類,從它繼承大部分屬性和行為;次要父類只補充一些屬性和行為。
(2)反復修改。在實際的建模過程中,不要期望僅僅經(jīng)過一次建模過程就得到完全正確的對象模型。事實上,軟件建模過程本身就是一個反復修改、逐步完善的過程。在建模的任何一個步驟中,如果發(fā)現(xiàn)了模型的缺陷,都必須返回前期階段進行修改。由于面向?qū)ο蟮母拍詈头栐谡麄€開發(fā)過程中都是一致的,因此更容易實現(xiàn)反復修改及逐步完善的過程。
4.對象模型
對象模型是由一個或若干個模板組成的。模板將模型分為若干個便于管理的子塊,在整個對象模型和類及關聯(lián)的構(gòu)造塊之間,模板提供了一種集成的中間單元。模板中的類名及關聯(lián)名是唯一的。10.2.2動態(tài)模型
動態(tài)模型是與時間和變化有關的系統(tǒng)性質(zhì)。該模型描述了系統(tǒng)的控制結(jié)構(gòu),表示了瞬間的、行為化的系統(tǒng)控制性質(zhì)。它關心的是系統(tǒng)的控制和操作的執(zhí)行順序。
動態(tài)模型描述的系統(tǒng)屬性是觸發(fā)事件、事件序列、狀態(tài)、事件與狀態(tài)的組織。該模型使用狀態(tài)圖作為描述工具,它涉及事件、狀態(tài)、操作等重要概念。
1.事件
事件是指定時刻發(fā)生的某件事。圖10.13為打電話事件跟蹤圖。圖10.13打電話事件跟蹤圖
2.狀態(tài)
狀態(tài)是對象屬性值的抽象。對象的屬性值按照影響對象顯著行為的性質(zhì)被歸并到一個狀態(tài)中去。狀態(tài)指明了對象對輸入事件的響應。
3.狀態(tài)圖
狀態(tài)圖用來描述一個特定對象的所有可能狀態(tài)及引起狀態(tài)轉(zhuǎn)移的事件。大多數(shù)面向?qū)ο蠹夹g都用狀態(tài)圖表示單個對象在其生命周期中的行為。一個狀態(tài)圖包括一系列的狀態(tài)以及狀態(tài)之間的轉(zhuǎn)移。(1)狀態(tài)。所有對象都具有狀態(tài),狀態(tài)是對象執(zhí)行了一系列活動的結(jié)果。當某個事件發(fā)生后,對象的狀態(tài)將發(fā)生變化。狀態(tài)圖中定義的狀態(tài)有初態(tài)、終態(tài)、中間狀態(tài)、復合狀態(tài)。其中,初態(tài)是狀態(tài)圖的起始點,而終態(tài)則是狀態(tài)圖的終點。一個狀態(tài)圖只能有一個初態(tài),而終態(tài)則可以有多個。中間狀態(tài)包括兩個區(qū)域:名字域和內(nèi)部轉(zhuǎn)移域,如圖10.14所示。圖中,圓角矩形中上方為名字域,下方為內(nèi)部轉(zhuǎn)移域。內(nèi)部轉(zhuǎn)移域是可選的,其中所列的動作將在對象處于該狀態(tài)時執(zhí)行,且該動作的執(zhí)行并不改變對象的狀態(tài)。entry、exit分別為入口動作、出口動作。圖10.14一個帶有動作域的狀態(tài)
(2)轉(zhuǎn)移。狀態(tài)圖中狀態(tài)之間帶箭頭的連線被稱為轉(zhuǎn)移。狀態(tài)的改變通常是由事件觸發(fā)的,此時應在轉(zhuǎn)移上標出觸發(fā)轉(zhuǎn)移的事件表達式。如果在轉(zhuǎn)移上未標明事件,則表示在源狀態(tài)的內(nèi)部活動執(zhí)行完畢后自動觸發(fā)轉(zhuǎn)移。10.2.3功能模型
功能模型描述了系統(tǒng)的所有計算。功能模型指出發(fā)生了什么,動態(tài)模型確定什么時候發(fā)生,而對象模型則確定發(fā)生的客體。功能模型表明一個計算如何從輸入值得到輸出值,而不考慮計算的次序。功能模型由多張數(shù)據(jù)流圖組成。數(shù)據(jù)流圖用來表示從源對象到目標對象的數(shù)據(jù)值的流向,它不包含控制信息,控制信息在動態(tài)模型中表示;同時數(shù)據(jù)流圖也不表示對象中值的組織,值的組織在對象模型中表示。數(shù)據(jù)流圖中包含處理、數(shù)據(jù)流、動作對象和數(shù)據(jù)存儲對象。
(1)處理。數(shù)據(jù)流圖中的處理用來改變數(shù)據(jù)值。最低層的處理是純粹的函數(shù),一張完整的數(shù)據(jù)流圖是一個高層處理。
(2)數(shù)據(jù)流。數(shù)據(jù)流圖中的數(shù)據(jù)流將對象的輸出與處理、處理與對象的輸入、處理與處理聯(lián)系起來。在計算機中,用數(shù)據(jù)流來表示中間數(shù)據(jù)值,數(shù)據(jù)流不能改變數(shù)據(jù)值。
(3)動作對象。動作對象是一種主動對象,它通過生成或者使用數(shù)據(jù)值來驅(qū)動數(shù)據(jù)流圖。
(4)數(shù)據(jù)存儲對象。數(shù)據(jù)流圖中的數(shù)據(jù)存儲是被動對象,它用來存儲數(shù)據(jù)。與動作對象不一樣,數(shù)據(jù)存儲對象本身不產(chǎn)生任何操作,它只響應存儲和訪問的要求。 10.3面向?qū)ο蟮姆治?/p>
面向?qū)ο蠓治龅哪康氖菍陀^世界的系統(tǒng)進行建模。上面介紹的模型概念為基礎,下面結(jié)合“銀行網(wǎng)絡系統(tǒng)”的具體實例來構(gòu)造客觀世界問題的準確、嚴密的分析模型。
分析模型有三種用途:用來明確問題需求;為用戶和開發(fā)人員提供明確需求;為用戶和開發(fā)人員提供一個協(xié)商的基礎,作為后繼的設計和實現(xiàn)的框架。
10.3.1面向?qū)ο蟮姆治鲞^程
面向?qū)ο蟮姆治鲞^程如圖10.15所示。圖10.15面向?qū)ο蟮姆治鲞^程系統(tǒng)分析的第一步是:陳述需求。分析者必須同用戶一起工作來提煉需求,因為這樣才能了解用戶的真實意圖,其中涉及對需求的分析及查找丟失的信息。下面以“銀行網(wǎng)絡系統(tǒng)”為例,用面向?qū)ο蠓椒ㄟM行開發(fā)。
銀行網(wǎng)絡系統(tǒng)問題陳述:設計一個支持銀行ATM計算機網(wǎng)絡系統(tǒng)的軟件。這個網(wǎng)絡包括柜員機和自動取款機(ATM),由聯(lián)營機構(gòu)共享。每個營業(yè)部提供各自的計算機來維護它的賬戶并處理面臨的事務。柜員機屬于各營業(yè)部,并且直接與營業(yè)部計算機通信,柜員輸入賬務并處理數(shù)據(jù)。ATM與中心處理機通信。中心處理機分理事務到相應的營業(yè)部。ATM接收現(xiàn)金卡,與用戶交互,與中心處理機通信完成事務處理、分配現(xiàn)金和打印收據(jù)。系統(tǒng)需要恰當?shù)挠涗浐桶踩WC。系統(tǒng)必須正確控制對同一賬號的并發(fā)訪問。營業(yè)部提供自己的計算機軟件。共享系統(tǒng)的費用由各營業(yè)部根據(jù)現(xiàn)金卡數(shù)量來分擔。圖10.16銀行網(wǎng)絡系統(tǒng)示意圖10.3.2建立對象模型
首先對類進行標識和關聯(lián),因為它們影響了整體結(jié)構(gòu)和解決問題的方法;其次要增加屬性,進一步描述類和關聯(lián)的基本網(wǎng)絡,使用繼承合并和組織類;最后將操作增加到類中去,作為構(gòu)造動態(tài)模型和功能模型的副產(chǎn)品。
1.確定類
構(gòu)造對象模型的第一步是標出來自問題域的相關的對象類,對象包括物理實體和概念。所有類在應用中都必須有意義。在問題陳述中,并非所有類都是明顯給出的,有些是隱含在問題域或一般知識中的。按圖10.17所示的過程確定類。圖10.17確定類的過程圖10.18暫定類根據(jù)下列標準,去掉不必要的類和不正確的類。
(1)冗余類:若兩個類表述了同一個信息,則保留最富有描述能力的類。例如,“業(yè)務”、“賬務”和“事務”就是重復的描述,因為“業(yè)務”最富有描述性,因此保留它。
(2)不相干的類:除掉與問題沒有關系或根本無關的類。例如,“費用”超出了銀行網(wǎng)絡的范圍。
(3)模糊類:類必須是確定的,有些暫定類的邊界定義模糊或范圍太廣,可去掉。例如“保存記錄裝置”就是模糊類,它是“事務”中的一部分。
(4)屬性:某些名詞描述的是其他對象的屬性,應從暫定類中刪除。如果某一性質(zhì)的獨立性很重要,就應該把它歸屬到類,而不把它作為屬性,例如“數(shù)據(jù)”、“現(xiàn)金”和“收據(jù)”。
(5)操作:如果問題陳述中的名詞有動作含義,則描述的操作就不是類。但是具有自身性質(zhì)而且需要獨立存在的操作應該描述成類。如果我們只構(gòu)造電話模型,“撥號”就是動態(tài)模型的一部分而不是類,但在電話撥號系統(tǒng)中,“撥號”是一個重要的類,它有日期、時間、受話地點等屬性。
在銀行網(wǎng)絡系統(tǒng)中,模糊類是“系統(tǒng)”、“安全裝置”、“保存記錄裝置”、“營業(yè)部網(wǎng)絡”等;屬于屬性的有“數(shù)據(jù)”、“收據(jù)”、“現(xiàn)金”;屬于實現(xiàn)的有“軟件”、“通信線”、“業(yè)務日志”等。這些均應去掉。
2.準備數(shù)據(jù)詞典
為所有建模實體準備一個數(shù)據(jù)詞典,用于準確描述各個類的精確含義,描述當前問題中的類的范圍,包括對類的成員、用法方面的假設或限制。
ATM系統(tǒng)類數(shù)據(jù)詞典:
賬戶:營業(yè)部的一個戶頭。賬戶可能有許多不同的類型,至少有支票賬戶和儲蓄賬戶。
ATM:允許客戶使用現(xiàn)金卡作為身份證明,進入自己賬戶的一種機器。ATM與客戶交互,通過收集業(yè)務處理信息并把該信息送至中心處理機的方式,驗明客戶的合法性,然后進行處理,把現(xiàn)金分配給客戶。這里假定一個ATM離開了網(wǎng)絡就不能運行。營業(yè)部:一個金融機構(gòu)。它代管客戶的賬目,發(fā)行現(xiàn)金卡,并授權客戶可以通過ATM網(wǎng)絡進入自己的賬戶取現(xiàn)金。
營業(yè)部計算機:營業(yè)部所擁有的、與ATM網(wǎng)絡以及該營業(yè)部柜員機相連接的計算機。一個營業(yè)部可能擁有一個用于處理內(nèi)部賬務的計算機網(wǎng)絡,但我們只關注與網(wǎng)絡通信的這臺計算機。
現(xiàn)金卡:營業(yè)部分發(fā)給客戶的卡片??蛻艨梢酝ㄟ^ATM用現(xiàn)金卡訪問自己的賬戶。每個卡包含一個營業(yè)部代碼和卡片號碼。營業(yè)部代碼唯一確定聯(lián)營機構(gòu)中的一個營業(yè)部??ㄆ枦Q定了該卡可訪問的賬戶。一張現(xiàn)金卡只屬于一個客戶,但可能會存在若干個拷貝,必須考慮在不同計算機上相同的現(xiàn)金卡同時使用的可能性。柜員:營業(yè)部的雇員。他授權把業(yè)務信息輸入柜員機,接收或分配現(xiàn)金和支票給客戶。柜員處理的業(yè)務、現(xiàn)金和支票必須記錄,并對其全部負責。
柜員機:柜員為客戶輸入業(yè)務信息的一套設備。柜員用此套設備開出支票和接收現(xiàn)金,并打印收據(jù)。柜員機與營業(yè)部計算機通信,使業(yè)務生效并進行處理。
中心處理機:由聯(lián)營機構(gòu)操縱的計算機。它協(xié)調(diào)ATM與營業(yè)部計算機之間的業(yè)務,負責驗明營業(yè)部代碼的有效性,但并不直接處理業(yè)務。聯(lián)營機構(gòu):多個營業(yè)部組成的一個組織機構(gòu),授命指揮和操作ATM網(wǎng)絡。該網(wǎng)絡僅處理屬于聯(lián)營機構(gòu)中的營業(yè)部之間的業(yè)務。
客戶:在營業(yè)部有一個或多個賬戶的所有者??蛻粲梢粋€或多個人或公司組成。通信方面與客戶組成無關,在不同的營業(yè)部有賬戶的同一個人視為不同的客戶。
業(yè)務:客戶對賬目的一個單一而完整的操作要求。我們只詳述ATM必須分發(fā)現(xiàn)金,但不排除打印支票或者接收現(xiàn)金、支票的可能性,因為我們應該考慮為客戶訪問自己的賬目提供更多的方便性和靈活性,盡管現(xiàn)在還不具備條件。不同的操作必須正確地結(jié)算。
3.確定關聯(lián)
兩個或多個類之間的相互依賴就是關聯(lián)。一種依賴表示一種關聯(lián),可用各種方式來實現(xiàn)關聯(lián),但在分析模型中應刪除實現(xiàn)的考慮,以便設計時更為靈活。關聯(lián)常用描述性動詞或動詞詞組來表示,其中有物理位置的表示、傳導的動作、通信、所有者關系、條件的滿足等。從問題陳述中抽取所有可能的關聯(lián)表述,把它們記下來,但不要過早地去細化這些表述。下面是銀行網(wǎng)絡系統(tǒng)中所有可能的關聯(lián),大多數(shù)是直接抽取問題中的動詞詞組而得到的。在陳述中,有些動詞詞組表述的關聯(lián)是不明顯的。當然,還有一些關聯(lián)與客觀世界或人的假設有關,必須同用戶一起核實這種關聯(lián),因為這種關聯(lián)在問題陳述中找不到。銀行網(wǎng)絡系統(tǒng)陳述中的關聯(lián):
●銀行網(wǎng)絡包括柜員機和自動取款機(ATM);
●聯(lián)營機構(gòu)共享自動取款機;
●營業(yè)部提供營業(yè)部計算機;
●營業(yè)部計算機保存賬戶;
●營業(yè)部計算機處理事務;
●營業(yè)部擁有柜員機;
●柜員機與營業(yè)部計算機通信;
●出納員為賬戶錄入事務;
●?ATM與中心處理機通信;
●?ATM接受現(xiàn)金卡;●?ATM與用戶交互;
●?ATM發(fā)放現(xiàn)金;
●?ATM打印收據(jù);
●系統(tǒng)處理并發(fā)訪問;
●營業(yè)部提供軟件;
●費用分攤給營業(yè)部。隱含的動詞詞組:
●聯(lián)營機構(gòu)由營業(yè)部組成;
●營業(yè)部擁有賬戶;
●聯(lián)營機構(gòu)擁有中心處理機;
●系統(tǒng)提供記錄保管;
●系統(tǒng)提供安全;
●客戶有現(xiàn)金卡。
基于問題域知識的關聯(lián):
●營業(yè)部雇傭出納員;
●通過現(xiàn)金卡可訪問賬戶。使用下列標準去掉不必要和不正確的關聯(lián):
(1)若某個類已被刪除,那么與它有關的關聯(lián)也必須刪除或者用其他類來重新表述。在本例中,我們刪除了“銀行網(wǎng)絡”,相關的關聯(lián)也要刪除。
(2)不相干的關聯(lián)或?qū)崿F(xiàn)階段的關聯(lián):刪除所有問題域之外的關聯(lián)或涉及實現(xiàn)結(jié)構(gòu)中的關聯(lián)。如“系統(tǒng)處理并發(fā)訪問”就是一種實現(xiàn)的概念。
(3)動作:關聯(lián)應該描述應用域的結(jié)構(gòu)性質(zhì)而不是瞬時事件,因此應刪除“ATM接受現(xiàn)金卡”、“ATM與用戶接口”等。
(4)派生關聯(lián):省略那些可以用其他關聯(lián)來定義的關聯(lián),因為這種關聯(lián)是冗余的。
4.確定屬性
屬性是個體對象的性質(zhì)。屬性通常用修飾性的名詞詞組來表示,形容詞常常表示具體的可枚舉的屬性值。屬性不可能在問題陳述中完全表述出來,必須借助于應用域的知識及對客觀世界的知識才可以找到它們。只考慮與具體應用直接相關的屬性,不要考慮那些超出問題范圍的屬性。首先找出重要屬性,避免那些只用于實現(xiàn)的屬性。要為各個屬性取有意義的名字。按下列標準刪除不必要的和不正確的屬性:
(1)對象。若實體的獨立存在比它的值重要,那么這個實體不是屬性而是對象。如在郵政目錄中,“城市”是一個屬性,然而在人口普查中,“城市”則被看做對象。在具體應用中,具有自身性質(zhì)的實體一定是對象。
(2)限定詞。若屬性值取決于某種具體上下文,則可考慮把該屬性重新表述為一個限定詞。
(3)名稱。名稱常常作為限定詞而不是對象的屬性。當名稱不依賴于上下文關系時,名稱即為一個對象屬性,尤其是它不唯一時。
(4)標識符。在考慮對象模糊性時,引入對象標識符表示。在對象模型中不列出這些對象標識符(它是隱含在對象模型中的),只列出存在于應用域的屬性。
(5)內(nèi)部值。若屬性描述了對外不透明的對象的內(nèi)部狀態(tài),則應從對象模型中刪除該屬性。
(6)細化。忽略那些不可能對大多數(shù)操作有影響的屬性。
5.使用繼承來細化類
使用繼承來共享公共機構(gòu),以此來組織類,可以用以下兩種方式來進行:
(1)自底向上,通過把現(xiàn)有類的共同性質(zhì)一般化為父類,尋找具有相似的屬性、關系或操作的類來發(fā)現(xiàn)繼承。例如“柜員業(yè)務”和“遠程事務”是類似的,可以一般化為“業(yè)務”。有些一般化結(jié)構(gòu)常常是基于客觀世界邊界的現(xiàn)有分類,只要可能,應盡量使用現(xiàn)有概念。對稱性常有助于發(fā)現(xiàn)某些丟失的類。
(2)自頂向下,將現(xiàn)有的類細化為更具體的子類。具體化常??梢詮膽糜蛑忻黠@看出來。應用域中各枚舉字的情況是最常見的具體化的來源。例如:菜單可以有固定菜單、頂部菜單、彈出菜單、下拉菜單等,這就可以把菜單類具體細化為各種具體菜單的子類。當同一關聯(lián)名出現(xiàn)多次且意義也相同時,應盡量具體化為相關聯(lián)的類。例如,“輸入設備”是“ATM”和“柜員機”的一般化。在類層次中,可以為具體的類分配屬性和關聯(lián)。各屬性都應分配給最一般的適合的類,有時也加上一些修正。
6.完善對象模型
不可能一次就保證對象模型是完全正確的,軟件開發(fā)的整個過程就是一個不斷完善的過程。模型的不同組成部分多半是在不同的階段完成的,如果發(fā)現(xiàn)模型有缺陷,就必須返回到前期階段去修改。有些細化工作是在動態(tài)模型和功能模型完成之后才開始進行的。具有屬性和繼承的ATM對象模型如圖10.19所示。圖10.19具有屬性和繼承的ATM對象模型
(1)幾種可能丟失對象的情況及解決辦法:
●同一類中存在毫無關系的屬性和操作,則分解這個類,使各部分相互關聯(lián);
●一般化體系不清楚,則分離扮演兩種角色的類;
●存在無目標類的操作,則找出并加上失去目標的類;
●存在名稱及目的相同的冗余關聯(lián),則通過一般化創(chuàng)建丟失的父類,把關聯(lián)組織在一起。
(2)查找多余的類。類中缺少屬性、操作和關聯(lián),則可刪除這個類。
(3)查找丟失的關聯(lián)。丟失了操作的訪問路徑,則加入新的關聯(lián)以回答查詢。10.3.3建立動態(tài)模型
1.準備腳本
動態(tài)分析從尋找事件開始,然后確定各對象的可能事件順序。在分析階段不考慮算法的執(zhí)行,算法是實現(xiàn)模型的一部分。
ATM通常情況下的腳本:ATM要求用戶插入一張現(xiàn)金卡,用戶插入一張現(xiàn)金卡
ATM接受磁卡并讀其序號
ATM要求密碼,用戶輸入密碼
ATM通過聯(lián)營機構(gòu)核實序號和密碼,聯(lián)營機構(gòu)聯(lián)系對應的營業(yè)部鑒別密碼后通知該ATM
ATM要求用戶選擇業(yè)務方式(提款、匯兌、查詢),用戶選擇提款方式
ATM詢問現(xiàn)金數(shù)額,用戶輸入現(xiàn)金數(shù)額
ATM核實數(shù)額范圍,提交聯(lián)營機構(gòu),將業(yè)務傳送給營業(yè)部,確認成交返回賬戶新余額
ATM分配現(xiàn)金并要求用戶提款,用戶取走現(xiàn)金
ATM詢問用戶是否要繼續(xù)提款,用戶表示否定
ATM打印收據(jù)、退出現(xiàn)金卡并提示用戶拿走,用戶得到現(xiàn)金卡
ATM要求另一個用戶插入現(xiàn)金卡
2.確定事件
確定所有外部事件。事件包括所有來自或發(fā)往用戶的信息、外部設備的信號、輸入、轉(zhuǎn)換和動作??梢园l(fā)現(xiàn)正常事件,但不能遺漏條件和異常事件。
有例外情況的ATM腳本:ATM要求用戶插入一張現(xiàn)金卡,用戶插入一張現(xiàn)金卡
ATM接受磁卡并讀其序號
ATM要求密碼,用戶輸入密碼
ATM通過聯(lián)營機構(gòu)核實序號和密碼,聯(lián)營機構(gòu)聯(lián)系對應的營業(yè)部鑒別密碼后拒絕此密碼
ATM提出密碼錯誤并要求用戶重新輸入,用戶輸入密碼,ATM通過聯(lián)營機構(gòu)核實成功
ATM要求用戶選擇業(yè)務方式(提款、匯兌、查詢),用戶選擇提款方式
ATM詢問現(xiàn)金數(shù)額,用戶改變想法,輸入“取消”
ATM退出現(xiàn)金卡并提示用戶拿走,用戶得到現(xiàn)金卡
ATM要求另一個用戶插入現(xiàn)金卡
4.構(gòu)造狀態(tài)圖
對各對象類建立狀態(tài)圖,反映對象接收和發(fā)送的事件,每個事件跟蹤都對應于狀態(tài)圖中的一條路徑。ATM對象類的狀態(tài)圖如圖10.21所示。10.20ATM腳本的事件軌跡10.21ATM對象類的狀態(tài)圖其中:網(wǎng)絡響應=合法賬戶、非法賬戶、非法營業(yè)部代碼、非法密碼、業(yè)務成功、業(yè)務失敗。
聯(lián)營機構(gòu)對象類的狀態(tài)圖及營業(yè)部對象類的狀態(tài)圖分別如圖10.22和圖10.23所示。圖10.22聯(lián)營機構(gòu)對象類的狀態(tài)圖圖10.23營業(yè)部對象類的狀態(tài)圖10.3.4建立功能模型
功能模型用來說明值是如何計算的,表明值之間的依賴關系及相關的功能。數(shù)據(jù)流圖有助于表示功能依賴關系,其中的處理對應于狀態(tài)圖的活動和動作,數(shù)據(jù)流對應于對象圖中的對象或?qū)傩浴?/p>
(1)確定輸入值、輸出值,即先列出輸入值、輸出值。輸入值、輸出值是系統(tǒng)與外界之間事件的參數(shù)。
(2)建立數(shù)據(jù)流圖。數(shù)據(jù)流圖說明輸出值是怎樣從輸入值得來的。數(shù)據(jù)流圖通常按層次組織。ATM系統(tǒng)的數(shù)據(jù)流圖如圖10.24所示。圖10.24ATM系統(tǒng)的數(shù)據(jù)流圖10.3.5確定操作
在建立對象模型時,確定了類、關聯(lián)、結(jié)構(gòu)和屬性,還沒有確定操作。只有建立了動態(tài)模型和功能模型之后,才可能最后確定類的操作。 10.4面向?qū)ο蟮脑O計
1.面向?qū)ο笤O計的概念
面向?qū)ο蠓治?OOA)主要通過對類的認定和劃分,來確定問題空間中存在的類以及類和類的結(jié)構(gòu)等,然后建立一個完整的分析模型。
面向?qū)ο笤O計(ObjectOrientedDesign,OOD)將面向?qū)ο蠓治鼋⒌姆治瞿P妥儞Q成設計模型。軟件設計人員需要發(fā)現(xiàn)相關的對象,將它們的因子化為適當粒度的類,定義類的接口和繼承層次結(jié)構(gòu),并且建立它們之間的關系等。應避免重復設計,至少要使重復設計降低到最小程度。設計可重用的面向?qū)ο筌浖抢щy的,但是,人們總是在設計過程中充分利用重用技術。軟件設計完成后,設計人員都試圖重用它,并不斷地修改該設計,使它不斷完善和成熟。
OOD把主要的系統(tǒng)構(gòu)件組織為子系統(tǒng)的系統(tǒng)級“模塊”。數(shù)據(jù)和操作數(shù)據(jù)的方法被封裝為對象,對象(類)是面象對象系統(tǒng)的構(gòu)造積木塊。OOD必須具有描述對象屬性的特定數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)組織以及個體操作過程的細節(jié)。
OOD為了實現(xiàn)軟件需求,可能引入其他類和對象,也可能為提高軟件設計質(zhì)量和效率而改進類結(jié)構(gòu)。例如,重用類庫中的類通過類的認定和類層次結(jié)構(gòu)的組織,確定解空間中存在的類和類結(jié)構(gòu),并確定外部接口和主要數(shù)據(jù)結(jié)構(gòu)等。
OOA和OOD很難截然分開,也就是說,面向?qū)ο蠓治雠c面向?qū)ο笤O計之間不會用階段和時序來區(qū)分。但是,OOD建造系統(tǒng)仍然建立在軟件設計的基本概念之上,這些概念包括抽象、信息隱藏、功能獨立和模塊性等。
在傳統(tǒng)方法和OOD方法中有10種設計建模的主要構(gòu)成成分,它們可以用于比較各種傳統(tǒng)方法和面向?qū)ο笤O計方法。這10種設計建模的主要構(gòu)成成分是:●模塊層次的表示;
●數(shù)據(jù)定義的規(guī)格;
●過程邏輯的規(guī)格;
●端到端處理序列的說明;
●對象狀態(tài)和變遷的表示;
●類及層次的定義;
●類中操作的表示;
●操作的詳細定義;
●消息連接的規(guī)格;
●排他服務的標識。
2.面向?qū)ο笙到y(tǒng)設計模型
傳統(tǒng)的設計方法有4個層次:體系結(jié)構(gòu)設計、數(shù)據(jù)設計、接口設計和構(gòu)件設計。OOD方法與傳統(tǒng)方法相比,也存在4種設計:
●體系結(jié)構(gòu)設計(系統(tǒng)設計);
●數(shù)據(jù)設計(當屬性被確定后);
●接口設計(當消息模型被開發(fā)后);
●構(gòu)件設計(當對象被認定后進行對象設計等)。值得注意的是,面向?qū)ο笤O計的“體系結(jié)構(gòu)”關注得更多的是對象之間的協(xié)助,而不是構(gòu)件間的功能控制流。
(1)子系統(tǒng)設計。一個軟件系統(tǒng)往往有幾個主要組成部分,可以按主題把主要的系統(tǒng)構(gòu)件組織為子系統(tǒng)。子系統(tǒng)是可以相對獨立運作的。各子系統(tǒng)之間具有盡可能簡單的明確的接口。
子系統(tǒng)設計應包括每一個子系統(tǒng)的表示,這些子系統(tǒng)能夠滿足用戶的軟件需求,并且有實現(xiàn)支持用戶需求的技術設施。
(2)類與對象設計。這里應該包括每一個類與對象的表示和類結(jié)構(gòu)的創(chuàng)建。例如類的層次結(jié)構(gòu)的創(chuàng)建,可以用一般化類以及不斷逼近目標的特殊化類的機制實現(xiàn);組裝結(jié)構(gòu)可以用分析類的聚集來實現(xiàn)。
(3)消息設計。消息設計包括每一個對象能夠與協(xié)作對象通信的設計細節(jié)。通過消息設計建立系統(tǒng)的內(nèi)部和外部接口。
(4)責任設計。責任設計包括每一個對象的所有屬性和操作的數(shù)據(jù)結(jié)構(gòu)以及算法設計(服務、方法的具體實現(xiàn)細節(jié))。在面向?qū)ο笙到y(tǒng)中,存在著類和通信對象重復出現(xiàn)的模式,利用這些模式可以解決特定的問題,使得面向?qū)ο笤O計更靈活,重用性更好。設計模式是指基于過去的經(jīng)驗來幫助設計者重用成功的設計,把設計模式應用于設計問題中,就可以不需要(或者減少)重復設計。
在面向?qū)ο笙到y(tǒng)中,設計模式可以使用繼承和組合這兩種不同的機制。使用繼承,現(xiàn)存的設計模式變成了新子類的模板,存在于模式中的屬性和操作也被子類所繼承而變成子類的一部分;組合導致對象的聚合。一個問題可能需要具有復雜功能的對象(例如子系統(tǒng))完成該功能,復雜對象可以通過選擇一組設計模式并且聚合適當?shù)膶ο?或者子系統(tǒng))組裝而成。當然還可以考慮繼承和組合并存的方法。在實際設計中,往往組合要優(yōu)先于繼承。過分地使用繼承會導致類層次越來越龐大而變得難以管理,組合關注的目標是小的類層次和對象,組合可以用不修改的方式使用現(xiàn)存的設計模式,即重用構(gòu)件。每一個設計模式可以被處理為黑盒,在模式之間的通信僅僅通過良好的接口來實現(xiàn)。Rumbaugh方法中的對象建模技術提出的設計活動有兩個不同抽象的級別,即系統(tǒng)設計和對象設計。
●系統(tǒng)設計。系統(tǒng)設計著重于構(gòu)造一個完整的軟件產(chǎn)品或者系統(tǒng)所有構(gòu)件的布局。具體來說,就是將系統(tǒng)分析模型劃分為若干個子系統(tǒng),然后分配給處理器和任務,定義實現(xiàn)數(shù)據(jù)管理的策略,標識它們所需要的全局資源和控制?!駥ο笤O計。對象設計著重于個體對象的詳細布局。具體來說,就是從系統(tǒng)分析模型中,為對象選擇操作,并且為每一個操作定義算法;適合于屬性和算法的數(shù)據(jù)結(jié)構(gòu)被表示;類和類屬性的設計應該能夠優(yōu)化對數(shù)據(jù)的訪問,并提高計算的功效;消息模型被創(chuàng)建,用以實現(xiàn)對象關聯(lián)。
由Coad/Yourdon提出的OOD模型如圖10.25所示。該模型表示系統(tǒng)由4個部件組成,即垂直分成4個部分。這4個部分是:圖10.25OOD模型●主體部件(PDC)設計(問題領域部分);
●用戶界面部件(HIC)設計(人機交互部分);
●任務管理部件(TMC)設計;
●數(shù)據(jù)管理部件(DMC)設計。每一個部件又有5個層次,即水平切片分成5層。這5層是:
●主題詞層;
●類與對象層;
●結(jié)構(gòu)層(分類、聚集);
●屬性層;
●服務層。雖然有各種各樣的設計方法,每一種設計方法又有各自不同的術語,但是,整體的OOD過程是基本一致的。為了完成面向?qū)ο笤O計,軟件設計人員應該完成下列步驟:
①描述每個子系統(tǒng)并將其分配給處理器或任務;
②選擇實現(xiàn)數(shù)據(jù)管理、界面支持和任務管理的設計策略;
③為系統(tǒng)設計合適的控制機制;
④通過創(chuàng)建每個操作的過程表示和類屬性的數(shù)據(jù)結(jié)構(gòu),完成對象設計;
⑤使用對象間的協(xié)作和對象關系,完成消息設計;
⑥創(chuàng)建消息模型;
⑦評審設計模型并在需要時迭代。
3.面向?qū)ο笤O計原則
在傳統(tǒng)設計中,有5種標準用于判斷設計方法的模塊化能力,這些標準也可以用于面向?qū)ο笤O計中。這5種標準是:
(1)分解性(Decomposability):設計方法幫助設計者將一個大型問題分解為易于求解的子問題的程度。
(2)組裝性(Composability):設計方法保證程序構(gòu)件(模塊)一旦被設計和建造后,可被重用創(chuàng)建其他系統(tǒng)的程度。
(3)易理解性(Understandability):程序構(gòu)件在不參考其他信息或者其他模塊的情況下,易于理解的程度。
(4)連貫性(Continuity):在程序中進行小修改的能力,這些修改展示它們自己與一個或少數(shù)幾個模塊中對應修改的能力。
(5)保護性(Protection):減少一個錯誤在特定的模塊中發(fā)生所引起副作用傳播的能力。
優(yōu)秀的面向?qū)ο笤O計應該權衡各種因素,降低設計成本,提高軟件的可維護性。根據(jù)以上5個設計標準可導出以下基本原則:
(1)模塊化。與傳統(tǒng)的設計方法一樣,面向?qū)ο笤O計方法也支持系統(tǒng)分解和系統(tǒng)模塊化的設計原理。實際上對象可以理解為構(gòu)件(模塊),它是把數(shù)據(jù)結(jié)構(gòu)和操作這些數(shù)據(jù)的方法緊密地結(jié)合在一起的構(gòu)件(模塊)。
(2)抽象。面向?qū)ο蠓椒ú粌H支持過程抽象,而且支持數(shù)據(jù)抽象。類實際上就是一種抽象數(shù)據(jù)類型,類的公共接口構(gòu)成了類的規(guī)格說明,使用者通過類的接口就可以使用類中定義的數(shù)據(jù),而無需知道類中具體算法的實現(xiàn)細節(jié)和數(shù)據(jù)元素的表示方法。通常把這類抽象稱為規(guī)格說明抽象。有一些面向?qū)ο笳Z言支持參數(shù)化抽象。C++語言提供的“模板”機制就是一種參數(shù)化抽象機制。由模板定義的類稱為參數(shù)化類,也稱為類屬類。類屬類本身不依賴具體的數(shù)據(jù)類型,即與實際操作的基本數(shù)據(jù)類型無關,它主要描述數(shù)據(jù)結(jié)構(gòu)的特征。例如,類屬棧的主要特征是棧中的元素先進后出,而元素的數(shù)據(jù)類型作為類屬類的參數(shù),在類屬類實例化時才確定。這意味著把數(shù)據(jù)類型作為參數(shù)傳遞。參數(shù)化抽象使得類的抽象程度更高,應用范圍更廣,可重用性更高。
(3)信息隱藏。在面向?qū)ο蠓椒ㄖ?,信息隱藏體現(xiàn)在封裝性上。封裝性是重要機制之一,也是軟件設計的重要原則之一。如果把屬性和操作封裝為對象,則對于類的用戶而言,屬性的表示方法和具體操作的算法實現(xiàn)細節(jié)都應該是隱藏的。
(4)低耦合。耦合指一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的緊密程度。在面向?qū)ο蠓椒ㄖ?,對象是最基本的模塊,因此,耦合主要指不同對象之間相互關聯(lián)的緊密程度。低耦合是優(yōu)秀設計的重要標準之一。低耦合使得系統(tǒng)中某一部分的變化對其他部分的影響降到最低程度,即在理想情況下,對某一部分的理解、測試或修改,無需涉及系統(tǒng)的其他部分。如果一個類(對象)過多地依賴其他類(對象)來完成自己的工作,則不僅給理解、測試或修改這個類帶來很大困難,而且還將大大降低類的可重用性和可移植性。
為了達到低耦合,模塊之間應該是很少接口、很小接口和顯式的接口。很少接口是指模塊之間接口的數(shù)量應該最小化;很小接口是指某一個接口移動的信息量應該最小化;顯式的接口就是指當模塊通信時應該用明顯的和直接的方式。
如果對象之間的耦合通過消息連接來實現(xiàn),則這種耦合就是交互耦合。交互耦合應該盡量減少消息中包含的參數(shù)個數(shù),降低消息連接的復雜程度,減少對象發(fā)送或接收的消息數(shù)。繼承耦合是一般化類與特殊類之間的一種耦合形式,應該提高繼承耦合程度。為獲得緊密的繼承耦合,特殊類應該確實是對它的一般化類的一種具體化。在設計時應該使特殊類盡量多繼承并使用其一般化類的屬性和服務,從而更緊密地耦合到它的一般化類。
(5)高內(nèi)聚。內(nèi)聚用于衡量一個模塊內(nèi)各個元素彼此結(jié)合的緊密程度?;蛘哒f,設計中使用的一個構(gòu)件內(nèi)的各個元素,對完成一個定義明確的目標所做出的貢獻程度。設計中應該力求做到高內(nèi)聚。
在面向?qū)ο笤O計中,服務內(nèi)聚是指一個服務應該完成一個且僅完成一個功能。類內(nèi)聚就是它的屬性和服務應該是高內(nèi)聚的,而且應該全都是完成該類對象的任務所必需的。一般來說,緊密的繼承耦合和高度的一般化類與特殊化類內(nèi)聚是一致的。
(6)可重用。軟件重用是提高軟件生產(chǎn)率和質(zhì)量的重要途徑之一。在面向?qū)ο笤O計中,重用性占有非常重要的地位。重用意味著一方面盡量使用目前已有的類,包括開發(fā)環(huán)境提供的類和開發(fā)者過去創(chuàng)建的類;另一方面是在創(chuàng)建新類時,在設計中應該考慮它們的可重用性。 10.5面向?qū)ο蟮膶崿F(xiàn)
1.程序設計語言
采用面向?qū)ο蠓椒ㄩ_發(fā)軟件的基本目的和主要優(yōu)點是通過重用提高軟件的生產(chǎn)率。因此,應該優(yōu)先選用能夠最完善、最準確地表達問題域語義的面向?qū)ο笳Z言。
在選擇編程語言時,應該考慮的其他因素還有:對用戶學習面向?qū)ο蠓治?、設計和編碼技術所能提供的培訓操作;在使用這個面向?qū)ο笳Z言期間能提供的技術支持;能提供給開發(fā)人員使用的開發(fā)工具、開發(fā)平臺,對機器性能和內(nèi)存的需求,集成已有軟件的容易程度。
2.程序設計風格
(1)提高重用性。
(2)提高可擴充性。
(3)提高健壯性。
3.類的實現(xiàn)
在開發(fā)過程中,類的實現(xiàn)是核心問題。在用面向?qū)ο笳Z言所寫的系統(tǒng)中,所有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機械零部件熱處理工發(fā)展趨勢競賽考核試卷含答案
- 汽車鍛造生產(chǎn)線操作工誠信品質(zhì)競賽考核試卷含答案
- 海底管道配重工安全知識宣貫水平考核試卷含答案
- 衛(wèi)生檢驗員改進能力考核試卷含答案
- 2026云南玉溪市華寧縣衛(wèi)生健康局招聘事業(yè)單位緊缺急需人才9人備考題庫及參考答案詳解
- 2026云南昆明市官渡殘疾人聯(lián)合會招聘1人備考題庫含答案詳解
- 老年消化性潰瘍患者跌倒風險與藥物相互作用評估方案
- 老年泌尿系感染后尿頻尿急康復訓練方案
- 智慧城市建設產(chǎn)業(yè)技術應用展望
- 互聯(lián)網(wǎng)醫(yī)療行業(yè)競爭分析(已完成)
- 消防廉潔自律課件大綱
- 統(tǒng)編版九年級上冊語文期末復習:全冊重點考點手冊
- 2025年11月15日江西省市直遴選筆試真題及解析(B卷)
- (2025)新課標義務教育數(shù)學(2022年版)課程標準試題庫(附含答案)
- 金太陽陜西省2028屆高一上學期10月月考物理(26-55A)(含答案)
- 小學生科普小知識:靜電
- 2025年安全生產(chǎn)知識教育培訓考試試題及標準答案
- 重慶市康德2025屆高三上學期第一次診斷檢測-數(shù)學試卷(含答案)
- 品牌管理指南的建模指南
- 導樂用具使用課件
- “師生機”協(xié)同育人模式的實踐探索與效果評估
評論
0/150
提交評論