版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章面向?qū)ο蟮能浖こ?.1面向?qū)ο蠹夹g(shù)概論3.2面向?qū)ο筌浖^程
3.1面向?qū)ο蠹夹g(shù)概論
3.1.1結(jié)構(gòu)化范型與面向?qū)ο蠓缎?/p>
所謂范型(Paradigm),是指做事情的整體觀點或策略,它是一套特定的思想集。結(jié)構(gòu)化范型(StructruedParadigm)是一種基于如下概念的開發(fā)策略,即一個系統(tǒng)應(yīng)該被劃分為兩部分:數(shù)據(jù)(使用數(shù)據(jù)/持久化模型建模)和功能(使用過程模型建模)。簡言之,使用結(jié)構(gòu)化的方法,數(shù)據(jù)將和設(shè)計模型中以及系統(tǒng)實現(xiàn)(也就是程序)中的行為分離。面向?qū)ο蠓缎?ObjectOrientedParadigm)是一種基于如下概念的開發(fā)策略,即系統(tǒng)可以由一系列稱做對象(Object)的可重用組件來構(gòu)建。與在結(jié)構(gòu)化范型里分離數(shù)據(jù)和功能不同,對象包含了它們兩者。如圖3-1中所示,面向?qū)ο蠓缎捅澈蟮闹饕拍畈皇前严到y(tǒng)定義為兩個分離的部分(數(shù)據(jù)和功能),而是需要把系統(tǒng)定義為一組正在交互的對象。對象可以完成一些事情(也就是說它們有功能),它們也知道一些事情(也就是說它們有數(shù)據(jù))。雖然這聽起來和結(jié)構(gòu)化范型相似,但事實上卻是不同的。圖3-1結(jié)構(gòu)化范型和面向?qū)ο蠓缎偷谋容^如果采用結(jié)構(gòu)化的方法完成一所大學(xué)信息系統(tǒng)的設(shè)計,則可通過定義數(shù)據(jù)庫的布局和程序的設(shè)計來訪問這些數(shù)據(jù)。數(shù)據(jù)庫中存有關(guān)于學(xué)生、教授、教室以及課程的信息。程序可以讓用戶登記學(xué)生的選課情況,分派教授授課,安排授課教室等。程序可以訪問并更新數(shù)據(jù)庫,實際上它可以支持學(xué)校的日常運作。下面用面向?qū)ο蟮挠^點來考慮大學(xué)信息系統(tǒng)的設(shè)計。在現(xiàn)實世界中,有學(xué)生、教授、教室和課程,所有這些事情都將被當(dāng)成對象來考慮。學(xué)生知道一些事情(他們有自己的名字、住址、生日、電話號碼等),可以完成一些事情(登記課程、取消課程以及支付學(xué)費)。教授也知道一些事情(他們所教授的課程以及他們的名字),同樣也能完成一些事情(輸入分?jǐn)?shù)以及提出進(jìn)度要求)。從系統(tǒng)的觀點來看,教室也知道一些事情(它們所處的建筑物以及它們的房間號),也應(yīng)該能夠完成某些事情(例如告知空閑狀態(tài)以及可以預(yù)定它們的時間段)。課程也知道某些事情(它們的名稱、描述以及誰將選這門課),也能完成一些事情(例如通知學(xué)生選課或通知學(xué)生取消選課)。要實現(xiàn)這樣的系統(tǒng),我們可以定義一組能進(jìn)行交互的類(類(Class)是相似對象的一種通用表示)。例如,我們將使用“課程”、“學(xué)生”、“教授”以及“教室”類。這樣的類將組成我們的應(yīng)用,它包括功能(程序)和數(shù)據(jù)。
對于個人,面向?qū)ο笫且环N全新的思考方式。對于機(jī)構(gòu),面向?qū)ο髣t徹底改變了機(jī)構(gòu)內(nèi)的系統(tǒng)開發(fā)文化。3.1.2面向?qū)ο蟮幕靖拍?/p>
1.對象
對象(Object)是面向?qū)ο?OO)方法的核心。對象的概念來源就在生活之中。在現(xiàn)實生活中,我們隨時隨地都在和對象打交道——我們騎的車、看的書以及我們自己,在一個程序員眼中無一例外都是對象。
如果把問題抽象一下,會發(fā)現(xiàn)這些現(xiàn)實生活中的對象有兩個共同的特點:第一,它們都有自己的狀態(tài),例如一個球有自己的質(zhì)地、顏色、大?。坏诙?,它們都具有自己的行為,比如一個球可以滾動、停止或旋轉(zhuǎn)。飛機(jī)等均可看做對象,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計劃或事件。對象的狀態(tài)用數(shù)據(jù)來表示,稱為對象的屬性;每個對象都有自己的行為,而對象的行為用對象中的代碼來實現(xiàn),則稱為對象的方法。不同的對象有不同的方法,當(dāng)然也不排除有部分重疊。對象具有狀態(tài),可用數(shù)據(jù)值來描述。對象還有操作,用于改變對象的狀態(tài)。對象及其操作就是對象的行為。對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,是一個屬性(數(shù)據(jù))集及其操作(行為)的封裝體。
2.類
類(Class)抽象出了一類對象的共同的結(jié)構(gòu)和行為。這些對象具有相同種類的屬性及方法。對象是類的實例。類好比是一類對象的模板,有了類定義后,基于類就可以生成這類對象中的任何一個對象,這些對象雖然采用相同的屬性來表示狀態(tài),但它們在屬性上的取值完全可以不同。在類的定義中,可以為某個屬性指定一個值,作為它的默認(rèn)值。在客觀世界中有若干類,這些類之間有一定的結(jié)構(gòu)關(guān)系。通常有兩種主要的結(jié)構(gòu)關(guān)系,即一般—具體結(jié)構(gòu)關(guān)系和整體—部分結(jié)構(gòu)關(guān)系。
(1)一般—具體結(jié)構(gòu)稱為分類結(jié)構(gòu),也可以說是“或”關(guān)系,或者是“isa”關(guān)系。
(2)整體—部分結(jié)構(gòu)稱為組裝結(jié)構(gòu),它們之間的關(guān)系是一種“與”關(guān)系,或者是“hasa”關(guān)系。
3.消息和方法
對象之間進(jìn)行通信的結(jié)構(gòu)叫做消息(Message)。消息是由發(fā)送對象發(fā)送給接收對象的一個操作請求。對象可以向其他對象發(fā)送消息以請求服務(wù),也可以響應(yīng)其他對象傳來的消息,完成自身固有的某些操作,從而服務(wù)于其他對象。發(fā)送一條消息至少要包括說明接收消息的對象名和發(fā)送給該對象的消息名(即對象名和方法名)。一般還要對參數(shù)加以說明,參數(shù)可以是認(rèn)識該消息的對象所知道的變量名,或者是所有對象都知道的全局變量名。
類中操作的實現(xiàn)過程叫做方法,一個方法有方法名、參數(shù)、方法體。消息傳遞如圖3-2所示。圖3-2對象、類和消息的傳遞
4.類的特性
類的定義決定了類具有5個特性:抽象、繼承、封裝、多態(tài)、重載。
(1)抽象。類的定義中明確指出類是一組具有內(nèi)部狀態(tài)和運動規(guī)律對象的抽象。抽象是一種從一般的觀點看待事物的方法,它要求我們集中于事物的本質(zhì)特征(內(nèi)部狀態(tài)和運動規(guī)律),而非具體細(xì)節(jié)或具體實現(xiàn)。面向?qū)ο蠊膭钗覀冇贸橄蟮挠^點來看待現(xiàn)實世界,也就是說,現(xiàn)實世界是由一組抽象的對象——類組成的。
(2)繼承。繼承是類不同抽象級別之間的關(guān)系。類的定義主要有兩種辦法:歸納和演繹。由一些特殊類歸納出來的一般類稱為這些特殊類的父類,特殊類稱為一般類的子類,同樣父類可演繹出子類;父類是子類更高級別的抽象。子類可以繼承父類的所有內(nèi)部狀態(tài)和運動規(guī)律。在計算機(jī)軟件開發(fā)中采用繼承性,提供了類的規(guī)范的等級結(jié)構(gòu);通過類的繼承關(guān)系,使公共的特性能夠共享,提高了軟件的重用性。
(3)封裝。對象間的相互聯(lián)系和相互作用過程主要通過消息機(jī)制得以實現(xiàn)。對象之間并不需要過多地了解對方內(nèi)部的具體狀態(tài)或運動規(guī)律。面向?qū)ο蟮念愂欠庋b良好的模塊,類定義將其說明(用戶可見的外部接口)與實現(xiàn)(用戶不可見的內(nèi)部實現(xiàn))顯式地分開,其內(nèi)部實現(xiàn)按其具體定義的作用域提供保護(hù)。類是封裝的最基本單位。封裝防止了因程序相互依賴而帶來的變動影響。在類中定義的接收對方消息的方法稱為類的接口。
(4)多態(tài)(覆蓋)。多態(tài)是指一個程序中同名的不同方法共存的情況。在父類演繹為子類時,類的運動規(guī)律也同樣可以演繹,演繹使子類的同名運動規(guī)律或運動形式更具體,甚至子類可以有不同于父類的運動規(guī)律或運動形式。不同的子類可以演繹出不同的運動規(guī)律。如動物都會吃,而羊和狼吃的方式和內(nèi)容都不一樣,如圖3-3所示。圖3-3類的多態(tài)性
(5)重載。重載指類的同名方法在給其傳遞不同的參數(shù)時可以有不同的運動規(guī)律。在對象間相互作用時,即使接收消息對象采用相同的接收辦法,但消息內(nèi)容的詳細(xì)程度不同,接收消息對象內(nèi)部的運動規(guī)律也可能不同。如圖3-4所示,老板指派采購員買東西,當(dāng)老板沒有指明買什么時,采購員可能默認(rèn)買地瓜;如老板指明要采購員買大米,采購員可能到最近的超市買10斤大米;如老板指明采購員今天晚上到福州東街口買5斤大米,那么采購員將不得不按老板指定的時間、地點去購買5斤大米。圖3-4方法重載
3.2面向?qū)ο筌浖^程
3.2.1生命周期
軟件生命周期(SoftwareLifeCycle)是指從軟件開發(fā)項目的提出到軟件產(chǎn)品完成使命而報廢的整個時期。假設(shè)軟件的生命是從軟件的需求說明開始的,然后軟件長成到設(shè)計、實現(xiàn)、測試,這就是軟件的成長過程。如果它通過測試,那么軟件就升級為產(chǎn)品狀態(tài)。當(dāng)它吸引了用戶,且這些用戶發(fā)現(xiàn)了程序錯誤時,就必須維護(hù)它。當(dāng)用戶強(qiáng)烈要求更多的東西時,軟件必須擴(kuò)展。創(chuàng)建一個改進(jìn)的版本,同樣包括需求說明、設(shè)計、實現(xiàn)和測試各階段。傳統(tǒng)的軟件生命周期和面向?qū)ο蟮能浖芷谑怯兴煌?。傳統(tǒng)的程序設(shè)計早期主要集中在如何實現(xiàn)上,即一個項目生命周期的絕大部分花費在實現(xiàn)設(shè)計上,其生命周期螺旋線如圖3-5所示。而面向?qū)ο笤O(shè)計的目標(biāo)是為了得到強(qiáng)壯的軟件,這些軟件易于重用、細(xì)化、測試、維護(hù)和擴(kuò)展。當(dāng)軟件作為其他軟件的一部分使用而不是原始設(shè)計時,叫做軟件“重用”。當(dāng)它作為基本的東西用為其他軟件定義時,叫做軟件“細(xì)化”。圖3-5傳統(tǒng)軟件生命周期當(dāng)確定它的行為是否符合軟件的說明書時,叫做軟件“測試”。當(dāng)發(fā)現(xiàn)軟件有錯誤并改正錯誤時,叫做軟件“維護(hù)”。當(dāng)把新的功能加入到一個已有的程序中時,叫做軟件“擴(kuò)展”。一個面向?qū)ο筌浖椖康穆菪€如圖3-6所示。這條螺旋線清楚地表明了整個時間的很大一部分花在了設(shè)計階段,相對較少的一部分花在了實現(xiàn)和測試上。圖3-6面向?qū)ο蟮能浖芷谝驗橐O(shè)計易于重用、維護(hù)和修改的軟件,所以很大一部分的時間花在了設(shè)計上。面向?qū)ο缶幊坦ぞ弑旧聿荒鼙WC產(chǎn)生可重用的、可維護(hù)的和可擴(kuò)展的軟件。相反,面向?qū)ο缶幊坦ぞ吣軌蚱鸬街С忠粋€項目的作用,幫助項目中的團(tuán)隊成員探索問題,并作出詳細(xì)的設(shè)計。為了實現(xiàn)軟件的重用,需要付出很大的努力來設(shè)計代碼,但最后終將取得可觀的成果?;〞r間作詳細(xì)設(shè)計,同樣也給了編程人員深入理解問題的時間。由于深入了解了問題,因而實現(xiàn)起來很快。因此,對于一個周期所需要的總時間而言,可以保持不變,甚至減少。正是因為在編程人員的腦海中一開始就有了軟件設(shè)計的維護(hù)、擴(kuò)展和重用的思想,并對此付出了各種努力,所以所需要的時間就會從根本上減少。3.2.2面向?qū)ο蠓治?/p>
所謂面向?qū)ο蠓治?ObjectOrientedAnalysis,OOA),是指在一個系統(tǒng)的開發(fā)過程中進(jìn)行了系統(tǒng)業(yè)務(wù)調(diào)查以后,按照面向?qū)ο蟮乃枷雭矸治鰡栴}。OOA與結(jié)構(gòu)化分析有較大的區(qū)別。OOA所強(qiáng)調(diào)的是在系統(tǒng)調(diào)查資料的基礎(chǔ)上,針對OO方法所需要的素材進(jìn)行的歸類分析和整理,而不是對管理業(yè)務(wù)現(xiàn)狀和方法的分析。
1.OOA方法中用到的概念和術(shù)語
在OOA方法中,用到了一些新的概念和術(shù)語,在這里給予簡單介紹。
主題(Subject)是指把一些具有較強(qiáng)聯(lián)系的類組織在一起而得到的類的集合。對大的系統(tǒng)而言,當(dāng)類較多時,會增加人們閱讀和理解的難度。運用主題劃分的原則,把眾多類組合成數(shù)量較少的幾個主題,通過控制可見性,對人們的注意力加以引導(dǎo),使人們可以從更高的宏觀角度觀察這些主題,有助于理解總體模型。問題域(ProblemDomain)是指被開發(fā)系統(tǒng)的應(yīng)用領(lǐng)域,即在客觀世界中由該系統(tǒng)處理的業(yè)務(wù)范圍。
關(guān)聯(lián)(Association)是指對象之間存在的靜態(tài)聯(lián)系。如果這種聯(lián)系是系統(tǒng)責(zé)任所需要的,則要求在OOA模型中通過連接明確地表示出來。
聚合(Aggregation)又稱組裝,是指把—個復(fù)雜的事物看成若干個簡單的事物的組裝體,用于簡化對復(fù)雜事物的描述。
主動對象是指至少有一個服務(wù)不需要接收消息就能主動執(zhí)行的對象。
2.OOA模型
OOA模型由5個層次(主題層、結(jié)構(gòu)層、服務(wù)層、屬性層、類和對象層)和5個活動(標(biāo)識對象類、標(biāo)識結(jié)構(gòu)、定義主題、定義屬性和定義服務(wù))組成。在這種方法中定義了兩種對象類之間的結(jié)構(gòu),一種稱為分類結(jié)構(gòu),一種稱為組裝結(jié)構(gòu)。分類結(jié)構(gòu)就是所謂的一般與特殊的關(guān)系。組裝結(jié)構(gòu)則反映了對象之間的整體與部分的關(guān)系。
圖3-7是OOA模型的結(jié)構(gòu)示意圖。5個層次的含義如下:圖3-7OOA模型的結(jié)構(gòu)示意圖
(1)類和對象層表示待開發(fā)系統(tǒng)的基本構(gòu)造塊。對象都是現(xiàn)實世界中應(yīng)用領(lǐng)域的概念的抽象。
信息建模是OOA過程中最基本和最關(guān)鍵的活動之一,就是從現(xiàn)實世界的應(yīng)用領(lǐng)域中捕捉應(yīng)用領(lǐng)域的基本結(jié)構(gòu)的過程。
(2)對象的屬性和實例連接共同構(gòu)成了OOA模型的屬性層。
(3)對象的服務(wù)加上對象間的消息通信構(gòu)成了OOA模型的服務(wù)層。
(4)應(yīng)用領(lǐng)域中的特定結(jié)構(gòu)構(gòu)成了OOA模型的結(jié)構(gòu)層。
(5)當(dāng)OOA模型的結(jié)構(gòu)龐大復(fù)雜時,眾多的對象有時難以處理,可以將對象歸結(jié)到一定的主題中,這樣可以使得模型的結(jié)構(gòu)清晰。
OOA在定義屬性的同時,要識別實例連接。實例連接反映的是一個實例與另一個實例的映射關(guān)系。
OOA在定義服務(wù)的同時要識別消息連接。當(dāng)一個對象需要向另一個對象發(fā)送消息時,它們之間就存在消息連接。
3.OOA的主要原則
OOA有以下一些主要原則:
(1)抽象。從許多事物中舍棄個別的、非本質(zhì)的特征,抽取共同的、本質(zhì)性的特征,就叫做抽象。抽象是形成概念的必需手段。
抽象原則有兩方面的含義:第一,盡管問題域中的事物是很復(fù)雜的,但是分析員并不需要了解和描述它們的一切,只需要分析研究其中與系統(tǒng)目標(biāo)有關(guān)的事物及其本質(zhì)性特征;第二,通過舍棄個體事物在細(xì)節(jié)上的差異,抽取其共同特征而得到一批事物的抽象概念。抽象是面向?qū)ο蠓椒ㄖ惺褂米顬閺V泛的原則。抽象原則包括過程抽象和數(shù)據(jù)抽象兩個方面。過程抽象是指任何一個完成確定功能的操作序列,其使用者都可以把它看做一個單一的實體,盡管實際上它可能是由一系列更低級的操作完成的。數(shù)據(jù)抽象是根據(jù)施加于數(shù)據(jù)之上的操作來定義數(shù)據(jù)類型,并限定數(shù)據(jù)的值只能由這些操作來修改和觀察。數(shù)據(jù)抽象是OOA的核心原則。它強(qiáng)調(diào)把數(shù)據(jù)(屬性)和操作(服務(wù))結(jié)合為一個不可分的系統(tǒng)單位(即對象),對象的外部只需要知道它做什么,而不必知道它如何做。
(2)封裝。封裝就是把對象的屬性和服務(wù)結(jié)合為一個不可分的系統(tǒng)單位,并盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。
(3)繼承。特殊類的對象擁有的一般類的全部屬性與服務(wù),稱作特殊類對一般類的繼承。
在OOA中運用繼承原則,就是在每個由一般類和特殊類形成的一般和特殊結(jié)構(gòu)中,把一般類的對象實例和所有特殊類的對象實例都共同具有的屬性和服務(wù),一次性地在一般類中進(jìn)行顯式的定義。在特殊類中不再重復(fù)地定義一般類中已定義的東西,但是在語義上,特殊類卻自動地、隱含地?fù)碛兴囊话泐?以及所有更上層的一般類)中定義的全部屬性和服務(wù)。繼承原則的好處是:使系統(tǒng)模型比較簡練,也比較清晰。
(4)分類。分類就是把具有相同屬性和服務(wù)的對象劃分為一類,用類作為這些對象的抽象描述。分類原則實際上是抽象原則運用于對象描述時的一種表現(xiàn)形式。
(5)聚合。聚合又稱組裝,其原則是:把一個復(fù)雜的事物看成若干個比較簡單的事物的組裝體,從而簡化對復(fù)雜事物的描述。
(6)關(guān)聯(lián)。并聯(lián)是人類思考問題時經(jīng)常運用的思想方法,即通過一個事物聯(lián)想到另外的事物。能使人發(fā)生聯(lián)想的原因是事物之間確實存在著某些聯(lián)系。
(7)消息通信。這一原則要求對象之間只能通過消息進(jìn)行通信,而不允許在對象之外直接地存取對象內(nèi)部的屬性。通過消息進(jìn)行通信是由于封裝原則而引起的。在OOA中要求用消息連接表示出對象之間的動態(tài)聯(lián)系。
(8)粒度控制。一般來講,人在面對一個復(fù)雜的問題域時,不可能在同一時刻既能縱觀全局,又能洞察秋毫,因此需要控制自己的視野??紤]全局時,注意其大的組成部分,暫時不詳察每一部分的具體細(xì)節(jié);考慮某部分的細(xì)節(jié)時,則暫時撇開其余的部分。這就是粒度控制原則。
(9)行為分析?,F(xiàn)實世界中事物的行為是復(fù)雜的。由大量的事物所構(gòu)成的問題域中各種行為往往相互依賴、相互交織。
4.實現(xiàn)OOA方法的步驟
在用OOA具體地分析一個事物時,大致上遵循如下五個基本步驟:
(1)確定對象和類。這里所說的對象是對數(shù)據(jù)及其處理方式的抽象,它反映了系統(tǒng)保存和處理現(xiàn)實世界中某些事物的信息的能力。類是多個對象的共同屬性和方法集合的描述,它包括如何在一個類中建立一個新對象的描述。
(2)確定結(jié)構(gòu)(Structure)。結(jié)構(gòu)是指問題域的復(fù)雜性和連接關(guān)系。類成員結(jié)構(gòu)反映了泛化—特化關(guān)系,整體和部分結(jié)構(gòu)反映了整體和局部之間的關(guān)系。
(3)確定主題(Subject)。主題是指事物的總體概貌和總體分析模型。
(4)確定屬性(Attribute)。屬性就是數(shù)據(jù)元素,可在圖中給出,并在對象的存儲中指定,用來描述對象或分類結(jié)構(gòu)的實例。
(5)確定方法(Method)。方法是在收到消息后必須進(jìn)行的一些處理方法。方法要在圖中定義,并在對象的存儲中指定。對于每個對象和結(jié)構(gòu)來說,用來增加、修改、刪除和選擇一個方法本身都是隱含的(雖然它們是要在對象的存儲中定義,但并不在圖上給出),而有些則是顯示的。
OOA有許多不同的方法,但是這些方法中有一點是共同的,那就是定義對象。定義對象的主要活動包括確定對象、確定屬性、定義服務(wù)、建立結(jié)構(gòu)、確定關(guān)聯(lián)。上述過程的執(zhí)行次序是可以改變的,某些活動可能會重復(fù)地發(fā)生。3.2.3面向?qū)ο笤O(shè)計
面向?qū)ο笤O(shè)計(ObjectOrientedDesign,OOD)方法是OO方法中一個中間過渡環(huán)節(jié)。其主要作用是對OOA分析的結(jié)果作進(jìn)一步的規(guī)范化整理,以便能夠被面向?qū)ο缶幊?OOP)直接接受。
在OO方法中,OOA和OOD之間有密切的銜接關(guān)系。OOA是提取和整理用戶需求,并建立問題域精確模型的過程,在分析建模過程中是以對象為中心,可以不考慮任何與特定計算機(jī)有關(guān)的問題。而OOD則是用OO方法建立求解域模型的過程,針對計算機(jī)的開發(fā)活動。
OOD的目標(biāo)是生成對問題域的表示并將這種表示映射到計算機(jī)的求解中。與傳統(tǒng)方法不同的是,OOD把數(shù)據(jù)對象和處理操作連接起來,把數(shù)據(jù)和處理一起模塊化。
OO方法在概念和表示方法上的一致性使得分析和設(shè)計的界限比較模糊,許多分析結(jié)果可以直接映射成設(shè)計結(jié)果,而在設(shè)計過程中又會反過來加深和補充對系統(tǒng)需求的理解。因此,分析和設(shè)計活動是一個反復(fù)交替進(jìn)行的過程。各項開發(fā)活動之間可以做到無縫銜接,使得開發(fā)人員比較容易地追蹤整個系統(tǒng)的開發(fā)過程,這是OO方法較傳統(tǒng)方法的一大優(yōu)勢所在。從OOA過渡到OOD是一個自然而平滑的過程。OOA的終點即是OOD的起點。
將OOA模型進(jìn)一步擴(kuò)展便可得到OOD模型,即將OOA橫向劃分的5個層次和5個活動繼續(xù)貫穿在OOD過程中,再將系統(tǒng)縱向劃分為4個部件:設(shè)計問題域部分、設(shè)計人
機(jī)交互部分、設(shè)計任務(wù)管理部分和設(shè)計數(shù)據(jù)庫管理部分。OOD模型的總體結(jié)構(gòu)如圖3-8所示。圖3-8OOD模型的總體結(jié)構(gòu)
(1)問題域部分。設(shè)計構(gòu)造一組為底層應(yīng)用建立模型的類和對象,細(xì)化分析結(jié)果。問題域部分是為了消除對象所具有的無限存儲容量、對象間的通信速度無限快等而假設(shè)的。
(2)人機(jī)交互部分。設(shè)計一組有關(guān)類接口視圖的用戶模型的類和對象,設(shè)計用戶界面。人機(jī)接口部分的設(shè)計是為了將系統(tǒng)和外界的通信任務(wù)由特定的對象承擔(dān),使得系統(tǒng)的功能和現(xiàn)實分離。如果系統(tǒng)與外界的接口發(fā)生改變,則只需要改變這部分對象即可。
(3)任務(wù)管理部分。確定系統(tǒng)資源的分配,設(shè)計用于系統(tǒng)中類的行為控制的對象/類。任務(wù)管理部分的設(shè)計是為了將系統(tǒng)和具體的操作系統(tǒng)提供的任務(wù)調(diào)用由特定的對象來承擔(dān)。如果操作系統(tǒng)的環(huán)境發(fā)生改變,則只需要改變這部分對象即可。
(4)數(shù)據(jù)庫管理部分。確定所要存儲的對象,將對象轉(zhuǎn)換成數(shù)據(jù)庫記錄或表格。數(shù)據(jù)庫管理部分的設(shè)計是為了將系統(tǒng)和由特定數(shù)據(jù)庫系統(tǒng)所管理的數(shù)據(jù)訪問由特定的對象來承擔(dān)。如果系統(tǒng)應(yīng)用到的一些由數(shù)據(jù)庫管理的數(shù)據(jù),其類型或結(jié)構(gòu)發(fā)生改變,則只需要改變這部分對象即可。從OOD模型的總體結(jié)構(gòu)圖中可以看出,OOD和OOA在表示方法上是一致的。OOA的結(jié)果可以作為OOD問題域部分的一個原始版本,以其為中心,在相應(yīng)的層次上構(gòu)造出人機(jī)交互部分、任務(wù)管理部分、數(shù)據(jù)庫管理部分。
OOA最終分析結(jié)果、問題域部分、人機(jī)交互部分、任務(wù)管理部分、數(shù)據(jù)庫管理部分和系統(tǒng)外界環(huán)境的關(guān)系如圖3-9所示。圖3-9OOD的主要任務(wù)及其關(guān)系
OOD的目標(biāo)是消除管理程序內(nèi)部各部分之間的相互依賴。為了達(dá)到這個目標(biāo),OOD要求將程序分成塊,每個塊的規(guī)模應(yīng)該小到可以管理的程度,然后分別將各個塊隱藏在接口(Interface)的后面,讓它們只通過接口相互交流。比如說,如果用OOD的方法來設(shè)計一個服務(wù)器-客戶端(Client-Server)應(yīng)用,那么服務(wù)器和客戶端之間不應(yīng)該有直接的依賴,而是應(yīng)該讓服務(wù)器的接口和客戶端的接口相互依賴。這種依賴關(guān)系的轉(zhuǎn)換使得系統(tǒng)的各部分具有了可復(fù)用性。如果要復(fù)用某一個程序塊,只要實現(xiàn)必需的接口即可。
OOD是一種解決軟件問題的設(shè)計范式,也是一種抽象的范式。使用OOD這種設(shè)計范式,我們可以用對象來表現(xiàn)問題領(lǐng)域的實體,每個對象都有相應(yīng)的狀態(tài)和行為。OOD是一種抽象的范式。抽象可以分成很多層次,從非常概括的到非常特殊的,而對象可能處于任何一個抽象層次上。彼此不同但又互有關(guān)聯(lián)的對象可以共同構(gòu)成抽象。只要這些對象之間有相似性,就可以把它們當(dāng)成同一類的對象來處理。3.2.4面向?qū)ο缶幊?/p>
面向?qū)ο缶幊?ObjectOrientedProgramming,OOP)是一種計算機(jī)編程架構(gòu)。OOP的一條基本原則是,計算機(jī)程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成的。OOP達(dá)到了軟件工程的三個主要目標(biāo):重用性、靈活性和擴(kuò)展性。為了實現(xiàn)整體運算,每個對象都能夠接收信息、處理數(shù)據(jù)和向其他對象發(fā)送信息。
數(shù)據(jù)和功能一起在運行著的計算機(jī)程序中形成的單元,稱做組件。組件在OOP計算機(jī)程序中是模塊和結(jié)構(gòu)化的基礎(chǔ)。
OOP具有以下功能:
抽象性:程序有能力忽略正在處理中信息的某些方面,即對信息主要方面關(guān)注的能力。
封裝性:確保組件不會以不可預(yù)期的方式改變其他組件的內(nèi)部狀態(tài);只有在那些提供了內(nèi)部狀態(tài)改變方法的組件中,才可以訪問其內(nèi)部狀態(tài)。每類組件都提供了一個與其他組件聯(lián)系的接口,并規(guī)定了其他組件進(jìn)行調(diào)用的方法。
多態(tài)性:組件的引用和類集會涉及其他許多不同類型的組件,而且引用組件所產(chǎn)生的結(jié)果得依據(jù)實際調(diào)用的類型。繼承性:允許在現(xiàn)存的組件基礎(chǔ)上創(chuàng)建子類組件,這統(tǒng)一并增強(qiáng)了多態(tài)性和封裝性。也就是說,用類來對組件進(jìn)行分組,而且可以定義新類為現(xiàn)存的類的擴(kuò)展,可以將類組織成樹型或網(wǎng)狀結(jié)構(gòu),這體現(xiàn)了動作的通用性。
由于抽象性、封裝性、重用性以及便于使用等方面的原因,以組件為基礎(chǔ)的編程在腳本語言中已經(jīng)變得特別流行。Python和Ruby是新近出現(xiàn)的語言,在開發(fā)時完全采用了OOP的思想,而流行的Perl腳本語言從版本5開始也慢慢地加入了新的面向?qū)ο蟮墓δ芙M件。用組件代替“現(xiàn)實”上的實體已成為JavaScript(ECMAScript)流行的原因。事實表明,對組件進(jìn)行適當(dāng)?shù)慕M合就可以在因特網(wǎng)上代替HTML和XML的文檔對象模型(DOM)。3.2.5面向?qū)ο鬁y試
面向?qū)ο蟮拈_發(fā)模型突破了傳統(tǒng)的瀑布模型,將開發(fā)分為面向?qū)ο蠓治?OOA)、面向?qū)ο笤O(shè)計(OOD)和面向?qū)ο缶幊?OOP)三個階段。針對這種開發(fā)模型,結(jié)合傳統(tǒng)的測試步驟的劃分,我們把面向?qū)ο鬁y試(ObjectOrientedTest)分為面向?qū)ο蠓治龅臏y試、面向?qū)ο笤O(shè)計的測試、面向?qū)ο缶幊痰臏y試、面向?qū)ο蟮膯卧獪y試、面向?qū)ο蟮募蓽y試和面向?qū)ο蟮南到y(tǒng)測試。
1.面向?qū)ο蠓治龅臏y試
傳統(tǒng)的面向過程分析是一個功能分解的過程,它是把一個系統(tǒng)看成可以分解的功能的集合。這種傳統(tǒng)的功能分解分析法的著眼點在于一個系統(tǒng)需要什么樣的信息處理方法和過程,以過程的抽象來對待系統(tǒng)的需要。而面向?qū)ο蠓治?OOA)是把信息世界中的概念與面向?qū)ο蟪绦蛟O(shè)計語言的重要概念結(jié)合在一起而形成的分析方法,最后通常是將問題空間以圖表形式描述。OOA直接映射問題空間,全面地將問題空間中現(xiàn)實功能抽象化。將問題空間中的實例抽象為對象,用對象的結(jié)構(gòu)反映問題空間的復(fù)雜實例和復(fù)雜關(guān)系,用屬性和操作表示實例的特性和行為。對一個系統(tǒng)而言,與傳統(tǒng)分析方法產(chǎn)生的結(jié)果相反,行為是相對穩(wěn)定的,結(jié)構(gòu)是相對不穩(wěn)定的,這更充分反映了現(xiàn)實的特性。OOA的作用是為后面階段類的選定和實現(xiàn),以及類層次結(jié)構(gòu)的組織和實現(xiàn)提供平臺。因此,對OOA的測試,應(yīng)從以下方面考慮:
(1)對認(rèn)定的對象的測試;
(2)對認(rèn)定的結(jié)構(gòu)的測試;
(3)對認(rèn)定的主題的測試;
(4)對定義的屬性和實例關(guān)聯(lián)的測試;
(5)對定義的服務(wù)和消息關(guān)聯(lián)的測試。
2.面向?qū)ο笤O(shè)計的測試
通常的結(jié)構(gòu)化的設(shè)計方法用的是面向作業(yè)的設(shè)計方法,它把系統(tǒng)分解以后,提出一組作業(yè),這些作業(yè)是以過程實現(xiàn)系統(tǒng)的基礎(chǔ)構(gòu)造,把問題域的分析轉(zhuǎn)化為求解域的設(shè)計,分析的結(jié)果是設(shè)計階段的輸入。而面向?qū)ο笤O(shè)計(OOD)采用“造型”的觀點,以O(shè)OA為基礎(chǔ)歸納出類,并建立類結(jié)構(gòu)或進(jìn)一步構(gòu)造成類庫,實現(xiàn)分析結(jié)果對問題空間的抽象。由此可見,OOD是OOA的進(jìn)一步細(xì)化和更高層的抽象。所以,OOD與OOA的界限通常是難以嚴(yán)格區(qū)分的。OOD確定類和類結(jié)構(gòu)不僅是滿足當(dāng)前需求分析的要求,更重要的是通過重新組合或加以適當(dāng)?shù)难a充,能方便實現(xiàn)功能的重用和擴(kuò)增,以不斷適應(yīng)用戶的要求。因此,對OOD的測試,應(yīng)從以下三方面考慮:
(1)對認(rèn)定的類的測試;
(2)對構(gòu)造的類層次結(jié)構(gòu)的測試;
(3)對類庫的支持的測試。
3.面向?qū)ο缶幊痰臏y試
典型的面向?qū)ο蟪绦蚓哂欣^承、封裝和多態(tài)的新特性,這使得傳統(tǒng)的測試策略必須有所改變。封裝是對數(shù)據(jù)的隱藏,外界只能通過被提供的操作來訪問或修改數(shù)據(jù),這樣降低了數(shù)據(jù)被任意修改和讀/寫的可能性,也降低了傳統(tǒng)程序中對數(shù)據(jù)非法操作的測試。繼承是面向?qū)ο蟪绦虻闹匾攸c。繼承使得代碼的重用率提高,同時也使錯誤傳播的概率提高。多態(tài)使得面向?qū)ο蟪绦驅(qū)ν獬尸F(xiàn)出強(qiáng)大的處理能力,但同時卻使得程序內(nèi)“同一”函數(shù)的行為復(fù)雜化,測試時不得不考慮不同類型具體執(zhí)行的代碼和產(chǎn)生的行為。面向?qū)ο蟪绦蚴前压δ艿膶崿F(xiàn)分布在類中,能正確實現(xiàn)功能的類,通過消息傳遞來協(xié)同實現(xiàn)設(shè)計要求的功能。因此,在面向?qū)ο缶幊?OOP)階段,忽略類功能實現(xiàn)的細(xì)則,將測試的目光集中在類功能的實現(xiàn)和相應(yīng)的面向?qū)ο蟪绦蝻L(fēng)格。對OOP的測試主要體現(xiàn)在以下兩個方面:
(1)數(shù)據(jù)成員是否滿足數(shù)據(jù)封裝的要求;
(2)類是否實現(xiàn)了要求的功能。
4.面向?qū)ο蟮膯卧獪y試
傳統(tǒng)的單元測試的對象是軟件設(shè)計的最小單位——模塊。單元測試的依據(jù)是詳細(xì)設(shè)計描述,單元測試應(yīng)對模塊內(nèi)所有重要的控制路徑設(shè)計測試用例,以便發(fā)現(xiàn)模塊內(nèi)部的錯誤。單元測試多采用白盒測試技術(shù),系統(tǒng)內(nèi)多個模塊可以并行地進(jìn)行測試。
當(dāng)考慮面向?qū)ο筌浖r,單元的概念發(fā)生了變化。封裝驅(qū)動了類和對象的定義,意味著每個類和類的實例(對象)包裝了屬性(數(shù)據(jù))和操縱這些數(shù)據(jù)的操作,而不是個體的模塊。最小的可測試單位是封裝的類或?qū)ο?,類包含一組不同的操作,并且某特殊操作可能作為一組不同類的一部分存在,因此,單元測試的意義發(fā)生了較大變化。我們不再孤立地測試單個操作,而是將操作作為類的一部分。
5.面向?qū)ο蟮募蓽y試
傳統(tǒng)的集成測試有兩種方式:自頂向下集成和自底向上集成。自頂向下集成是構(gòu)造程序結(jié)構(gòu)的一種增量式方式,它從主控模塊開始,按照軟件的控制層次結(jié)構(gòu),以深度優(yōu)先或廣度優(yōu)先的策略,逐步把各個模塊集成在一起。自底向上集成是從“原子”模塊(即軟件結(jié)構(gòu)最低層的模塊)開始組裝測試。因為面向?qū)ο筌浖]有層次的控制結(jié)構(gòu),所以傳統(tǒng)的自頂向下和自底向上集成策略就沒有意義。此外,一次集成一個操作到類中(傳統(tǒng)的增量集成方法)經(jīng)常是不可能的,這是由于構(gòu)成類的成分的直接和間接的交互。對OO軟件的集成測試有兩種不同策略:第一種是稱為基于線程的測試,集成對回應(yīng)系統(tǒng)的一個輸入或事件所需的一組類,每個線程被集成并分別測試,應(yīng)用回歸測試以保證沒有產(chǎn)生副作用;第二種是稱為基于使用的測試,通過測試那些幾乎不使用服務(wù)器類的類(稱為獨立類)而開始構(gòu)造系統(tǒng),在獨立類測試完成后,下一層的使用獨立類的類(稱為依賴類)被測試。這個依賴類層次的測試序列一直持續(xù)到構(gòu)造完整個系統(tǒng)。
6.面向?qū)ο蟮南到y(tǒng)測試
通過單元測試和集成測試,僅能保證軟件開發(fā)的功能得以實現(xiàn),但不能確認(rèn)在實際運行時,它是否滿足用戶的需要。為此,對完成開發(fā)的軟件必須經(jīng)過規(guī)范的系統(tǒng)測試。系統(tǒng)測試應(yīng)該盡量搭建與用戶實際使用環(huán)境相同的測試平臺,應(yīng)該保證被測系統(tǒng)的完整性,對臨時沒有的系統(tǒng)設(shè)備部件也應(yīng)有相應(yīng)的模擬手段。系統(tǒng)測試時,應(yīng)該參考OOA分析的結(jié)果,對應(yīng)描述的對象、屬性和各種服務(wù),檢測軟件是否能夠完全再現(xiàn)問題空間。系統(tǒng)測試不僅是檢測軟件的整體行為表現(xiàn),從另一個側(cè)面看,也是對軟件開發(fā)設(shè)計的再確認(rèn)。面向?qū)ο鬁y試的整體目標(biāo)——以最小的工作量發(fā)現(xiàn)最多的錯誤,和傳統(tǒng)軟件測試的目標(biāo)是一致的,但是OO測試的策略和戰(zhàn)術(shù)有很大不同。面向?qū)ο鬁y試的視角擴(kuò)大到包括復(fù)審分析和設(shè)計模型。此外,測試的焦點從過程構(gòu)件(模塊)移向了類。不論是傳統(tǒng)的測試方法還是面向?qū)ο蟮臏y試方法,我們都應(yīng)該遵循以下原則:
(1)應(yīng)當(dāng)把“盡早和不斷地測試”作為開發(fā)者的座右銘。
(2)程序員應(yīng)該避免檢查自己的程序,測試工作應(yīng)該由獨立的專業(yè)的軟件測試機(jī)構(gòu)來完成。
(3)設(shè)計測試用例時,應(yīng)該考慮到合法的輸入和不合法的輸入,以及各種邊界條件,特殊情況下要制造極端狀態(tài)和意外狀態(tài),比如網(wǎng)絡(luò)異常中斷、電源斷電等情況。
(4)一定要注意測試中的錯誤集中發(fā)生現(xiàn)象,這與程序員的編程水平和習(xí)慣有很大的關(guān)系。
(5)對測試錯誤結(jié)果一定要有一個確認(rèn)的過程。一般由A測試出來的錯誤,一定要有一個B來確認(rèn),嚴(yán)重的錯誤可以召開評審會進(jìn)行討論和分析。
(6)制定嚴(yán)格的測試計劃,并把測試時間安排得盡量寬松
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保技術(shù)與設(shè)備購銷合同
- 2024年版餐廳后廚管理合同2篇
- 2024年廣告創(chuàng)意設(shè)計與執(zhí)行合同模板3篇
- 小學(xué)生語文學(xué)習(xí)計劃
- 存量房買賣合同(15篇)
- 體育工作計劃范文合集五篇
- 員工安全生產(chǎn)承諾書
- 安置房建設(shè)項目商業(yè)計劃書2
- 七年級語文上冊 全冊學(xué)案 人教新課標(biāo)版
- 2025年安全員C證理論考試1000題及答案
- 對外開放與國際合作概述
- 2024屆四川省成都市高中數(shù)學(xué)高一下期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 2023年青協(xié)活動總結(jié)報告
- 提升供應(yīng)鏈效率:年度運營計劃
- 展覽館維修維護(hù)投標(biāo)方案
- 陳赫賈玲小品《歡喜密探》臺詞劇本
- 2023招聘專員個人年終總結(jié)
- 機(jī)房搬遷服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 腦出血入院病歷
- 國際郵輪產(chǎn)業(yè)及未來郵輪
- 小學(xué)第四季度意識形態(tài)分析研判報告
評論
0/150
提交評論