版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1
面向?qū)ο蟮南到y(tǒng)開發(fā)27.1面向?qū)ο蟮幕靖拍钆c特征7.1.1面向?qū)ο蟮幕靖拍?/p>
7.1.2面向?qū)ο蟮幕咎卣?7.1.1面向?qū)ο蟮幕靖拍?.1.1面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蠹夹g(shù)的研究近幾年來已經(jīng)得到很大的發(fā)展,但是,迄今為止,對面向?qū)ο蠹夹g(shù)還沒有一個明確的定義。一般認(rèn)為,在軟件開發(fā)中使用對象、類和繼承等概念就是面向?qū)ο蠹夹g(shù):其實涉及領(lǐng)域非常廣泛,包括軟件開發(fā)時使用的方法學(xué),軟件開發(fā)實現(xiàn)階段所使用的語言、數(shù)據(jù)庫等。面向?qū)ο蠹夹g(shù)還滲入人工智能,操作系統(tǒng),并行處理等各個研究領(lǐng)域。作為面向?qū)ο蠹夹g(shù)的核心,對象、類和繼承以及其他一些概念的確切含義如何,是計算機界一直比較關(guān)心的話題,但迄今還沒有一個標(biāo)準(zhǔn)的定義。41、對象
對象(Object)是面向?qū)ο笙到y(tǒng)中的核心概念。如果不能正確地認(rèn)識和定義它,就無法掌握面向?qū)ο蟮睦碚?。理解面向?qū)ο蟮睦碚?,必須從最基本的概念入手,通過對最基本的概念的掌握,真正認(rèn)識面向?qū)ο蠓椒ǖ淖饔谩?(1)對象的定義
對象具有兩方面的含義,即在現(xiàn)實世界中的含義和在計算機世界中的含義。一個對象既可以非常簡單,又可以非常復(fù)雜。復(fù)雜的對象往往可由若干簡單對象組合而成?!皩ο蟆钡奶匦裕孩儆幸粋€名字以區(qū)別于其他對象;②有一個狀態(tài)用來描述它的某些特征;③有一組操作,每個操作決定對象的一種功能或行為;④對象的操作可分為兩類:一類是自身所承受的操作,一類是施加于其他對象的操作。由此,對象可以看做其自身所具有的狀態(tài)特征及可以對這些狀態(tài)施加的操作結(jié)合在一起所構(gòu)成的獨立實體。6(2)對象的狀態(tài)
一個對象之所以能在現(xiàn)實世界中獨立存在,是因為它具有自身的狀態(tài),即自身所具有的那些特征。由于這些狀態(tài)的存在,使其能對自身及外界對象施加操作。當(dāng)然一個對象的這些狀態(tài)并不是完全用來直接為外界服務(wù)的,但它們本身是能夠為外界服務(wù)的基礎(chǔ)。7(3)對象的特征
對象從形式上看,是系統(tǒng)程序員、應(yīng)用程序員或用戶所定義的抽象數(shù)據(jù)類型的變量;當(dāng)用戶定義一個對象,就創(chuàng)造了具有豐富內(nèi)涵的新的抽象數(shù)據(jù)類型。它是構(gòu)成和支撐整個面向?qū)ο蟪绦蛟O(shè)計的細(xì)胞和基石。它具有下述三個特性。8①模塊獨立性。
從邏輯上看,一個對象是獨立存在的模塊。從外部看這模塊,只需了解它具有哪些功能,至于它如何實現(xiàn)這些功能和使用哪些局部數(shù)據(jù)來完成它們,則都“隱蔽”在模塊內(nèi)部。這意味著模塊內(nèi)部狀態(tài)不因外界的干擾而改變,也不會波及其他模塊;模塊間的依賴性極小或幾乎沒有;各模塊可以獨立地為系統(tǒng)所組合選用,也可被程序員重用,而不必?fù)?dān)心波及或破壞其他模塊。9②動態(tài)連接性。
客觀世界中各式各樣的對象,并不是孤立存在的,它們之間是有聯(lián)系的。正是它們之間的相互作用、聯(lián)系和連接,構(gòu)成世間各種不同的系統(tǒng)。同時,在面向?qū)ο蟪绦蛟O(shè)計中,通過消息激活機制,把對象之間動態(tài)聯(lián)系在一起,使整個機體運轉(zhuǎn)起來,便稱為對象的連接性。10③易維護性。
由于對象的功能被“隱蔽”,好像被一層封裝殼保護在對象內(nèi)部,所以修改、完善功能及其實現(xiàn)的細(xì)節(jié)都被局限于該對象的內(nèi)部,不會波及外部,這就使得對象和整個系統(tǒng)變得非常容易維護。112、類
類(Class)是面向?qū)ο笙到y(tǒng)中最重要的概念,面向?qū)ο蟪绦蛟O(shè)計中的所有的操作都?xì)w結(jié)為對類的操作。在面向?qū)ο蟪绦蛟O(shè)計中因為引入類的概念,使得它與傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計明顯地區(qū)分開來。把眾多的事物歸納、劃分成一些類,是人類在認(rèn)識客觀世界時經(jīng)常采用的思維方法。分類所依據(jù)的原則是抽象,即忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性:把具有共同性質(zhì)的事物劃分為一類,得出一個抽象的概念。12(1)類的定義
在面向?qū)ο蟮姆椒▽W(xué)中,類是具有相同屬性和服務(wù)的一組對象的集合。它為屬于該類的全部對象提供統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個主要部分。類的作用是定義對象。對象既具有共同性,也具有特殊性。運用抽象的原則舍棄對象的特殊性,抽取其共同性,則得到一個適應(yīng)一批對象的類。如果在這個類的范圍內(nèi)考慮定義這個類時舍棄的某些特殊性,則在這個類中只有一部分對象具有這些特殊性,這些對象彼此是共同的,于是得到一個新的類,它是前一個類的子集,稱做前一個類的特殊類,而前一個類稱做這個新類的一般類,這是從一般類發(fā)現(xiàn)特殊類。也可以從特殊到一般:考慮若干類所具有的彼此共同的特征,舍棄它們彼此不同的特殊性,則得到這些類的一般類。一般類和特殊類是相對而言的。它們之間是一種真包含的關(guān)系,即特殊類是一般類的一個真子集。如果兩個類之間沒有這種關(guān)系,就談不上一般和特殊。特殊類具有它的一般類的全部特征,同時又具有一些只適應(yīng)于本類對象的獨有特征。13(2)類與實例的關(guān)系
類與對象的關(guān)系如同一個模具與用這個模具鑄造出來的鑄件之間的關(guān)系。類給出了屬于該類的全部對象的抽象定義,而對象則是符合這種定義的一個實體。所以,一個對象又稱做類的一個實例(Instance),也有人把類稱做對象的模板(Template)。所謂“實體”或“實例”意味著什么呢?最現(xiàn)實的一件事是:在程序中,每個對象要有自己的存儲空間,以保存它們自己的屬性值。我們說同類對象具有相同的屬性與服務(wù),是指它們的定義形式相同,而不是說每個對象的屬性值都相同。對于同一類的不同實例之間,必定具有如下特點:相同的操作集合;相同的屬性集合;不同的對象名。143、消息
對象與對象之間不是彼此獨立的,它們之間存在著聯(lián)系。在面向?qū)ο笙到y(tǒng)中,對象之間的聯(lián)系是通過消息(Message)傳遞的。15(1)消息的定義
面向?qū)ο蠓椒▽W(xué)中對消息的定義是:消息就是向?qū)ο蟀l(fā)出的服務(wù)請求,它應(yīng)該含有下述信息:提供服務(wù)的對象標(biāo)識,服務(wù)標(biāo)識,輸入信息和回答信息。消息是對象之間相互請求或相互協(xié)作的途徑,要求某個對象執(zhí)行其中某個功能。通常,把發(fā)送消息的對象稱為發(fā)送者,接收消息的對象稱為接收者。對象間的聯(lián)系,只能通過傳送消息來進行。對象也只有在收到消息時,才被激活。被激活后的對象代碼將“知道”如何去操作它的私有數(shù)據(jù),去完成所發(fā)送的消息要求的功能。16(2)消息的性質(zhì)①同一對象可以接收不同形式的多個消息,產(chǎn)生不同的響應(yīng);②相同形式的消息可以送給不同對象,所做出的響應(yīng)可以是截然不同的;③消息的發(fā)送可以不考慮具體的接收者,對象可以響消息,也可以對消息不予理會,對消息的響應(yīng)并不是必須的。177.1.2面向?qū)ο蟮幕咎卣?/p>
面向?qū)ο笙到y(tǒng)最突出的特性就是封裝性,繼承性和多態(tài)性。衡量某種程序設(shè)計語言,看它是否是面向?qū)ο蟮某绦蛟O(shè)計語言,主要看它是否具有這三種特性。181、封裝性(1)封裝的含義封裝(Encapsulation)是面向?qū)ο蠓椒ǖ囊粋€重要原則。它有兩個含義:一是把對象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個不可分割的獨立單位(即對象)。第二個含義也稱“信息隱蔽”,即盡可能隱蔽對象的內(nèi)部細(xì)節(jié),對外形成一個邊界(或者說形成一道屏障),只保留有限的對外接口,使之與外部發(fā)生聯(lián)系。這主要是指對象的外部不能直接地存取對象的屬性,只能通過幾個允許外部使用的服務(wù)與對象發(fā)生聯(lián)系。封裝的定義是:把對象的屬性和服務(wù)結(jié)合成一個獨立的系統(tǒng)單位,盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。在程序設(shè)計中,封裝是指將一個數(shù)據(jù)和與這個數(shù)據(jù)有關(guān)的操作集合放在一起,形成一個能動的實體——對象,用戶不必知道對象行為的實現(xiàn)細(xì)節(jié),只需根據(jù)對象提供的外部特性接口訪問對象即可。因此,從用戶的觀點來看,這些對象的行為就像包含在一個“黑匣子”里,是隱蔽的、看不見的。19(2)封裝的條件封裝應(yīng)該具有下面三個條件。①具有一個清楚的邊界,對象的所有私有數(shù)據(jù)、內(nèi)部程序(成員函數(shù))細(xì)節(jié)都被固定在這個邊界內(nèi)。②具有一個接口,這個接口描述對象之間的相互作用、請求和響應(yīng),它就是消息。③對象內(nèi)部的實現(xiàn)代碼受到封裝殼的保護,其他對象不能直接修改本對象所擁有的數(shù)據(jù)和代碼。20(3)協(xié)議
協(xié)議是一個對象對外服務(wù)的說明,它聲明這個對象可以為外界做什么。它是由一個對象能夠接受并且愿意接受的所有信息構(gòu)成的對外接口。也就是說,請求對象進行操作的惟一途徑就是通過協(xié)議中提供的消息進行的。外界對象能夠并且只能根據(jù)該對象發(fā)送協(xié)議中所提供的消息,請求該對象服務(wù)。即使一個對象可以完成某個功能,但它沒有將該功能放入?yún)f(xié)議中,外界對象依然不能請求它完成這個功能。協(xié)議實際上是一個對象所能接受的所有公有消息的集合。21(4)面向?qū)ο笙到y(tǒng)的封裝性
面向?qū)ο笙到y(tǒng)的封裝性是一種信息隱藏技術(shù)。它使系統(tǒng)設(shè)計員能夠清楚地標(biāo)明他們所提供的服務(wù)界面,用戶或應(yīng)用程序員只能看見對象提供的操作功能,看不到其中的數(shù)據(jù)或操作代碼細(xì)節(jié)。從用戶或應(yīng)用程序員的角度看,對象提供了一組服務(wù),而服務(wù)的具體實現(xiàn),即對象的內(nèi)部卻被屏蔽封裝著。對象的這一封裝機制的目的,在于將對象的使用者與設(shè)計者分開。使用者不必知道對象行為實現(xiàn)的細(xì)節(jié),只需用設(shè)計者提供的協(xié)議,命令對象去做即可。面向?qū)ο笙到y(tǒng)中的封裝單位為對象,即主要指對對象的封裝。類概念本身也是一種封裝意義。222、繼承性
繼承(Inheritance)是面向?qū)ο笙到y(tǒng)中的另一個重要的概念。前面討論了類,這些類是孤立的,相互之間還沒有建立關(guān)系。也就是說,這些類都處在同一級別上,是一種平坦結(jié)構(gòu)。這種沒有建立相交關(guān)系的平坦結(jié)構(gòu)限制了面向?qū)ο笙到y(tǒng)的設(shè)計,因為它不允許類之間實現(xiàn)信息共享。在系統(tǒng)中有些對象,它們有些相同但又有些差別;如果不允許類之間建立相交關(guān)系,這些不同對象的相似之處就無法表現(xiàn)出來。23(1)繼承的引入
繼承意味著“自動地?fù)碛小?。就是說,特殊類中不必重新定義在它的一般類中定義過的屬性和服務(wù),而它卻自動地、隱含地?fù)碛衅湟话泐惖乃袑傩耘c服務(wù)。從一般類和特殊類的定義可以看到,后者對前者的繼承在邏輯上是必然的。一個特殊類既有自己新定義的屬性和服務(wù),又有從它的一般類中繼承的屬性與服務(wù)。繼承的屬性和服務(wù),盡管是隱式的,但是無論在概念上還是在實際效果上,都確確實實地是這個類的屬性和服務(wù);同時繼承關(guān)系是傳遞的。繼承具有重要的實際意義,它簡化了人們對事物的認(rèn)識和描述。繼承對于軟件復(fù)用是很有益的。24(2)繼承與類的關(guān)系
繼承所表達(dá)的就是一種對象類之間的相互關(guān)系。它使得某類對象可以繼承另外一類對象的特征和能力。特殊類的對象擁有其一般類的全部屬性與服務(wù),稱做特殊類對一般類的繼承。若類間具有繼承關(guān)系,則它們之間應(yīng)具有三個特性:
①類間具有共享特征(包括數(shù)據(jù)和程序代碼的共享);
②類間具有細(xì)微的差別或新增部分(包括非共享的程序代碼和數(shù)據(jù));
③類間具有層次結(jié)構(gòu)。繼承所具有的作用有兩個方面:一方面可以減少代碼冗余;另一方面可以通過協(xié)調(diào)性減少相互之間的接口和界面。25(3)繼承與封裝的關(guān)系
在面向?qū)ο笙到y(tǒng)中,有了封裝機制以后,對象之間只能通過消息傳遞進行通信。繼承機制的引入絲毫沒有影響對象的封裝性。從另一個角度看,繼承和封裝機制還具有一定的相似性,它們都是一種共享代碼的手段。繼承是一種靜態(tài)共享代碼的手段,通過派生類對象的創(chuàng)建,可以接受某個消息啟動其基類所定義的代碼段,使基類和派生類共享這段代碼。封裝機制提供的是一種動態(tài)共享代碼的手段。通過封裝,可將一段代碼定義在一個類中,在另一個類所定義的操作中,可以通過創(chuàng)建該類的實例,向它發(fā)送消息而啟動這段代碼,同樣達(dá)到共享的目的。26(4)類的層次結(jié)構(gòu)
有了繼承機制,就有了類的層次關(guān)系和結(jié)構(gòu)。類的層次結(jié)構(gòu)是表示系統(tǒng)中所有類關(guān)系的輪廓,以這種形式可以很容易地跟蹤類與基類和派生類之間的關(guān)系。類的層次關(guān)系可以清楚有效地表示現(xiàn)實世界事物的分類問題。27(5)繼承機制的特點在面向?qū)ο笙到y(tǒng)中,引入繼承機制后具有如下五個特點:①清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系;②減少代碼和數(shù)據(jù)的冗余度,大大增加程序的重用性;③通過增強一致性,減少模塊間的接口和界面,大大增加程序的易維護性;④是自動傳播代碼的有力工具;⑤是在一些比較一般的類的基礎(chǔ)上構(gòu)造,建立和擴充新類的最有效的手段。在面向?qū)ο笙到y(tǒng)中,繼承性不僅作用在對操作的繼承上,還作用在對數(shù)據(jù)內(nèi)容的繼承上,既具有結(jié)構(gòu)特性的繼承性,又具有行為特性的繼承性。283、多態(tài)性
多態(tài)性(Polymorphism)是面向?qū)ο笙到y(tǒng)中的又一重要特性。它描述的是同一個消息可以根據(jù)發(fā)送消息對象的不同,采用多種不同的行為方式。重載,虛函數(shù),抽象類是實現(xiàn)多態(tài)性的幾個重要手段。29(1)重載
在面向?qū)ο笙到y(tǒng)中,重載的含義是指通過為函數(shù)和運算符創(chuàng)建附加定義而使它們的名字可以重載。也就是說,相同名字的函數(shù)或運算符在不同的場合可以表現(xiàn)出不同的行為。30(2)虛函數(shù)
虛函數(shù)使用戶在一個類等級中可以使用相同函數(shù)的多個版本。每個版本均屬于類等級中的不同的類。究竟使用的是哪一個特定的版本,需要在運行中決定。31(3)抽象類
抽象類的作用是將許多有關(guān)的類組織在一起,提供一個公共的基類,而那些被它組織在一起的具體的類由它派生出來。它刻畫公有行為的特征,通過繼承機制傳送給它的派生類。抽象類只描述與這類對象有關(guān)的協(xié)議和消息的部分實現(xiàn),完整的實現(xiàn)留給它的派生類具體完成。抽象類不能創(chuàng)建具體對象的類,即不能產(chǎn)生實例,只能建立它的派生類的對象。32(4)面向?qū)ο笙到y(tǒng)的多態(tài)性
面向?qū)ο笙到y(tǒng)的多態(tài)性指的是,當(dāng)不同的對象收到相同的消息時產(chǎn)生不同的動作。比如,C++語言支持兩種多態(tài)性:即編譯時的多態(tài)性和運行時的多態(tài)性。編譯時的多態(tài)性是通過使用重載實現(xiàn)的,到底執(zhí)行的哪個重載版本在編譯時就可知道,所以是相對靜態(tài)的多態(tài)性。運行時的多態(tài)性是通過虛函數(shù)實現(xiàn)的,到底運行的哪個函數(shù)版本,需要在運行時通過找出發(fā)送消息的對象來確定。編譯器在編譯時采用的是動態(tài)聯(lián)編手段。337.2面向?qū)ο蟮南到y(tǒng)開發(fā)原理與步驟
7.2.1面向?qū)ο蟮南到y(tǒng)開發(fā)原理現(xiàn)實世界的問題空間和軟件的解空間之間存在很大的距離。面向?qū)ο蟮南到y(tǒng)開發(fā)就是力圖縮短這個距離。它圍繞著現(xiàn)實世界的概念組織模型,是一種全新的思考問題的方式。它通過對應(yīng)用領(lǐng)域的概念進行分類和組織,更好地與客觀世界相吻合。它鼓勵軟件的用戶,系統(tǒng)分析員,軟件設(shè)計者,編程人員和管理人員之間進行充分的信息交流。347.2.2面向?qū)ο蟮南到y(tǒng)開發(fā)生命周期在以往的管理信息系統(tǒng)開發(fā)中,系統(tǒng)生命周期是瀑布式的,它把系統(tǒng)的開發(fā)過程分解為分析、設(shè)計、實施、測試和維護五個階段。面向?qū)ο蟮南到y(tǒng)開發(fā)生命周期與瀑布式系統(tǒng)開發(fā)生命周期有所不同,它由四個階段組成,每個階段都可以相互反饋,整個過程是一種迭代、漸增的開發(fā)過程。351、分析階段面向?qū)ο蠓治觯∣OA,Object-OrientedAnalysis)是從問題域中選出詞匯,建立類和對象的模型世界。362、設(shè)計階段面向?qū)ο笤O(shè)計(OOD,Object-OrientedDesign)是對問題域的行為進行關(guān)鍵抽象再分解的過程。設(shè)計的結(jié)果反饋到分析上進行修正。當(dāng)關(guān)鍵抽象足夠簡單,不需要再分解時即可停止設(shè)計。373、演化階段演化實際上是由面向?qū)ο蟪绦蛟O(shè)計(OOP,Object-OrientedProgramming)測試和集成組合在一起的階段。384、維護階段維護是在系統(tǒng)提交運行之后的變更活動。397.2.3面向?qū)ο笙到y(tǒng)開發(fā)中的圖示符號——對象關(guān)系圖在面向?qū)ο蟪绦蛟O(shè)計(OOP)中,就內(nèi)部操作而言,一個對象本身有不足的地方不是關(guān)鍵問題。這容易察覺也容易修正,可以隨時進行改進,甚至在系統(tǒng)運行時也可改進。因為這一改動是限定在一個特定的對象類中的,不會對整個系統(tǒng)產(chǎn)生大的損傷。不同對象間通信上的不足通常是設(shè)計當(dāng)中較為嚴(yán)重的問題。若再進行改動或擴充時,對象之間的消息傳遞將是非常困難的事情,因為它所波及的面比較大。若消息能力不足,就很難正常啟動系統(tǒng)運行。對象關(guān)系圖就是為了確定系統(tǒng)設(shè)計中的消息通信是否完整而設(shè)計的。它既包括對象類之間的結(jié)構(gòu)關(guān)系,又包括相互消息傳遞的對象之間的動態(tài)關(guān)系。使用對象關(guān)系圖,可以發(fā)現(xiàn)設(shè)計中的錯誤,特別是那些有關(guān)對象間關(guān)系的錯誤;作為實際應(yīng)用編碼的依據(jù):用于系統(tǒng)出問題時的調(diào)試與檢錯。401、對象間的創(chuàng)建關(guān)系對象之間的創(chuàng)建關(guān)系是委托關(guān)系的一種具體實現(xiàn),即一個對象在它的成員函數(shù)中創(chuàng)建另一個關(guān)系對象,而后再委托它進行部分工作,最后完成自己的工作。這種創(chuàng)建關(guān)系發(fā)生在一個對象實現(xiàn)某個方法(某種操作功能)過程中,使用另一個對象的時候。例如,對象A在實施M方法中創(chuàng)建另一個對象B,所以在對象A和對象B之間通過方法M建立了創(chuàng)建關(guān)系,稱對象A是對象B的基于方法M的創(chuàng)建者,可用圖7.3表示這種創(chuàng)建關(guān)系,這是一種單個對象的創(chuàng)建關(guān)系。412、對象間的聚合關(guān)系對象之間的聚合關(guān)系是指一個對象是由若干其他對象組合而成的,是一種包含關(guān)系。這種包含關(guān)系是直接的,對象的創(chuàng)建不要通過一個中間方法來實現(xiàn)。當(dāng)這個對象被創(chuàng)建以后,組成它的各個對象將自動被創(chuàng)建。例如,對象A是由對象1,對象2,對象3和對象4這四部分組成的。在面向?qū)ο笙到y(tǒng)中要想描述它們,可將這四部分都定義為對象類,因為“對象A”這個對象類由這四部分組成。它們之間不是一種繼承關(guān)系,而是一種包含關(guān)系。這四個對象類在“對象A”類中以成員對象的身份存在,它們之間體現(xiàn)的是一種對象之間的聚合關(guān)系,可用圖7.4給出它們之間的關(guān)系圖。423、對象間的消息流圖消息流圖用來描述系統(tǒng)中對象間的消息流,它只描述那些相關(guān)對象間交換的主要消息。這種圖能夠幫助我們看到對象是如何交互完成賦予它們的任務(wù)的。消息流圖有內(nèi)向消息圖和外向消息圖兩種。43(1)內(nèi)向消息圖描述一個對象如何從其他對象接收消息。例如對象B和對象C分別向?qū)ο驛發(fā)送了一條消息,其消息流圖如圖7.5所示。44(2)外向消息流圖描述一個特定對象發(fā)送給其他對象的所有消息,與內(nèi)向消息流圖正好相反。例如對象A分別發(fā)送了一個消息給對象B和對象C,其消息流圖如圖7.6所示。457.3面向?qū)ο蠓治觯∣OA)7.3.1面向?qū)ο蠓治龅闹饕ぷ?.3.2面向?qū)ο蟮姆治龇椒?67.3.1面向?qū)ο蠓治龅闹饕ぷ?/p>
和其他分析方法一樣,OOA的基本出發(fā)點是問題域和用戶需求。分析員的主要工作就是通過不斷地研究問題域,建立一個滿足用戶需求的系統(tǒng)模型。471、需求分析用戶需求就是用戶對所要開發(fā)的系統(tǒng)提出的各種要求和期望。它包括系統(tǒng)的功能,性能,可靠性,保密要求,交互方式等技術(shù)性要求和資金強度,交付時間,資源使用限制等非技術(shù)性要求。在多數(shù)情況下,功能需求是分析員考慮最多的因素。研究用戶需求包括以下五個活動。48(1)閱讀閱讀一切與用戶需求有關(guān)的書面材料。49(2)交流
與用戶交流,搞清有關(guān)用戶需求的疑點,糾正用戶不切實際的要求或不確切的表達(dá)。50(3)調(diào)查
有些需求問題,通過閱讀和與用戶的交流,仍然不能完全明確,則需要到現(xiàn)場做適當(dāng)?shù)恼{(diào)查,目標(biāo)僅限于搞清用戶需求(更深入、詳盡的調(diào)查將在分析工作開始后展開)。51(4)記錄
隨時記錄通過閱讀、交流和調(diào)查所得到的認(rèn)識,更要記錄所存在的疑點(有些關(guān)于需求細(xì)節(jié)的疑點,可留待對問題域做深入調(diào)查與分析時解答)。52(5)整理
糾正初始的需求文檔中不正確或不確切的內(nèi)容,整理一份符合開發(fā)規(guī)范,并且確定表達(dá)系統(tǒng)責(zé)任的需求文檔。532、系統(tǒng)分析
分析階段集中于問題域的關(guān)鍵抽象,明確問題中有哪些數(shù)據(jù)實體存在,它們的意義是什么,暫時不考慮它們是怎樣處理的。在分析階段,可分如下三個步驟進行。54(1)定義問題邊界在滿足系統(tǒng)要求的前提下,劃分問題邊界很重要的是討論系統(tǒng)的應(yīng)變性和穩(wěn)定性,然后得出設(shè)計的策略。在系統(tǒng)邊界以內(nèi),是系統(tǒng)本身所包含的對象。在系統(tǒng)邊界以外,是系統(tǒng)外部的活動者,主要是人、設(shè)備和外系統(tǒng)。人,是指與系統(tǒng)交互的人員。問題域中的有些人員與設(shè)備,不應(yīng)看做系統(tǒng)邊界以外的活動者。認(rèn)識系統(tǒng)邊界是為了明確系統(tǒng)的范圍以及與外部世界的接口。55(2)問題域的關(guān)鍵抽象問題域的關(guān)鍵抽象就是找出有關(guān)系的類和對象。任何一個抽象級的類,它的每個成員必須是相互獨立的、不可再分解的,并且類中的全體成員都依賴于其中的一個關(guān)鍵成員,以建立起關(guān)系。問題域和系統(tǒng)責(zé)任是發(fā)現(xiàn)對象的根本出發(fā)點。為了盡可能全面發(fā)發(fā)現(xiàn)系統(tǒng)所需要的對象,分析員應(yīng)該把握“先松后緊”的原則。56(3)類的抽象在OOA中正確地運用抽象原則,先要舍棄那些與系統(tǒng)責(zé)任無關(guān)的事物,只注意與系統(tǒng)責(zé)任有關(guān)的事物。其次,對于與系統(tǒng)責(zé)任有關(guān)的事物,也不是把它們的任何特征都在相應(yīng)的對象中表達(dá)出來,而要舍棄那些與系統(tǒng)責(zé)任無關(guān)的特征。判斷事物是否與系統(tǒng)責(zé)任有關(guān)的關(guān)鍵問題,一是該事物是否為系統(tǒng)提供一些有用的信息,或者是否需要系統(tǒng)為它保存和管理某些信息;二是該事物是否向系統(tǒng)提供某些服務(wù),或者說是否需要系統(tǒng)描述它的某些行為。577.3.2面向?qū)ο蟮姆治龇椒?81、Bailin的面向?qū)ο蠼Y(jié)構(gòu)化分析方法Bailin認(rèn)為,傳統(tǒng)的結(jié)構(gòu)化分析具有很強的生命力和很大的合理性,已經(jīng)為計算機界廣泛接收,并且已有許多支持該方法的工具和環(huán)境,放棄是很可惜的。如果把結(jié)構(gòu)化分析作為分析階段的主要方法,需要解決從需求規(guī)格說明到面向?qū)ο笤O(shè)計的過渡問題。結(jié)構(gòu)化分析是一個對系統(tǒng)功能需求進行整理的方法。因為聚集的原則不同,要從結(jié)構(gòu)化分析過渡到面向?qū)ο笤O(shè)計較為困難,需要重新構(gòu)造數(shù)據(jù)流圖。針對這一情況,Bailin提出面向?qū)ο蠼Y(jié)構(gòu)化分析,既能利用已有的經(jīng)濟與工具,又能實現(xiàn)從分析到面向?qū)ο笤O(shè)計的平滑過渡。59(1)Bailin的面向?qū)ο蠼Y(jié)構(gòu)化分析的基本思想
在面向?qū)ο蠼Y(jié)構(gòu)化分析中,主要概念是實體,而不是過程。結(jié)構(gòu)化設(shè)計中的過程可以是一個有效的實體,實體所隱含的意義較過程有所不同。在這個方法中,不是強調(diào)輸入到輸出的轉(zhuǎn)化,而是強調(diào)實體的“內(nèi)容”。在面向?qū)ο蠼Y(jié)構(gòu)化分析中,仍然采用DFD的形式表示輸入和輸出,不同的是用實體數(shù)據(jù)流圖(EDFD)來替代傳統(tǒng)的數(shù)據(jù)流圖。EDFD的結(jié)點分為實體和函數(shù)兩類。每個函數(shù)必須和實體相關(guān),即函數(shù)由實體執(zhí)行,或者作用在實體上。60(2)實體的分解Bailin進一步將實體分為主動實體和被動實體。主動實體被表示為數(shù)據(jù)流圖的結(jié)點,而被動實體則以數(shù)據(jù)流或數(shù)據(jù)槽的形式出現(xiàn)。這里的實體為對象的同義詞。低層EDFD把每個實體分解成一些子實體,或分解為由實體調(diào)用的一些函數(shù),也可能分解為兩者的結(jié)合。函數(shù)可以分解為子函數(shù)。EDFD的層次結(jié)構(gòu)包括較高層的實體圖和該實體在低層時被分為子實體和函數(shù)的流圖。61(3)分析步驟Bailin的面向?qū)ο蠼Y(jié)構(gòu)化分析方法包括七個步驟:①確定關(guān)鍵的問題——領(lǐng)域?qū)嶓w,②區(qū)別主動和被動實體,③在主動實體之間建立數(shù)據(jù)流,④把實體(或函數(shù))分解為子實體和/或子函數(shù),⑤對新的實體進行檢測,⑥在新的實體下匯集相關(guān)函數(shù),⑦把新實體歸類到恰當(dāng)?shù)念I(lǐng)域。62(4)分析結(jié)果的表現(xiàn)
面向?qū)ο蠼Y(jié)構(gòu)化分析的結(jié)果(即面向?qū)ο蟮男枨笠?guī)格說明)包括一個EDFD的層次結(jié)構(gòu)和一組實體關(guān)系圖(ERD)。實體關(guān)系模型(E-R模型)可以作為此規(guī)格說明的背景材料,為用戶和開發(fā)者提供問題領(lǐng)域的概貌,以及所分析的系統(tǒng)范圍內(nèi)的一些屬于技術(shù)領(lǐng)域的知識。632、SallyShlaer與StephenMellor的面向?qū)ο蟮姆治龇椒⊿ally
Shlaer與StephenMellor開發(fā)了的面向?qū)ο蟮姆治龇椒āT摲椒ㄒ孕畔⒛P突椒ㄗ鳛榛A(chǔ),還為目標(biāo)系統(tǒng)提供了另外兩個模型:一個狀態(tài)模型和一個過程模型。這三個模型從三個不同的角度描述系統(tǒng):相關(guān)的信息,狀態(tài)和過程信息,包含關(guān)于問題領(lǐng)域較為完整的信息。64SallyShlaer與StephenMellor的方法分為六個步驟:①開發(fā)一個信息模型;②定義對象的生命周期;③定義關(guān)系的動態(tài)特征;④定義系統(tǒng)的動態(tài)特征;⑤開發(fā)過程模型;⑥定義領(lǐng)域和子系統(tǒng)。65SallyShlaer與StephenMellor的方法準(zhǔn)則Sally
Shlaer與StephenMellor方法只是隱式地支持面向?qū)ο蟮娜齻€基本準(zhǔn)則:分類、繼承和封裝。信息模型中包含的對象和關(guān)系雖然不與面向?qū)ο笠I(lǐng)中對象、分類、繼承、組裝等概念直接等同,但可以很方便地將SallyShlaer&StephenMellorOOA中的概念在設(shè)計時映射到面向?qū)ο蟮母拍睢allyShlaer和StephenMellor方法還要求每個動作處理過程和相關(guān)的動作數(shù)據(jù)流圖僅與對象聯(lián)系,從而保證這些操作的封裝性。667.4面向?qū)ο笤O(shè)計(OOD)677.4.1面向?qū)ο笤O(shè)計的步驟及設(shè)計工具Booch是面向?qū)ο笤O(shè)計領(lǐng)域的先驅(qū)。Booch將他的方法學(xué)看做結(jié)構(gòu)化設(shè)計的一種替代,而不是一種擴充。雖然Booch描述了輔助設(shè)計的許多技術(shù)與工具包括從非形式的表列到形式的圖與模板,但是沒有關(guān)于面向?qū)ο笤O(shè)計中各階段的固定工作次序。他建議分析員應(yīng)采用適合于具體問題的非形式化技術(shù),反復(fù)地、增量地添加形式化的圖和模板中的內(nèi)容。681、設(shè)計步驟(1)標(biāo)識類與對象(2)標(biāo)識類與對象的語義(3)標(biāo)識類/對象之間的關(guān)系(4)實現(xiàn)類與對象69(1)標(biāo)識類與對象
這一過程主要是在問題領(lǐng)域內(nèi)發(fā)現(xiàn)最關(guān)鍵的對象,提出能使對象協(xié)同工作以完成某些功能的重要機制。這些對象作為候選的類和對象,隨著對問題領(lǐng)域的不斷了解,進行更新。在這一步中,也可通過畫出對象圖和類圖,說明類、對象及其相互之間的關(guān)系和作用。70(2)標(biāo)識類與對象的語義
用多種技術(shù)確定在前一步標(biāo)識的類與對象的意義,包括產(chǎn)生定義,對象從創(chuàng)建到撤消全生存周期中的“活動情節(jié)”。這一步驟就需要開發(fā)者以公正的態(tài)度,經(jīng)過反復(fù)考慮和仔細(xì)觀察后再確定。在這里要定義類圖/模板、對象圖/模板和操作模板。71(3)標(biāo)識類/對象之間的關(guān)系
建立類/對象之間的交互,如類之間的繼承模式、對象之間的合作模式,其結(jié)果關(guān)系整個系統(tǒng)的質(zhì)量。同時,捕捉對象/類之間的可見性判定。在這一過程中需要設(shè)計基本的模塊圖/模板。72(4)實現(xiàn)類與對象
構(gòu)造類與對象詳細(xì)的內(nèi)部視圖,包括定義它們的行為(服務(wù)),將類與對象分配到目標(biāo)語言環(huán)境中定義的模塊;當(dāng)目標(biāo)環(huán)境支持多處理機時,還將為不同程序分配不同處理機。在這一步中,除了對上述圖和模板進行求精外,還可根據(jù)需要設(shè)計處理圖。這一步驟還不是最后的一環(huán),整個軟件系統(tǒng)的開發(fā)需要重復(fù)整個過程。732、Booch面向?qū)ο笤O(shè)計工具簡介(1)類圖/類模板(2)模塊圖/模塊模板(3)對象圖/模板(4)操作模板(5)處理圖/模板(6)狀態(tài)轉(zhuǎn)換圖(7)時序圖74(1)類圖/類模板
類是共享相同結(jié)構(gòu)和行為對象的結(jié)合。類之間有繼承、實例化等關(guān)系。類圖描述類的存在和在系統(tǒng)邏輯設(shè)計類之間的關(guān)系。類圖的結(jié)構(gòu)包括類、類間關(guān)系以及類的服務(wù),所支持的關(guān)系包括使用、實例化、繼承、元類型和無定義。類用虛線包圍,關(guān)系用有向弧和無向弧表示等。類模板則是對類圖的比較規(guī)范的文字性說明。類模板概括了類本身定義的說明,包括類的可見性,類的子類和父類,類中的操作及其操作的參數(shù),類的持久必嚴(yán)的并發(fā)性和空間復(fù)雜性等。75(2)模塊圖/模塊模板
記錄在系統(tǒng)物理設(shè)計中對象和類到模塊的分配情況。在傳統(tǒng)的軟件開發(fā)中,模塊一般包括子程序、程序包和任務(wù)。在面向?qū)ο筌浖到y(tǒng)中,模塊則對應(yīng)于類和對象。對于復(fù)雜系統(tǒng)來說,類和對象的龐大規(guī)模導(dǎo)致模塊圖的擴充。為了提高抽象水平,使程序員更加了解系統(tǒng)的物理構(gòu)造,提出“子系統(tǒng)”這一模塊性概念。子系統(tǒng)是一些相互影響的類、對象等按一定條件有機地組合在一起,完成某些特定功能的實體。模塊圖表示類、對象以及子系統(tǒng)、模塊之間的關(guān)系。模塊、模板則對模塊圖進行說明,還說明模塊的靜態(tài)含義和動態(tài)含義。靜態(tài)含義主要說明分配給該模塊的最主要的類和對象情況。若有特殊需要的話,通過處理圖或時序圖類描述它們的動態(tài)含義。76(3)對象圖/模板
對象圖用于對對象的某些動態(tài)特征進行模型化。對象圖主要描述了對象、對象的可見性以及對象之間的消息傳遞。在對象圖中,對象用實線包圍,由有向弧連接,有向弧定義了對象的可見性和消息傳遞,但不顯示控制流或事件的順序。由于對象與類有著概念上的聯(lián)系,因此,類圖和對象圖定義不能有相互矛盾。對象模板是對對象圖的正文描述,除此之外,還描述了對象所屬的類,對象的持久性、操作對象、消息發(fā)生的頻率等。77(4)操作模板
操作模板是對類和對象中的操作提供詳細(xì)設(shè)計文檔的結(jié)構(gòu)化正文,以及操作所屬的類或?qū)ο?、操作的參?shù)等,由于操作和類、對象等有緊密關(guān)系,因而在描述中不能有矛盾。78(5)處理圖/模板
用以表示在系統(tǒng)物理設(shè)計時,各個處理分配處理機情況,此僅用于多機處理機環(huán)境內(nèi)的實現(xiàn)。處理圖主要畫出處理器、設(shè)備和它們之間的通信。處理模板除了提供處理圖的文字描述外,還提供一些信息,如處理器的處理能力,如何對分配給該處理器的過程進行優(yōu)化,以及過程說明、過程設(shè)計調(diào)度、設(shè)備和通信介紹。79(6)狀態(tài)轉(zhuǎn)換圖
狀態(tài)轉(zhuǎn)換圖主要表示建模類狀態(tài)和狀態(tài)轉(zhuǎn)換,它顯示類的狀態(tài),引起狀態(tài)轉(zhuǎn)換的事件,以及狀態(tài)轉(zhuǎn)換引起的動作,狀態(tài)用圓表示,事件用有向弧表示,狀態(tài)轉(zhuǎn)換圖顯示了類和對象的動態(tài)變化。80(7)時序圖
對象圖的輔助圖,表示控制流和在一組互相合作的對象中事件的順序。它以時間為橫軸,而縱軸則表示不同的對象,整個時序圖描述了在不同時刻為不同對象進行的不同消息操作,還表示出對象創(chuàng)建、消亡的生命周期過程。817.4.2面向?qū)ο蟮脑O(shè)計體系821、概述20世紀(jì)80年代末以來,面向?qū)ο蠹夹g(shù)成為研究的熱點,面向?qū)ο蠓椒ǘ贾С秩N基本的活動:識別對象和類,描述對象和類之間的關(guān)系,以及通過描述每個類的功能定義對象的行為。當(dāng)重要的對象被發(fā)現(xiàn)后,通過一組互相關(guān)聯(lián)的模型詳細(xì)表示類之間的關(guān)系和對象行為,這些模型從四個不同的側(cè)面表示軟件的體系結(jié)構(gòu):靜態(tài)邏輯、動態(tài)邏輯、靜態(tài)物理和動態(tài)物理。靜態(tài)邏輯模型描述實例化(類成員關(guān)系)、關(guān)聯(lián)、聚集(整體/部分)、和一般化(繼承)等關(guān)系,稱為對象模型。動態(tài)邏輯模型描述對象之間的互相作用。靜態(tài)物理模型通過模塊描述代碼的布局。動態(tài)物理模型描述軟件的進程和線程體系結(jié)構(gòu)。832、Booch方法Booch方法中用對象交互作用圖描述重要的互相作用,顯示參與的對象和對象之間按時間排序的消息。用可見性圖描述互相作用中對象的可見性。對象的可見性定義一個對象如何牌向它發(fā)送消息的方法的作用域之中。例如,它可以是方法的參數(shù)、局部變量、新的對象、或當(dāng)前執(zhí)行方法的對象的部分。84(1)Booch方法的步驟Booch方法的過程包括四個步驟:①在給定的抽象層次上識別類和對象,②識別這些對象和類的語義,③識別這些類和對象之間的關(guān)系,④實現(xiàn)類和對象。這四種活動不僅僅是一個簡單的步驟序列,而是對系統(tǒng)的邏輯和物理視圖不斷細(xì)化的迭代和漸增的開發(fā)過程。85(2)Booch方法的特點
在面向?qū)ο蟮脑O(shè)計方法中,Booch強調(diào)基于類和對象的系統(tǒng)邏輯視圖與基于模塊和進程的系統(tǒng)物理視圖之間的區(qū)別。他還區(qū)別了系統(tǒng)的靜態(tài)和動態(tài)模型。然而,他的方法偏向于系統(tǒng)的靜態(tài)描述,對動態(tài)描述支持較少。86(3)Booch方法的符號體系Booch方法的力量在于其豐富的符號體系,包括類圖(類結(jié)構(gòu)-靜態(tài)視圖)、對象圖(對象結(jié)構(gòu)-靜態(tài)視圖)、狀態(tài)轉(zhuǎn)移圖(類結(jié)構(gòu)-動態(tài)視圖)、時態(tài)圖(對象結(jié)構(gòu)-動態(tài)視圖)、模塊圖(模塊體系結(jié)構(gòu))、進程圖(進程體系結(jié)構(gòu))等。用于類和對象建模的符號體系使用注釋和不同的圖符(如不同的箭頭)表達(dá)詳細(xì)的信息。Booch建議在設(shè)計的初期可用符號體系的一個子集,隨后不斷添加細(xì)節(jié)。對每個符號體系還有一個文本的形式,由每個主要結(jié)構(gòu)的描述模板組成。符號體系有大量的圖符定義,但其語法和語義并沒有嚴(yán)格地定義。872、Rumbaugh的OMT方法88(1)OMT方法的三種模型Rumbaugh的OMT方法從三個視角描述系統(tǒng),相應(yīng)地提供三種模型:對象模型、動態(tài)模型和功能模型。對象模型描述對象的靜態(tài)結(jié)構(gòu)和它們之間的關(guān)系。主要的概念包括:類、屬性、操作、繼承、關(guān)聯(lián)(即關(guān)系)與聚集等。動態(tài)模型描述系統(tǒng)那些隨時間變化的方面,其主要概念有狀態(tài)、子狀態(tài)和超狀態(tài)、事件、行為、活動等。功能模型描述系統(tǒng)內(nèi)部數(shù)據(jù)值的轉(zhuǎn)換,其主要概念有加工、數(shù)據(jù)存儲、數(shù)據(jù)流、控制流與角色(源/潭)。89(2)OMT方法的開發(fā)過程
該方法將開發(fā)過程分為分析、系統(tǒng)設(shè)計、對象設(shè)計與實現(xiàn)四個階段。903、Coad/Yourdon方法Coad/Yourdon方法嚴(yán)格區(qū)分面向?qū)ο蠓治鯫OA和面向?qū)ο笤O(shè)計OOD。91(1)Coad/Yourdon方法的五個層次①發(fā)現(xiàn)類及對象。②識別結(jié)構(gòu)。③定義主題。④定義屬性。⑤定義服務(wù)。在面向?qū)ο蠓治鲭A段,經(jīng)過五個層次的活動后的結(jié)果是一個分成五個層次的問題域模型,包括主題、類及對象、結(jié)構(gòu)、屬性和服務(wù)五個層次,由類及對象圖表示。五個層次活動的順序并不重要。92(2)面向?qū)ο笤O(shè)計模型的組成面向?qū)ο笤O(shè)計模型需要進一步區(qū)分以下四個部分。①問題域部分(PDC)②人-機交互部分(HIC)。③任務(wù)管理部分(TMC)。④數(shù)據(jù)管理部分(DMC)。934、Jacobson方法Jacobson方法與上述三種方法有所不同,它涉及整個軟件生命周期,包括需求分析、設(shè)計、實現(xiàn)和測試等四個階段。需求分析和設(shè)計密切相關(guān)。94(1)需求分析和設(shè)計需求分析階段的活動包括定義潛在的角色(角色指使用系統(tǒng)的人和與系統(tǒng)互相作用的軟、硬件環(huán)境),識別問題域中的對象和關(guān)系,基于需求規(guī)范說明和角色的需要發(fā)現(xiàn)usecase,詳細(xì)描述usecase。設(shè)計階段包括兩個主要活動,從需求分析模型中發(fā)現(xiàn)設(shè)計對象,以及針對實現(xiàn)環(huán)境調(diào)整設(shè)計模型。第一個活動包括從usecase的描述發(fā)現(xiàn)設(shè)計對象,并且描述對象的屬性、行為和關(guān)聯(lián)。在這里還要把usecase的行為分派給對象。95(2)對象與行為的描述
在需求分析階段的識別領(lǐng)域?qū)ο蠛完P(guān)系的活動中,開發(fā)人員識別類、屬性和關(guān)系。關(guān)系包括繼承,熟悉(關(guān)聯(lián)),組成(聚集)和通信關(guān)聯(lián)。定義usecase的活動和識別設(shè)計對象的活動,兩個活動共同完成行為的描述。Jacobson方法還將對象區(qū)分為語義對象(領(lǐng)域?qū)ο螅?,界面對象(如用戶界面對象)和控制對象(處理界面對象和領(lǐng)域?qū)ο笾g的控制)。96(3)usecase模型在該方法中的一個關(guān)鍵概念就是usecase。usecase是指行為相關(guān)的事務(wù)(transaction)序列,該序列將由用戶在與系統(tǒng)對話中執(zhí)行。因此,每個usecase就是一個使用系統(tǒng)的方式。當(dāng)用戶給定一個輸入,就執(zhí)行一個usecase的實例,并且引發(fā)執(zhí)行屬于該usecase的一個事務(wù)?;谶@種系統(tǒng)視圖,Jacobson將usecase模型與其他五種系統(tǒng)模型關(guān)聯(lián)。領(lǐng)域?qū)ο竽P停簎secase模型根據(jù)領(lǐng)域來表示。分析模型:usecase模型通過分析來構(gòu)造。設(shè)計模型:usecase模型通過設(shè)計來具體化。實現(xiàn)模型:該模型依據(jù)具體化的設(shè)計,實現(xiàn)usecase模型。測試模型:用來測試具體化的usecase模型。977.5面向?qū)ο蟮某绦蛟O(shè)計語言(OOPL)“實現(xiàn)”在某種意義上可以看做是設(shè)計過程的延伸。由于許多困難的決策已經(jīng)在設(shè)計階段解決,“實現(xiàn)”應(yīng)該是一個相對直接和機械的過程。從某種意義上說,傳統(tǒng)的程序設(shè)計語言與數(shù)據(jù)庫語言都能作為面向?qū)ο筌浖_發(fā)的實現(xiàn)語言。由于面向?qū)ο蟮某绦蛟O(shè)計語言與面向?qū)ο蟮臄?shù)據(jù)庫語言直接支持面向?qū)ο蟮母拍?,因此采用面向?qū)ο笳Z言和面向?qū)ο髷?shù)據(jù)庫作為面向?qū)ο筌浖_發(fā)的實現(xiàn)工具,無疑是最自然、最合適的選擇。在應(yīng)用開發(fā)中,用戶界面是大多數(shù)應(yīng)用的重要部分,戰(zhàn)友有很大一部分工作量。面向?qū)ο蟮挠脩艚缑娌粌H為用戶提供方便,用戶僅憑直覺和常識揄就能夠操作應(yīng)用,而且高級的面向?qū)ο笥脩艚缑骈_發(fā)工具,大大減輕了應(yīng)用開發(fā)人員的負(fù)擔(dān)。應(yīng)用開發(fā)人員可在專門的類庫中找到界面系統(tǒng)中重要組成部分的抽象描述,并且直接使用這些預(yù)制的成分或通過創(chuàng)建子類,開發(fā)滿足其特殊需要的組件。987.5.1面向?qū)ο蟪绦蛟O(shè)計語言及其演變歷史程序設(shè)計語言的發(fā)展經(jīng)歷了好幾個階段。20世紀(jì)40年代,由于硬件資源昂貴,除了計算之外的工作都被看做一種浪費,人們基本上無暇顧及程序設(shè)計語言。50年代,第一代程序設(shè)計語言提出了許多有價值的概念,如算術(shù)表達(dá)式、語句、數(shù)組、表、堆棧等。這一時期硬件的大幅度降價以及性能的提高,加上FORTRAN等高級程序設(shè)計語言研制成功,撥開了圍繞在高級語言價值問題周圍的疑云。50年代末、60年代初,出現(xiàn)許多至今仍廣泛使用的語言,如Algol60,Cobol61,Lisp等。這個時期一般被認(rèn)為是程序設(shè)計發(fā)展的第二代。60年代中、后期,以PL/1和Algol68為代表的第三代語言試圖用統(tǒng)一的語言替代各種第二代語言。由于目標(biāo)太大和當(dāng)時的條件限制,總的來說是失敗的。70年代,程序設(shè)計語言的研究則是對語言設(shè)計目標(biāo)的重新評估。特別是60年代末的軟件危機,改變了語言的設(shè)計目標(biāo)。語言設(shè)計的目標(biāo)從表示能力轉(zhuǎn)移到程序結(jié)構(gòu)。在微觀上,結(jié)構(gòu)化的while循環(huán)替代了goto,結(jié)構(gòu)化的程序設(shè)計成為一個時髦的名詞。在宏觀上則強調(diào)程序的模塊化,先是通過函數(shù)和過程,后是采用對象和抽象。80年代,對語言的研究不再停留在對單個語言的研究之上,開始研究由一類語言組成的語言范疇:如Pascal等基于對象的范疇;并發(fā),分布式范疇;函數(shù)型程序設(shè)計語言范疇;邏輯程序設(shè)計語言范疇和數(shù)據(jù)庫語言范疇。今天說的面向?qū)ο蟮某绦蛟O(shè)計語言則屬于基于對象的語言范疇。PeterWegner將基于對象語言范疇進一步劃分為基于對象的、基于類的和面向?qū)ο蟮摹;趯ο蟮恼Z言中,對象是“一類值”的表示,即可以對它賦值,作為參數(shù)傳遞和作為一個結(jié)構(gòu)的成分,但不支持類的概念。基于類的語言要求任何對象都從屬于某個類,但不支持類的繼承。面向?qū)ο蟮恼Z言則必須支持類的繼承關(guān)系。目前,面向?qū)ο笳Z言的普及主要歸功于對C和Pascal這兩個流行語言面向?qū)ο蟮臄U充。C++的普及不僅在于C語言的普及,而且在于其良好的性能。C++代碼性能幾乎可與C編譯器產(chǎn)生的代碼的性能媲美。997.5.2面向?qū)ο笳Z言的特征
面向?qū)ο蟮恼Z言盡管都支持諸葛亮如對象與繼承等核心的面向?qū)ο蟮母拍?,但它們在程度與方法上存在著差異,并且大多數(shù)語言還不同程度地支持其他一些重要的語言特征,即一些與面向?qū)ο竺芮邢嚓P(guān)的概念與機制。這些重要的語言特征往往是選擇合適的實現(xiàn)語言的關(guān)鍵。如果設(shè)計中選擇了多重繼承,最好選擇一個能夠很好地支持多重繼承的面向?qū)ο蟮恼Z言。解釋型的語言適合快速原型,但不能很好地滿足嚴(yán)格的時間需求。提供豐富類庫的語言會減輕實現(xiàn)工作的負(fù)擔(dān)。如果需要額外的編譯時的錯誤檢查,則最好使用一個強類型語言。如果內(nèi)存的使用在應(yīng)用中至關(guān)重要,可以選擇一個提供自動廢料收集的語言。如果應(yīng)用要求多用戶共享持久數(shù)據(jù),可以使用一個面向?qū)ο蟮臄?shù)據(jù)庫系統(tǒng)。下面就各種面向?qū)ο笳Z言的特征做簡單的介紹。1001、多重繼承許多語言,如C++,CLOS,Biffel和DSM都支持多重繼承。若在設(shè)計中使用了多重繼承,那么選擇支持多重繼承的語言可以實現(xiàn)從設(shè)計到實現(xiàn)的直接轉(zhuǎn)換,否則必須對設(shè)計進行修改。多重繼承可能帶來屬性與方法的同名沖突。一個類可以有多個具有同名屬性和同基調(diào)方法的祖先。不同的語言在消除同名沖突時,采取不同的策略。多重繼承的一個準(zhǔn)則,是在任何情況下都應(yīng)避免這種沖突,因為依賴編譯器解決沖突會造成語義上的錯誤和混淆。1012、類庫大多數(shù)語言都提供由類屬類(genericclass)組成的類庫。實現(xiàn)者可以直接使用這些類或通過創(chuàng)建子類,滿足其特性的要求。有了類庫的支持意味著許多組件無需程序員自己重新開發(fā)。一類非常有價值的類是集合、動態(tài)數(shù)組、表、隊列、棧、詞典、樹等通用數(shù)據(jù)結(jié)構(gòu)。它們可以作為組織其他對象的框架。類庫中同樣也應(yīng)包含表達(dá)各種聯(lián)系的類。另一些有用的類是支持多種窗口系統(tǒng)的類,它們通常組織成專門的、獨立的類庫。這種專門的類庫中還包括針對字符處理的類庫。1023、效率早期的面向?qū)ο笳Z言,如Smalltalk和基于LISP語言的解釋實現(xiàn),造成面向?qū)ο笳Z言實現(xiàn)效率欠佳的名聲。事實上,目前許多編譯實現(xiàn)的語言其特性可與傳統(tǒng)的過程式語言的性能相媲美。這為面向?qū)ο蟮膶崿F(xiàn)人員提供更多的選擇余地。具有成熟類庫的語言由于在構(gòu)造類庫時,針對性能問題精心地選擇數(shù)據(jù)結(jié)構(gòu)與算法,其代碼的執(zhí)行速度往往會比非面向?qū)ο笳Z言更快。影響面賂對象語言執(zhí)行效率的一個重要方面,是動態(tài)聯(lián)編或運行方法歸結(jié)。這似乎需要在運行時檢索類繼承結(jié)構(gòu),尋找實現(xiàn)給定對象中某個方法的類。大多數(shù)面向?qū)ο笳Z言都優(yōu)化了這種檢索機制。在像C++之類的強類型語言的實現(xiàn)中,運行時的方法歸結(jié)可歸納為簡單的結(jié)構(gòu)引用,這種方法幾乎與過程調(diào)用一樣高效。在C++的實現(xiàn)中,每個類都有一個包含所有該類對象可訪問方法的結(jié)構(gòu)。在結(jié)構(gòu)中的可知位置上存放指向每個方法的指針,每個對象都存放指向其類的方法結(jié)構(gòu)的指針。運行時的方法歸結(jié)通過用方法的相對位置檢索方法結(jié)構(gòu)來完成。這種技術(shù)不能用于運行時能夠創(chuàng)建新方法的語言,因為這樣將無法靜態(tài)地確定“方法”的相對位置。另一種優(yōu)化運行時方法歸結(jié)法是為編譯器提供足夠的信息。提供信息可采取兩種方式:一種是由程序員顯式地說明哪些方法是重載的,僅對這些重載的方法執(zhí)行運行時方法歸結(jié),C++的虛函數(shù)和CLOS的類屬函數(shù)就體現(xiàn)了這種方式;另一種方法是在編譯的最后增加一個優(yōu)化過程,分析整個應(yīng)用,判定哪些方法不是重載的,并且利用這些信息來重新編譯應(yīng)用。Biffel語言的編譯就采用了后一種方式。為變量說明類型,可以幫助編譯器更精確地決定應(yīng)該對那些方法調(diào)用進行優(yōu)化。1034、內(nèi)存管理面向?qū)ο笾凶杂傻貏?chuàng)建與訪問對象,對存儲管理提出了更高的要求。大多數(shù)面向?qū)ο蟮恼Z言都從一個堆而不是主存中固定的塊或棧分配存儲空間,除非能對不再使用的對象進行回收。否則,無論存儲空間有多大,動態(tài)的存儲分配都會出現(xiàn)空間分配用完的問題?;厥兆铌P(guān)鍵的問題是如何判斷某個對象不再有用或不能再被訪問,這依賴于應(yīng)用的類型和采用的存儲體系結(jié)構(gòu)。許多能夠訪問大容量虛存的應(yīng)用可以忽略回收的問題。對于長時間運行的高度交互式的應(yīng)用,無論有多大的內(nèi)存空間,都必須考慮內(nèi)存管理的問題。有兩種內(nèi)存管理策略:一是由程序運行時系統(tǒng)自動地完成;二是由程序員顯式地書寫回收語句。一般比較傾向于使用自動的存儲管理,這樣可以減輕程序員的負(fù)擔(dān)。大多數(shù)自動的廢料收集機制的效果不盡人意,會造成運行的長時間等待。避免這一情況的方法是采用增量的廢料收集策略,但會增加平均等
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職(汽車檢測與維修技術(shù))汽車維修質(zhì)量檢驗階段測試題及答案
- 2025年大學(xué)攝影(攝影理論)試題及答案
- 2025年大學(xué)大三(護理學(xué))兒科護理綜合測試試題及答案
- 2025年中職至大學(xué)階段(工程造價類)專業(yè)技能綜合測試試題及答案
- 2025年高職旅游(旅游線路設(shè)計)試題及答案
- 2025年高職體育教育(體育教學(xué)法)試題及答案
- 2025年高職資源勘查(礦產(chǎn)普查)試題及答案
- 2025年大學(xué)第三學(xué)年(土木工程)鋼結(jié)構(gòu)設(shè)計原理試題及答案
- 稀有貴金屬高效綜合循環(huán)利用建設(shè)項目可行性研究報告模板-立項拿地
- 金融工程美國就業(yè)指南
- 2026 中考【初中道法時政熱點】
- 2025年上半年山東高速集團有限公司校園招聘(255人)筆試參考題庫附答案
- 故意傷害案件課件
- 膽管狹窄護理
- 消防操作員其他實操技能
- 2025年高考數(shù)學(xué)試題分類匯編:數(shù)列解析版
- 吉林省戶用光伏施工方案
- 工程部物業(yè)消防知識培訓(xùn)課件
- 江西省婺源縣聯(lián)考2026屆數(shù)學(xué)七年級第一學(xué)期期末學(xué)業(yè)水平測試試題含解析
- 2025至2030水蛭素產(chǎn)品行業(yè)發(fā)展研究與產(chǎn)業(yè)戰(zhàn)略規(guī)劃分析評估報告
- 非煤礦山安全員題庫及答案解析
評論
0/150
提交評論