版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第1章面向對象開發(fā)方法學習目標
理解對象的概念
了解面向對象軟件開發(fā)方法
理解面向對象的開發(fā)過程第1章面向對象開發(fā)方法本章的主要內容:面向對象方法的基本概念,及其內涵與外延。軟件開發(fā)方法的發(fā)展過程和典型的面向對象開發(fā)方法。概括性地介紹面向對象的軟件開發(fā)過程,如面向對象分析和面向對象設計等。1.1對象及對象模型對象模型是計算機科學中的一個基本概念,它不僅僅適用于程序設計語言,也適用于軟件系統的用戶界面、數據庫甚至計算機架構的設計。這種廣泛適用的原因就是,面向對象能夠幫助我們處理多種不同系統中固有的復雜性。面向對象系統分析和設計代表了一種漸進式的開發(fā)方式,它并沒有完全拋棄傳統的方法的優(yōu)點,而是建立在有效的傳統方法基礎之上的一種新方法。例如,傳統方法中的“算法分解”技術在處理復雜程度較高的系統時是有局限性的,而面向對象技術則可以更有效地幫助人們解決這一問題。1.1.1對象的基本概念1.對象和類的定義在面向對象方法中,人們曾經給出了多個不同的對象定義。這些定義的共同點是均把對象看作是一個封裝了數據和操作的實體。GradyBooch給出的對象定義如下:所謂對象(Object)就是將一組數據和與這組數據有關的操作組裝在一起所形成的一個完整的實體。對象中的數據被稱為對象的屬性,一個對象的所有屬性的值被稱為這個對象的狀態(tài)。對象的操作則被稱為對象的行為,也稱為對象的外部接口。1.1.1對象的基本概念1.對象和類的定義在特定的軟件系統中,對象表示的是軟件系統中存在的某個特定實體,它們可以有不同的類型,大多數對象通常是一種對現實世界客觀事物的計算機描述。例如,圖書管理系統中的一本圖書,一個讀者,或一次借閱記錄都可以被視為是一個對象。它們就分別表示了現實世界中一個圖書館的一本書、一個讀者和一個借閱事件。但這些對象并不等同于現實世界中的實際事物,圖書管理系統中的這些對象只描述它們在計算機系統中的狀態(tài)和行為,因此它們不過是對現實世界中對應的客觀實體的一種計算機描述而已。1.1.1對象的基本概念1.對象和類的定義一個現實的系統中,通常會有很多的對象,為了有效地管理這些對象并使之發(fā)揮作用,人們又從分類的角度出發(fā),給出了類的定義。類(class)可以被定義成具有某些相同的屬性和方法的全體對象構成的集合。這個定義將類看成是對一組具有相同屬性和方法的對象的一種抽象描述,其本質在于這些對象所具有的相同屬性和方法。因此,類也可以被定義成是一組屬性和方法構成的一個整體。目前的各種程序設計語言中,就都采用了這樣的方式來定義類。1.1.1對象的基本概念1.對象和類的定義例如圖1-1就給出讀者、圖書和借閱這三個對象的一個抽象描述。它們分別表示了三個類,當然也表示了這三個類之間的關系。圖1-1圖書管理系統中的圖書和讀者類圖1.1.1對象的基本概念1.對象和類的定義另外,從類與對象之間的關系的角度來看,類和對象顯然分別屬于兩個不同的抽象層次。與對象相比較,類處于較高的抽象層次;當然,對象則處于較低的抽象層次。為了描述二者之間的層次關系,面向對象方法使用實例的概念來描述這兩個不同的抽象之間的關系。將類看成一個對象集合時,這個集合中的任何一個對象又可以被稱為這個類的一個實例(Instance)。顯然,一個類通常會有多個實例。特殊情況下,只有一個對象的類被稱為單件類。沒有實例的類則被稱為抽象類。1.1.1對象的基本概念1.對象和類的定義從這個概念出發(fā),還可以進一步引申出實例化的概念,我們將創(chuàng)建類實例的過程稱為實例化。顯然,任何對象均需要一個實例化過程,這個過程可能簡單,也可能很復雜。實例化過程的復雜度與類結構的復雜度有關。從上述定義出發(fā),一個對象就是一個具有某種特定狀態(tài)和行為的實體。同時,結構和行為類似的對象又被定義在它們共同所屬的類中。實例和對象這兩個術語可以互換使用。對象可以表示現實世界中的各種事物,從簡單的一個數字到一個復雜的系統等均可看作是一個對象。它既可以表示具體的事物,也可以表示抽象的邏輯事物,如一本圖書、一個業(yè)務規(guī)則、一份計劃或一個事件等。1.1.1對象的基本概念1.對象和類的定義在對象模型中,如果一個對象使用了另一個對象,則將使用者稱為客戶(client)對象,稱被使用者為服務器(server)對象。對于任何一個對象來說,這個對象中可以被調用的操作集合以及這些操作的合法調用順序被稱為對象的接口(interface)或協議(agreement)。這個協議描述了對象的動作和反應的方式,構成了對象抽象的和完整的外部視圖。1.1.1對象的基本概念2對象的狀態(tài)對象的狀態(tài)(status)是指一個對象的所有屬性在某一時刻的取值或一個對象的某些屬性值所滿足的條件。顯然,任何對象的狀態(tài)都是由這個對象屬性值決定的。一般情況下,一個對象可能會有多個不同的狀態(tài)。例如,圖書管理系統中的圖書對象,就可能具有借出(Lend)、被預定(Reserve)和就緒(Ready)等幾種不同的狀態(tài)。1.1.1對象的基本概念2對象的狀態(tài)對于任何兩個對象來說,只有當它們所擁有的屬性及屬性值均完全相同時,才可以說這兩個對象的狀態(tài)完全相同,但值得注意的是,兩個狀態(tài)相同的對象不等同于它們是同一個對象。判斷兩個對象是否是相同的對象,不僅僅要看它們的屬性值,還要它們不同的存在時間和存在空間。1.1.1對象的基本概念2對象的狀態(tài)當多個對象擁有相同的屬性定義,但屬性值卻不完全相同時,我們只能說它們具有相同的表現形式,但不能說它們具有相同的狀態(tài)。當多個對象不僅屬性值不同,而且擁有屬性定義也不盡相同時,我們則說它們不僅狀態(tài)不同,并且它們的表現形式(或所屬的類)也不相同。1.1.1對象的基本概念3對象的行為軟件系統中,任何一個對象通常都不是孤立存在的,對象之間還會存在各種各樣的聯系和影響。我們將一個對象在其狀態(tài)發(fā)生某種改變或接收到某個外部消息時所進行的動作和做出反應的方式稱為對象的行為(behaviour)。換句話來說,對象的行為代表了它們的外部可見的活動。面向對象方法中,通常使用操作來描述對象的行為。一個操作(Operation)可以定義成一個對象向外部提供的某種服務,如果外部對象調用對象的某個操作,這就意味著被調用的對象將執(zhí)行這個操作中包含的動作,并相應地調整其自身的狀態(tài)。1.1.1對象的基本概念3對象的行為面向對象方法中,還可以使用消息(Message)的概念來描述對象之間的交互,并將消息傳遞作為對象之間惟一的交互方式。在面向對象語言中,通常將調用一個對象的操作稱為向這個對象發(fā)送一個消息。消息和操作是密切相關的兩個不同概念。操作描述的是對象提供的外部服務,消息描述的是兩個對象之間的一次交互。而二者之間又是密切相關的,即向一個對象發(fā)送一條消息就是調用這個對象的某個操作。因此,在一般情況下,可以不加區(qū)別地使用操作和消息這兩個術語。1.1.1對象的基本概念3對象的行為值得注意的是,消息傳遞只定義了對象行為的一個方面。另一方面,對象的行為還要受到對象自身狀態(tài)的影響。一個對象所表現出來的行為不僅取決于施加在該對象上面的操作,而且還取決于它的當前狀態(tài)。換句話說,一個對象的狀態(tài)不僅包括它的屬性和屬性值,還包含它的先前行為的累積效果。例如:自動飲料售貨機的使用方法:首先,顧客投入貨幣,然后選擇飲料,售貨機為顧客提供需要的飲料,顧客按找零按鈕,售貨機為顧客計算并返回余額。如果顧客先選擇飲料后投幣會發(fā)生什么?售貨機很可能會什么也不做,因為顧客違反了它的基本操作流程。顧客選擇飲料時售貨機只是處于等待投幣的狀態(tài),此時售貨機很有可能會忽略或屏蔽了顧客選擇飲料的操作。1.1.1對象的基本概念3對象的行為操作的這種狀態(tài)相關特性引出了操作的前置條件和后置條件這兩個重要的概念。操作的前置條件(pre-condition)是指對象執(zhí)行這個操作時所必須具有的狀態(tài)或必須滿足的條件,違反了前置條件將導致該操作不能正常執(zhí)行。同樣,操作的后置條件(post-condition)當然是指這個操作執(zhí)行完以后對象所應處的狀態(tài)或滿足的條件,違反了后置條件意味著這個人操作沒有完成應盡的責任。因此,為對象的操作建模時,清楚地描述每個操作的前置條件和后置條件無疑是十分重要的。1.1.1對象的基本概念3對象的行為下面再來討論一下,操作的分類問題。一個對象通常會有多個操作,每個操作都代表了這個對象所屬的類提供給這個對象本身的一種服務。按照操作的作用,可以將操作劃分成構造、析構、修改、選擇和遍歷等五種不同的類型。其中構造和析構是缺省操作,分別用于對象的創(chuàng)建和銷毀,后三種類型則表示三種不同類型的常見操作。修改(modify)操作是一種能夠更改一個對象本身狀態(tài)的操作;選擇(select)或只讀(readonly)是指能夠訪問一個對象的狀態(tài),但并不更改這個狀態(tài)的操作;遍歷(thrughout)則是以某種方式訪問一個對象的所有組成部分的操作。1.1.1對象的基本概念3對象的行為軟件建模時,通常應該明確標明操作的類型。程序設計語言通常提供了不同的語言機制來表示操作的這些類型。例如,C++程序語言就定義了特定的構造函數和析構函數的表示法,還提供了const關鍵字來定義選擇操作。進一步,屬性和操作之間的關系也決定了各操作之間的執(zhí)行順序,這個執(zhí)行順序則構成了對象的一種使用規(guī)則。對象建模時,同樣也需要清楚地認識和描述這個規(guī)則??梢哉f,系統中任何對象都定義或封裝了它自己的狀態(tài),系統所有的狀態(tài)都是由其對象所封裝的。但對象的狀態(tài)只是問題的一個方面,我們還必須要考慮對象的行為以及狀態(tài)和行為之間的相互影響。1.1.1對象的基本概念4角色和責任對于任何一個對象來說,它必然要承擔部分系統責任,責任(duty)表示了對象的一種目標以及它在系統中的位置。一個對象必須為它所承擔的系統責任提供全部服務。當一個對象承擔了較多的系統責任時,就可能需要提供多組不同的方法以履行這些責任。此時,按照責任對對象的這些方法進行分組就顯得非常有意義了。這些分組劃分了對象的行為空間,也描述了一個對象可能承擔的多種系統責任。如果將對象承擔的不同的系統責任抽象成不同的角色(Role),那么,我們就得到了一個新的概念。這個概念定義了對象與它的客戶之間的契約的一種抽象。1.1.1對象的基本概念4角色和責任事實上,大多數對象都有可能承擔了多種不同的系統責任,或者說充當了多種不同的系統角色。此時,一個對象所扮演的角色即是動態(tài)的,同時也是互斥的。總之,一個對象的狀態(tài)和行為共同決定了這個對象可以扮演的角色,這些角色又決定了這個對象它所承擔的系統責任。也就是說,角色代表了對對象的責任的一種抽象。1.1.1對象的基本概念5對象標識符在面向對象系統中,一個對象通常對應了現實世界的某個特定的物理或邏輯實體?,F實世界中,不同的實體之間顯然應該存在不同的區(qū)別。為了區(qū)別不同的對象,任何一個對象均需要擁有一個對象標識符。面向對象方法中,并沒有明確規(guī)定對象標識符的表示方法,但實際的軟件系統中,對象標識符又是一個必須關注和實現的概念??梢允褂枚喾N方法實現對象標識符,如為對象定義的一個屬性、使用的程序設計語言表示的變量名等。1.1.1對象的基本概念5對象標識符例如,可以將對象標識符定義為對象的一個內部屬性,這個內部屬性不一定具有問題域方面的含義,其主要作用在于將當前對象與其它對象區(qū)別開來。例如,學生的學號、社會保險號碼或居民身份證號等。在應用程序中,可以使用對象的變量名作為對象標識符,用來區(qū)分不同的對象,這實際上是把尋址方法作為對象標識符。在數據庫系統中,還可以使用“主鍵”作為對象標識符,來區(qū)分不同的數據實體(持久對象),這實際上是將對象的某個(或某性)屬性作為標識符,這種表示方法具有一定的業(yè)務邏輯方面的意義。1.1.1對象的基本概念5對象標識符總之,對象標識符僅僅作為面向對象方法中的一個概念,通常并不代表程序設計語言中的“標識符”意義或數據庫中“主鍵”意義上的標識符。面向對象系統中,如果不能夠正確區(qū)分對象的名稱和對象本身,這將會導致面向對象程序設計中的許多錯誤。每個對象都需要有一個惟一的標識符,對象標識符在其整個生命周期中都將被保持的,即使它的狀態(tài)發(fā)生了某種改變時也是如此。1.1.2對象模型的構成要素對象模型是面向對象方法的邏輯基礎。從概念上來說,對象模型包括抽象、封裝、模塊化、層次結構、類型、并發(fā)和持久等七個基本構成要素,其中抽象、封裝、模塊化、層次結構為主要要素,類型、并發(fā)和持久為次要要素。其中主要要素是指模型必須包含的要素,缺少任何一個主要要素,這個模型都不再被稱為是面向對象的模型。次要要素是指這些要素是對象模型的有用組成部分,但不是本質要素。1.1.2對象模型的構成要素正確地理解這個概念框架,對于使用面向對象方法開發(fā)應用系統具有非常重要的理論意義和現實意義。反之,即使使用了面向對象程序設計語言,但編寫出來的程序可能仍然不具備面向對象的特征,很可能與傳統的結構化應用程序沒有太大區(qū)別。更重要的是,使用面向對象技術的主要目的是為了更好地把握問題的復雜性。1.1.2對象模型的構成要素1抽象抽象(abstract)是人們分析復雜事物是常用的最基本的思維方式,也是人正確認識客觀事物,解決問題的重要方法。抽象也可以看成是對客觀事物的一種簡單的概述性描述,通常僅關注客觀事物的重要細節(jié),而忽略事物的非本質特征的細節(jié)或枝節(jié)。對于一個概念,只有當它可以獨立于最終使用和實現它的機制來描述、理解和分析時,我們才說這個概念是抽象的。1.1.2對象模型的構成要素1抽象例如,數據結構中,線性表對具有線性關系的數據集合及其處理的一個抽象描述。這個概念抓住了數據元素之間的線性關系及其處理算法等這一本質特征,而忽略了其元素的數據類型、存儲結構和算法的實現等具體特征。這個抽象使我們可以抓住問題的本質特征而忽略問題具體的細枝末節(jié),從而是我們可以在更高的層次上討論要解決的問題。也可以說,抽象是對客觀事物所具有的基本特征的概念性描述,通過抽象可以將一種事物與其它事物嚴格區(qū)分開來。抽象也是一種分析問題和解決問題的基本方法,1.1.2對象模型的構成要素1抽象面向對象方法中,對象、屬性、方法、類、責任、職責和接口等都是運用抽象思維得出的抽象概念,正是這些概念構成了面向對象方法的基本詞匯。面向對象方法要求建模人員能夠正確地運用抽象這一基本的思維方式,正確認識問題域中所面臨的問題及其解決方法。從給定問題域中分析出一組正確的抽象,則是面向對象分析與設計的核心問題。1.1.2對象模型的構成要素1抽象面向對象分析的實質,就是從問題域中抽象出對實現系統目標有意義的對象。這些對象可能包括問題域中的實體對象、通用操作對象、業(yè)務邏輯對象、偶然對象等,因此,面向對象分析的過程的實質就是一系列的抽象過程。作為一種最基本的思維方式,抽象的運用范圍不僅僅在于發(fā)現對象,而是更廣泛地存在于軟件開發(fā)過程中所涉及到的每個不同的領域。1.1.2對象模型的構成要素2封裝確定了一個對象的屬性和行為,僅僅給出了這個對象在某種意義上的一個抽象,還需要進一步給出其具體實現。一個對象通??梢杂枚喾N方式實現,對于對象的客戶來說,選擇什么樣的實現方式并不重要,對象只要提供對外的契約就可以了。換句話說,對象的抽象應該優(yōu)先于它的實現。而實現則應該僅作為這種抽象后面的私有信息并對絕大多數客戶隱藏。1.1.2對象模型的構成要素2封裝所謂的封裝(encapsulation)是指:在構造對象的結構和行為的過程中,需要明確地定義對象的外部可見部分和不可見的部分,這可以使對象的接口部分和實現部分相分離,從而降低對象與其客戶之間的耦合。例如,在C++程序設計語言中,類中的屬性和方法的可見性(公共、私有和保護)實際上就是封裝的一種實現機制。1.1.2對象模型的構成要素2封裝抽象和封裝是兩個互補的概念,抽象通常描述的是對象的外部可見行為,而封裝關注的則是這些外部行為的實現。封裝一般通過信息隱藏加以實現,信息隱藏是將那些不涉及對象本質特征的秘密都隱藏起來的過程。1.1.2對象模型的構成要素2封裝通常情況下,一個對象的結構是對外不可見(隱藏)的,其方法的實現也是外部不可見(隱藏)的,只有其外部行為是外部可見的。抽象描述的是對象能夠做什么,而封裝則是為了使程序可以借助最少的工作進行可靠地修改。1.1.2對象模型的構成要素2封裝例如,在設計數據庫應用程序時,通常不需要關心數據在數據庫中的物理表示,而是僅對數據的邏輯結構進行編程。這確保了數據庫數據的物理獨立性。在實踐中,每個類必須有接口和實現兩個部分。類的接口描述了它的外部視圖,包含了這個類所有實例的共同行為的抽象。類的實現包括抽象的表示以及實現期望的行為的機制。通過類的接口,我們能知道客戶可以對這個類的所有實例做出哪些假定。實現封裝了細節(jié),客戶不能對這些細節(jié)做出任何假定。1.1.2對象模型的構成要素2封裝信息隱藏的另一個相關的問題是,隱藏還具有層次性。即在一個抽象層次被隱藏起來的東西,在另一個抽象層次里可能代表了外部視圖,此時,對象的內部表示就可能被暴露出來。1.1.2對象模型的構成要素2封裝例如,在C++程序設計語言中,類屬性和方法的可見性分為公共、私有和保護等三種,事實上,C++還通過友元機制為友元類實例提供了一種更寬泛的接口。這使得C++定義了公共、私有、保護和友元等多個層次的封裝性。大多數情況下,隱藏層次的劃分雖然為對象的設計提供了比較充分的支持,但同時也會為設計帶來額外的復雜性。所以,封裝層次的運用并不保證設計出高質量的軟件系統。1.1.2對象模型的構成要素3模塊化模塊化可以被看成是系統的一種屬性,這個屬性使得系統可以被分解成一組高內聚和低耦合的模塊。模塊化過程中,抽象、封裝和模塊化的原則是相輔相承的。一個對象圍繞單一的抽象提供了一個明確的邊界,封裝和模塊化都圍繞這種抽象提供了屏障。1.1.2對象模型的構成要素3模塊化結構化方法中,模塊化主要是按照高內聚低耦合的設計原則對程序進行分組。而在面向對象方法中,模塊化的任務通常演變成了對類和對象通過打包(package)的方式來進行分組,此時每一個包可以被定義成若干個類(或對象)構成的集合,而且包里面還可以包含其它的包,這與結構化設計的模塊化有著明顯的不同。1.1.2對象模型的構成要素3模塊化從分支策略的角度來看,將一個程序劃分成若干個不同的模塊可以在一定程度上降低程序的復雜性。但更重要的是,模塊劃分可以在程序內部定義出一些結構良好的、具有清晰定義的模塊邊界。這些模塊邊界(或接口)對于理解程序是非常有價值的。1.1.2對象模型的構成要素3模塊化模塊化的設計原則通常包括:為降低軟件的開發(fā)和維護成本,每個模塊必須可以被獨立地進行設計和修改;每個模塊的結構都應該足夠簡單,使它更容易理解;可以在不知道其它模塊的實現細節(jié)和不影響其它模塊行為的情況下,修改某個模塊的實現;修改設計的容易程度應該能夠滿足可能的需求變更。1.1.2對象模型的構成要素3模塊化模塊化最重要的一點是:發(fā)現正確的類和對象,然后將它們放到不同的模塊中,這是最基本的設計決策。類和對象的確定是系統邏輯結構設計的一部分,而模塊的劃分和確定則是系統物理結構設計的組成部分。我們不可能在物理設計開始之前完成所有邏輯設計,反之亦然。1.1.2對象模型的構成要素4層次結構任何一個面向對象的系統都包含了類結構(繼承)和對象結構(組成)這兩種基本的層次結構,類繼承描述類之間的繼承關系,對象組成則描述對象組成意義上的結構關系。1)類結構類結構是指系統的所有類和這些類之間的關系。類之間的關系中最重要的關系就是繼承(Inheritance)關系。對于兩個類A和B,如果類A擁有類B的所有屬性和行為,則稱類A和類B之間存在繼承關系。此時,稱類A是類B的派生類,類B是類A的基類。1.1.2對象模型的構成要素4層次結構從語義上說,繼承實際上表明了“是一種”的關系。例如,汽車“是一種”交通工具,快速排序“是一種”排序算法。繼承因此實現類之間的一種“一般/具體”的層次結構,其中子類將超類的一般結構和行為具體化。從繼承關系出發(fā),當多個類之間具有比較復雜的繼承關系時,這些繼承關系將使系統構成了一種層次結構,在這個層次結構中,一個子類將繼承其超類的所有屬性和方法,同時子類也可以擴展或重新定義超類中的結構和行為。1.1.2對象模型的構成要素4層次結構使用繼承關系建模一個系統時,可以將多個不同的類中的相同屬性和方法遷移到它們共同的基類(或超類)中,從而減少這些屬性和方法的冗余,并且減少這些類之間的耦合,這也是面向對象方法關注繼承關系的一個重要原因。在這個層次關系中,層次高的類代表了較高層次的抽象,低層次的則代表了較為低層次的抽象,同時,低層次類中也可以添加新的屬性和方法,也可以修改甚至隱藏繼承自高層次的類的屬性和方法。1.1.2對象模型的構成要素4層次結構通過這種方式,繼承可以使得模型(甚至是程序)的描述方式更為經濟。一個類通常把其內部分成對外部開放和隱藏的兩個部分,開放的部分用接口描述,內部屬性和狀態(tài)則是隱藏的。但繼承則要求重新定義一個用于繼承的接口,從而允許派生類來訪問、修改或隱藏其某些狀態(tài)和方法。1.1.2對象模型的構成要素4層次結構繼承機制為類引進了子類這樣一種新的客戶類類型,但也增加了類封裝問題的復雜度。程序設計語言中定義的保護可見性就是一種專門為其子類提供的一種接口。這樣既支持了繼承,又在最大限度地保護了類的封裝性,同時也支持了不同層次的類之間的多態(tài)。1.1.2對象模型的構成要素4層次結構2)多繼承(MultiInheritance)層次結構中的另一個問題是所謂的多繼承(MultiInheritance)問題,即一個類擁有多個基類(或超類)。在很多情況下,多繼承是有意義的。例如,如圖1-2描述了一個多繼承的設計。其中水陸兩棲汽車同時繼承了汽車和輪船這兩個類,水陸兩棲汽車還同時還重復地繼承了交通工具類的屬性和方法。1.1.2對象模型的構成要素4層次結構圖1-2多繼承實例1.1.2對象模型的構成要素4層次結構多繼承引入了一定的復雜性,即需要關注這些類中的名字沖突和重復繼承等問題。(1)名字沖突當多個超類含有相同名字的屬性或操作時,在它們共同的派生類中,就會發(fā)生名字沖突的情況。例如,當汽車和輪船這兩個類具有相同的屬性名或方法名時,在水路兩棲汽車類中,就會繼承了兩個同名的屬性和方法。這會給水路兩棲汽車類帶來額外的設計負擔。1.1.2對象模型的構成要素4層次結構(2)重復繼承當多個同層次的類具有共同的超類時,它們的共同子類就會發(fā)生重復繼承的情況。又例如汽車和輪船這兩個類就具有共同的超類交通工具,這兩個類繼承了交通工具類的屬性和方法。當水路兩棲汽車類同時繼承了汽車和輪船這兩個類時,它就可能重復地繼承了來自交通工具類的屬性和方法。1.1.2對象模型的構成要素4層次結構目前,大多數程序設計語言(如java,C#等)都不支持多繼承,對于不支持多繼承的語言,可以將多繼承結構調整成一個超類加上與其它類的聚合的形式。支持多繼承的程序設計語言(如C++),則提供了相應的語言機制來解決上述兩個問題,但這增加了程序設計方面的負擔。具體的設計決策則由程序員來決定是否使用以及如何使用多繼承。1.1.2對象模型的構成要素4層次結構目前,大多數程序設計語言(如java,C#等)都不支持多繼承,對于不支持多繼承的語言,可以將多繼承結構調整成一個超類加上與其它類的聚合的形式。支持多繼承的程序設計語言(如C++),則提供了相應的語言機制來解決上述兩個問題,但這增加了程序設計方面的負擔。具體的設計決策則由程序員來決定是否使用以及如何使用多繼承。1.1.2對象模型的構成要素3)對象的層次結構聚合(Aggregation)關系描述的是對象之間的層次關系,當一個對象是由另外一些對象組合而成時,則稱整體對象是一個聚合對象。也稱整體對象與部分對象之間的關系是一種聚合關系。當部分對象與整體對象具有相同的生命周期時,又可以稱這個聚合關系為組合關系。將繼承和聚合結合在一起可以構成具有強大功能的結構,聚合允許對邏輯結構進行物理分組,而繼承允許這些共同的部分在不同的抽象中被復用。1.1.2對象模型的構成要素5類型類型的概念源于程序設計語言中的數據類型,其主要強調的數據的表示方法、取值范圍、允許進行的計算以及一個特定的標識符。將類型與類的概念相比較,二者具有較強的相似性,類型中的數據表示方法與類的屬性定義、類型的計算與類的操作、類型標識符與類名等都有很強的相似性。但類型的概念更基本,并且類型的適用范圍顯然更為寬泛。1.1.2對象模型的構成要素5類型面向對象方法仍然把類型視為對象模型中的一個獨立要素,即類型被看作是面向對象領域中某些結構成分(如屬性、方法的形式參數和返回值等)的一種抽象描述。面向對象方法中,類型是關于某種結構成分的強制規(guī)定,不同類型的結構成分一般不能夠互換使用,或者至少它們的互換使用應該受到某種非常嚴格的限制。1.1.2對象模型的構成要素5類型類型可以分為靜態(tài)類型和動態(tài)類型兩種類型。靜態(tài)類型是指所有變量和表達式的類型在編譯時就確定下來的數據類型。而動態(tài)類型(遲后綁定)是指變量和表達式的類型直到運行時刻才能夠確定下來的數據類型。也可以將靜態(tài)類型稱為強類型,將動態(tài)類型視為弱類型。1.1.2對象模型的構成要素5類型另外,多態(tài)(polymorphism)也是動態(tài)類型和繼承互相作用時所表現出來的一種情形。多態(tài)代表了類型理論中的一個概念,即一個名字(或變量)可以代表許多個不同類型的對象,這些類具有某個共同的超類。因此這個對象可以響應一組共同的操作。多態(tài)可能是面向對象語言中除了對抽象的支持以外最強大的功能,也正是它,區(qū)分了面向對象編程和傳統的抽象數據類型編程。1.1.2對象模型的構成要素6并發(fā)并行系統中,通常要考慮程序并行或并發(fā)執(zhí)行方面的問題。進程是指一個程序的一次可并發(fā)的執(zhí)行活動,進程通常是由操作系統獨立地進行管理的,每個進程都有獨立的地址空間。進程之間可以進行通訊,進程控制機制通常是由操作系統提供的,所以進程的通信開銷比較大,涉及到進程間通信技術。而線程則是某種輕量級的進程,線程一般共處于同一進程空間之內,它們共享同樣的地址空間和資源,這使得線程之間的通訊開銷較小,但需要解決共享數據資源的并發(fā)控制問題。1.1.2對象模型的構成要素6并發(fā)設計一個含有多線程特性的大型軟件會有更多的困難,因為設計者必須考慮并發(fā)控制方面的問題,即系統的死鎖、饑餓、互斥和競爭條件等問題。在面向對象系統中,可以將并發(fā)和并發(fā)控制(進程或線程)封裝在可復用的抽象中,以減輕程序員在并發(fā)問題上的負擔。從并發(fā)的角度出發(fā),我們可以給出主動對象和被動對象的概念,我們把封裝了某個并發(fā)的進程或線程的對象稱為主動對象,否則稱為被動對象。1.1.2對象模型的構成要素6并發(fā)一般來說,在面向對象的設計中,共有三種并發(fā)方式。(1)并發(fā)程序設計語言這種情況下,并發(fā)是程序設計語言的內在特征,該種語言本身就提供了并發(fā)和同步控制機制??梢灾苯觿?chuàng)建一個主動對象,它與其它主動對象一起并發(fā)執(zhí)行某些處理過程。1.1.2對象模型的構成要素6并發(fā)(2)軟件開發(fā)環(huán)境目前,大多數軟件開發(fā)環(huán)境均以提供類庫的方式支持并發(fā)程序設計。當然,這種類庫通常是平臺相關的,也可能是不可移植的。在這種方式下,并發(fā)并不是語言的內在特征,但提供的這些標準類,使得并發(fā)看起來似乎是對象的內在的特征。其并發(fā)的本質在于軟件的運行環(huán)境對并發(fā)的支持。1.1.2對象模型的構成要素6并發(fā)(3)中斷機制最后一種方式,是利用中斷機制來實現并發(fā)。當然,這種方法是一種最古老的并發(fā)方式,使用中斷機制,不僅要求程序員具有某些底層硬件細節(jié)方面的知識,同時還要考慮軟件環(huán)境是否支持這樣的方式。1.1.2對象模型的構成要素6并發(fā)不論如何實現并發(fā),當在一個系統中引入并發(fā)時,必須考慮主動對象之間活動的同步。例如,如果兩個主動對象試圖同時給第三個對象發(fā)送消息,則必須確保使用了某種互斥手段,這樣,被調用對象的狀態(tài)才不會因為兩個主動對象的同時訪問而被破壞。這是使用并發(fā)時必須注意的要點。在并發(fā)的情況下,僅定義對象的方法是不夠的,還必須確保這些方法的語義在多個控制線程的情況下仍然有效。1.1.2對象模型的構成要素7持久性軟件中的一個對象通常會占用一定量的存儲空間,并在一定的時間內存在。一個對象從建立到消亡的時間間隔稱為對象的生命周期(lifetime)。1.1.2對象模型的構成要素7持久性按照對象在軟件中的生命周期可以把對象分為如下幾種類型:1)瞬時對象,只在某個時刻存在的對象,如表達式計算使用的臨時對象。2)過程對象,僅存在于某個過程的局部對象。這個過程開始時,對象被創(chuàng)建,這個過程結束時,這些對象被自動銷毀。如某個過程的局部變量;1.1.2對象模型的構成要素7持久性3)全局對象,在軟件運行期間全局存在的對象,如軟件中的全局變量、堆中的值,它們的存在性和可見性可能會有所不同:4)持久對象,存在性與軟件的運行狀態(tài)無關的對象。這類對象通常需要數據文件或數據庫技術的支持,當軟件處在運行狀態(tài)時,這些對象會根據需要被調入內存并參與系統的運行,在程序運行結束后,這些對象的屬性數據將被保存在數據文件或數據庫中。我們將實現對象在數據文件或數據庫與內存之間轉換的技術稱為對象的序列化或持久化。1.1.2對象模型的構成要素7持久性除了上述四種類型的對象之外,某些商業(yè)軟件還需要處理存在與不同版本的軟件之間的數據的兼容性問題,如MicrosoftOfficeWord軟件的版本兼容問題。此時,對象還存在不同版本之間的轉換問題。傳統編程語言通常只關注前三種類型的對象存在性問題,持久對象通常會涉及數據文件處理技術或數據庫技術。某些面向對象編程語言提供了對持久化技術的直接支持,如Java提供的EnterpriseJavaBeans(EJB)和JavaDataObject(JDO)。1.1.2對象模型的構成要素7持久性將對象序列化到數據文件只是序列化技術中比較初級的解決方案,因為這種技術不適合處理大量對象的情況。更常用的持久化技術是對象到數據庫中的映射。本書將在第九章詳細討論對象與關系數據庫的映射(OR映射)問題。另外,持久性問題要解決的不僅僅是對象的生命周期問題。在實際應用中,這些持久對象還有可能會跨越不同的空間(應用)而存在。這種情況下,不同的應用都會以不同的方式來解釋和處理持久對象。當這些跨越不同應用空間的持久對象被存儲在數據庫中時,顯然會增加保持數據完整性的難度。1.1.2對象模型的構成要素7持久性例如,一個WORD文檔可以看成是由一組WORD文檔對象的屬性數據組成的集合,這些數據它也可以被WORD軟件使用,但某些其它軟件(如WPS軟件)也可以處理這個文檔的數據,并且至少這些軟件處理這些數據的方式是一樣的,這些數據在不同的應用中的語義是相通的。但不同軟件中定義的封裝這些文檔對象數據的類卻不太可能會完全相同,至少這些類的方法不會完全相同。這個例子說明了持久對象的持久性還包含了空間方面的屬性。1.1.2對象模型的構成要素7持久性對于分布式系統來說,有時候還必須考慮跨越空間的對象轉換問題。例如在分布式系統中,對象從一個結點遷移到另一個結點時,它們在不同結點中甚至會有非常不同的狀態(tài)和行為。綜上所述,我們可以給出如下的持久性的定義。持久是對象本身所具有的一種特性,通過這種特性,對象可以跨越時間和空間而存在。本小節(jié)詳細討論了對象模型的各個構成要素,所有這些要素共同構成了完整的面向對象的核心概念。1.1.3對象模型的主要優(yōu)點從模型的構成要素上來看,對象模型與傳統的結構化方法所使用的模型有著很大的不同,其重要區(qū)別在于對象模型引進了對象等相關概念。但并不是說對象模型完全放棄了傳統模型中好的原則和經驗。相反,對象模型只是在原有模型的基礎上引入了一些新的元素和思想。因此,對象模型提供了一些其它模型沒有提供的重要優(yōu)點。最重要的是,使用對象模型可以構建出具有一些更好結構特性的復雜系統。1.1.3對象模型的主要優(yōu)點1.提高編程能力正確地理解對象模型有助于提高使用面向對象程序設計語言描述系統的能力,編寫面向對象程序的過程實質上也是一個使用面向對象語言描述系統結構和行為的過程。正確理解對象模型的概念框架,對編程能力的提高將具有十分重要的基礎作用。雖然,在編寫程序的過程中,人們關注得更多的往往是語言的語法方面的細節(jié)。但更抽象一層的知識和概念將為編程提供方向性的指導。經驗表明,如果不能正確地理解對象模型中的這些抽象的要素,那么程序設計語言中的很多表現力很強的功能就有可能被忽略或者被錯誤地使用了。1.1.3對象模型的主要優(yōu)點2.支持軟件復用所謂軟件復用(SoftwareReuse),是指將已有軟件的各種相關知識用于建立新的軟件,以縮減在軟件開發(fā)和維護方面的花費。顯然,軟件復用是提高軟件生產力和質量的一種重要技術手段。早期的軟件復用主要是指代碼級的復用,被復用的知識專指部分程序代碼,后來軟件復用被擴展到領域知識、開發(fā)經驗、設計決策、體系結構、需求分析、軟件設計、程序代碼和軟件文檔等一切與軟件開發(fā)有關的各個方面。1.1.3對象模型的主要優(yōu)點2.支持軟件復用面向對象方法不僅可以有效地支持軟件復用,而且甚至可以支持設計和分析的復用,這導致了可復用的應用程序框架的產生。例如,MicrosoftVisualC++提供的應用程序框架技術,為開發(fā)人員提供了一個完整的可運行的應用程序。程序員只要擴充這個程序框架就可以獲得他想要的完整應用。而這個程序框架本身就是一個可復用的軟件。1.1.3對象模型的主要優(yōu)點2.支持軟件復用人們發(fā)現,面向對象系統的實現通常要比等價的非面向對象實現的規(guī)模更小。這不僅意味著系統的代碼量更小,而且軟件的可復用度的提高也會反映到成本和開發(fā)進度上。但另一方面,并不是說面向對象的設計就一定就是可復用的設計,如果復用不是項目的主要目標,那么就不太可能實現復用。最后,可復用的設計可能要求在初次實現時的花費更多。但積極的一面是,初次開發(fā)付出的高成本將在組件的后續(xù)復用中獲得補償。1.1.3對象模型的主要優(yōu)點2.支持軟件復用再次,使用對象模型可以獲得更具有可維護性的系統,這樣的系統將更適合修改和擴充。也就是說,面向對象系統可以隨時間而進化,而不是經歷一次較大的需求變更就放棄原來的系統或者完全重新設計。1.2面向對象的軟件開發(fā)從計算機誕生之日開始,軟件開發(fā)就成為計算機應用和研究的一個十分重要的課題。軟件開發(fā)方式和開發(fā)方法也經歷了翻天覆地的其巨大變化。開發(fā)方式經歷了個體工作方式、軟件作坊方式和團隊開發(fā)方式等三種基本方式的演化。開發(fā)方法則經歷了從早期的程序設計、結構化方法和目前的面向對象方法這樣一個基本的歷程。這些方法從不同的角度出發(fā),各自提出了不盡相同的開發(fā)步驟和方法,這些不同的方法基本上都有效地解決了當時在軟件開發(fā)過程中所面臨的各種問題,但隨著時間的發(fā)展,也都組件暴露出它們各自的局限性?,F在的人們通常將軟件開發(fā)方法歸結成結構化和面向對象兩個大類,它們分別基于結構化和面向對象的程序設計方法。習慣上,人們通常將面向對象方法之前的方法統稱為結構化方法或傳統的軟件開發(fā)方法。1.2.1典型的結構化開發(fā)方法在結構化開發(fā)方法的發(fā)展過程中,人們提出過很多種開發(fā)方法。典型的結構化方法包括Parnas方法、SASD方法、Jackson方法、Warnier方法和PAM方法等。這些方法不僅解決了當時面臨的問題,同時他們也提出了很多有深遠意義的思想、概念和基本方法。這些思想、概念和基本的方法也已經成為軟件開發(fā)方法發(fā)展的重要基石。1.2.1典型的結構化開發(fā)方法1.Parnas方法Parnas方法是D.Parnas在1972年提出的一種軟件開發(fā)方法。其主要目的是解決軟件的可維護性和可靠性問題。在該方法中,Parnas提出了著名的信息隱蔽原則,目前這個原則已經成為現代軟件工程學中的一個非常重要的軟件設計原則。1.2.1典型的結構化開發(fā)方法1.Parnas方法信息隱藏(InformationHiding)原則的內容是:代碼模塊應該采用定義良好的接口來封裝,這些模塊的內部結構應該是私有的,外部是不可見的。設計時可以列出將來可能發(fā)生變化的因素,并在模塊劃分時將這些因素放到個別模塊的內部。這樣,在將來由于這些因素變化而需修改軟件時,只需修改這些個別模塊,其它模塊不受影響。信息隱蔽技術不僅提高了軟件的可維護性,而且也避免了錯誤的蔓延,改善了軟件的可靠性。1.2.1典型的結構化開發(fā)方法1.Parnas方法Parnas提出的第二條原則是,在軟件設計時應對可能發(fā)生的各種意外(Exception)故障采取措施。軟件意外故障是指軟件在運行時發(fā)生的各種錯誤。軟件是很脆弱的,任何軟件很可能因為一個微小的錯誤而引發(fā)嚴重的事故,所以必須加強防范。模塊之間也要加強檢查,防止錯誤蔓延。1.2.1典型的結構化開發(fā)方法2.SASD方法1978年,E.Yourdon和L.L.Constantine提出了結構化方法,即SASD方法,也可稱為面向功能的軟件開發(fā)方法或面向數據流的軟件開發(fā)方法。1979年TomDeMarco對此方法作了進一步的完善。Yourdon方法是80年代使用最廣泛的軟件開發(fā)方法。它首先用結構化分析(SA)對軟件進行需求分析,然后用結構化設計(SD)方法進行總體設計,最后是結構化編程(SP)。這一方法不僅開發(fā)步驟明確,而且給出了兩類典型的軟件結構(既變換型和事務型),便于參照,提高了軟件開發(fā)的成功率。1.2.1典型的結構化開發(fā)方法3.面向數據結構的軟件開發(fā)方法(1)Jackson方法1975年,M.A.Jackson提出了一類至今仍廣泛使用的軟件開發(fā)方法。這一方法從目標系統的輸入、輸出數據結構入手,導出程序框架結構,再補充其它細節(jié),就可得到完整的程序結構圖。這一方法對輸入、輸出數據結構明確的中小型系統特別有效,如商業(yè)應用中的文件表格處理。該方法也可與其它方法結合,用于模塊的詳細設計。Jackson方法也被稱為面向數據結構的軟件設計方法。1.2.1典型的結構化開發(fā)方法(2)Warnier方法1974年,J.D.Warnier提出的軟件開發(fā)方法與Jackson方法類似。差別有三點:1)使用的圖形工具不同,分別使用Warnier圖和Jackson圖;2)使用的偽碼不同;3)在構造程序框架時,Warnier方法僅考慮輸入數據結構,而Jackson方法不僅考慮輸入數據結構,而且還考慮輸出數據的數據結構。1.2.1典型的結構化開發(fā)方法4.問題分析法PAM(ProblemAnalysisMethod)問題分析法80年代末由日立公司提出的一種軟件開發(fā)方法。PAM方法希望能兼顧Yourdon方法、Jackson方法和自底向上的軟件開發(fā)方法的優(yōu)點,而避免它們的缺陷。它的基本思想是:考慮到輸入、輸出數據結構,指導系統的分解,在系統分析指導下逐步綜合。1.2.1典型的結構化開發(fā)方法4.問題分析法PAM(ProblemAnalysisMethod)問題分析法80年代末由日立公司提出的一種軟件開發(fā)方法。PAM方法希望能兼顧Yourdon方法、Jackson方法和自底向上的軟件開發(fā)方法的優(yōu)點,而避免它們的缺陷。它的基本思想是:考慮到輸入、輸出數據結構,指導系統的分解,在系統分析指導下逐步綜合。1.2.1典型的結構化開發(fā)方法4.問題分析法這一方法的具體步驟是:從輸入、輸出數據結構導出基本處理框;分析這些處理框之間的先后關系;按先后關系逐步綜合處理框,直到畫出整個系統的PAD圖。可以看出,這一方法本質上是綜合的自底向上的方法,但在逐步綜合之前已進行了有目的的分解,這個目的就是充分考慮系統的輸入、輸出數據結構。1.2.1典型的結構化開發(fā)方法4.問題分析法PAM方法的另一個優(yōu)點是使用了PAD圖。這是一種二維樹形結構圖,是到目前為止最好的詳細設計表示方法之一,遠遠優(yōu)于NS圖和PDL語言。這一方法曾經較為流行,軟件開發(fā)的成功率也很高。但由于在輸入、輸出數據結構與整個系統之間同樣存在著鴻溝,這一方法仍只適用于中小型問題。1.2.1典型的結構化開發(fā)方法4.問題分析法這些方法的出現和應用,成功地解決了當時軟件開發(fā)面臨的諸如可靠性和可維護性等各種問題。但隨著計算機硬件技術的發(fā)展、計算機應用的普及以及計算機應用領域和規(guī)模的不斷擴大,軟件的規(guī)模和復雜性也不斷隨之擴大和增強,原有的軟件開發(fā)方法也隨之出現了不相適應的情況。隨著以Smalltalk為代表的面向對象程序設計語言的出現,面向對象方法得到了迅速的發(fā)展,而且這一方法已經成為當前軟件開發(fā)的主流方法。1.2.2面向對象方法的發(fā)展過程面向對象方法(Object-OrientedMethod)是一種把面向對象的思想應用在軟件開發(fā)過程中,并指導開發(fā)活動的系統方法。簡稱OO(Object-Oriented)方法,是一種建立在“對象”概念基礎上的方法學。所謂面向對象就是以對象概念為基礎,以對象為中心,以封裝、繼承、關聯、多態(tài)等特性為構造機制,來認識、理解和描述客觀世界,并以此為基礎構建相應的軟件系統。1.2.2面向對象方法的發(fā)展過程面向對象方法的基本出發(fā)點是盡可能按照人類認識問題和解決問題的方式方法來分析設計和實現需要的軟件系統。面向對象方法認為客觀世界是由各種事物和事物之間的聯系構成的,并將客觀世界描述為對象和對象之間的關系。面向對象方法正是以對象作為最基本的構成元素,它也是分析問題和解決問題的核心。1.2.2面向對象方法的發(fā)展過程面向對象設計技術是軟件技術的一次革命,在軟件開發(fā)史上具有重要的里程碑意義。面向對象方法的發(fā)展過程經歷了從面向對象編程、面向對象設計和面向對象分析的發(fā)展過程,最終形成了基于對象模型技術的面向對象軟件開發(fā)方法(ObjectModellingTechnique,OMT)[1]。1.2.2面向對象方法的發(fā)展過程OMT是目前公認的面向對象軟件開發(fā)方法。這是一種采用了自底向上分析和自頂向下設計相結合的策略的分析和設計方法,它以對象建模為基礎,充分考慮了輸入、輸出數據結構,實際上也包含了所有對象的數據結構。所以OMT方法徹底實現了PAM沒有完全實現的目標。1.2.2面向對象方法的發(fā)展過程不僅如此,面向對象技術在需求分析、可維護性和可靠性這三個軟件開發(fā)的關鍵環(huán)節(jié)和質量指標上有了實質性的突破,徹底地解決了在這些方面存在的嚴重問題,從而宣告了軟件危機末日的來臨。人們通常將面向對象方法的發(fā)展過程劃分為早期、發(fā)展和當前現狀等三個階段。1.2.2面向對象方法的發(fā)展過程1.早期階段面向對象方法的最早出現并得到發(fā)展的標識是面向對象程序設計語言的出現,這導致了新的面向對象程序設計方法的出現和發(fā)展。最早的面向對象語言是1967年挪威計算中心的KistenNygaard和OleJohanDahl開發(fā)的Simula67語言,該語言首次引入了類的概念和繼承機制,它是面向對象的先驅。1972年PaloAlno研究中心(PARC)發(fā)布了Smalltalk72語言,其中正式使用了“面向對象”這一術語。Smalltakl的問世標志著面向對象程序設計方法的正式形成。隨后的幾年中,PARC先后發(fā)布了Smalltalk72、76和78等多個版本,直至1981年推出該語言完善的版本Smalltalk80。Smalltalk80的問世被認為是面向對象語言發(fā)展史上最重要的里程碑事件。Smalltalk80具備了迄今為止,絕大部分面向對象的基本概念及其支持機制在。它是第一個完善的、能夠實際應用的面向對象語言[1]。1.2.2面向對象方法的發(fā)展過程2.發(fā)展階段從20世紀80年代中期到90年代,是面向對象程序設計語言走向繁榮的重要階段。其主要的表現是大批實用的面向對象程序設計語言的涌現,如C++、ObjectiveC、ObjectPascal、CLOS、Eiffel和Actor等,這使得面向對象程序設計語言的應用得到了迅速的普及。這些面向對象的編程語言又可以劃分純面向對象型語言和混合型面向對象語言?;旌闲驼Z言是在傳統的結構化程序設計語言基礎上增加了面向對象語言成分形成的,例如C++,它們既支持傳統的結構化程序設計,也支持面向對象的程序設計,其在實用性方面具有更大的靈活性。而純面向對象型語言則是所謂的純粹的面向對象語言,這種語言僅支持面向對象的程序結構。1.2.2面向對象方法的發(fā)展過程2.發(fā)展階段目前,在面向對象編程方面,大多數面向對象語言普遍采用了程序語言、類庫和可視化集成開發(fā)環(huán)境相結合的方式,如VisualC++、JBuilder和Delphi等。這極大地提高了程序設計的效率??陀^上也推動了面向對象設計和面向對象分析方法的發(fā)展,使面向對象方法擴展到整個軟件生命周期的各個階段。到20世紀90年代,面向對象的分析與設計方法已多達數十種,這些方法都各有所長。目前,統一建模語言已經成為世界性的建模語言,適用于多種開發(fā)方法。把UML作為面向對象的建模語言,不但在軟件產業(yè)界獲得了普遍支持,在學術界也具有很大的影響。在面向對象過程指導方面,雖然目前還沒有統一的規(guī)范。但也已經產生了一些具有相當大的影響力的面向對象軟件開發(fā)的過程。例如,著名的統一軟件開發(fā)過程(RUP)。1.2.2面向對象方法的發(fā)展過程3.面向對象方法的當前現狀當前,面向對象方法幾乎覆蓋了計算機軟件領域的所有分支。這些分支包括面向對象的編程語言(OOP)、面向對象分析(OOA)、面向對象設計(OOD)、面向對象測試(OOT)和面向對象維護(OOM)等軟件工程領域的分支,也包括圖形用戶界面設計(GUI)、面向對象數據庫(OODB)、面向對象的數據結構(OODS)、面向對象的智能程序設計、面向對象的軟件開發(fā)環(huán)境(OOSE)和面向對象的體系結構(OOSA)等技術領域。此外,許多新領域都以面向對象理論為基礎或主要技術,如面向對象的軟件體系結構、領域工程、智能代理、面向構件的軟件工程和面向服務的軟件開發(fā)等。1.2.3面向對象程序設計語言在面向對象方法的發(fā)展過程中,面向對象程序設計語言的出現和發(fā)展起到了十分重要的引領作用,同時語言本身也得到了不斷地發(fā)展。這些語言也不斷豐富和促進了面向對象方法的發(fā)展。1.2.3面向對象程序設計語言1.Simula語言1967年5月,挪威科學家Ole-JohanDahl和KristenNygaard正式發(fā)布了Simula67語言。之后,在1968年2月形成了Simula67的正式文本。Simula67被認為是最早的面向對象程序設計語言,它引入了對象、類和繼承等概念。這些概念構成了后來出現的所有面向對象語言都必須遵循的基礎概念,同時,這些概念也構成了面向對象方法的核心概念的重要組成部分。Simula67的面向對象概念的影響是最巨大而深遠的。它本身雖然因為比較難學、難用而未能廣泛流行,但在它的影響下所產生的面向對象技術卻迅速傳播開來,并在全世界掀起了一股面向對象技術熱潮,至今盛行不衰。面向對象程序設計在軟件開發(fā)領域引起了大的變革,極大地提高了軟件開發(fā)的效率,為解決軟件危機帶來了一線希望。1.2.3面向對象程序設計語言2.Smalltalk語言20世紀70年代到80年代前期,美國施樂公司的帕洛阿爾托研究中心(PARC)開發(fā)了Smalltalk編程語言。從Smalltalk-72、Smalltalk-78到Smalltalk-80,它們開發(fā)完成了整個Smalltalk系列,Smalltalk編程語言對近代面向對象編程語言影響很大,所以稱之為“面向對象編程之母”。1.2.3面向對象程序設計語言2.Smalltalk語言與許多其它程序設計語言的不同之處在于,Smalltalk還具有如下幾個特點。1)Smalltalk是一種全新的純面向對象的程序設計語言。它是一種包含完整語法和語義的純面向對象的語言。使用編譯器可以將Smalltalk源程序生成可以在虛擬機上運行的二進制代碼,Smalltalk語言本身非常精煉。1.2.3面向對象程序設計語言2.Smalltalk語言2)提供一個完整的程序開發(fā)環(huán)境Smalltalk附帶了一個巨大的標準類庫,這使得開發(fā)Smalltalk程序的效率非常高。甚至其它一些語言(如Ada,C和Pascal)中的部分功能(例如條件判斷,循環(huán)等)也被當成特定的Smalltalk類提供。1.2.3面向對象程序設計語言2.Smalltalk語言3)應用開發(fā)環(huán)境(ADE)由于Smalltalk的歷史原因,它具有一個非常優(yōu)秀的高度集成、開放的應用開發(fā)環(huán)境。由于開發(fā)環(huán)境中的瀏覽器、監(jiān)視器以及調試器都由同樣的源程序衍生出來的,不同的版本之間也具有相當好的兼容性。此外,這些工具的源程序都可以在ADE直接存取。1.2.3面向對象程序設計語言2.Smalltalk語言malltalk被公認為歷史上第二個面向對象的程序設計語言和第一個真正的集成開發(fā)環(huán)境(IDE)。是由AlanKay,DanIngalls,TedKaehler,AdeleGoldberg等于70年代初在XeroxPARC開發(fā)。Smalltalk對其它眾多的面向對象程序語言的產生起到了極大的推動作用,如Objective-C、Actor、Java和Ruby等。90年代的許多軟件開發(fā)思想均得益于Smalltalk,例如設計模式(DesignPatterns),極限編程(ExtremeProgramming,XP)和軟件重構(Refactoring)等。1.2.3面向對象程序設計語言3.C++程序設計語言由于C語言是一門通用的計算機編程語言,其應用十分廣泛。所以,面向對象語言出現以后,出現了多種不同的基于C語言的面向對象設計語言。這些語言以C語言為基礎,以不同的方式擴充了對象的概念框架,從而構成了不同的面向對象語言。人們也將這種從C++擴充出來的語言稱為C族語言。常見的C族語言包括:ObjectC、C++、C#和Java等程序設計語言。1.2.3面向對象程序設計語言3.C++程序設計語言C++程序設計語言是對C語言的繼承,它既可以過程化編程,又可以基于對象編程,還可以進行以繼承和多態(tài)為特點的面向對象編程,當然也可以混合編程。C++不僅擁有計算機高效運行的實用性特征,同時還致力于提高大規(guī)模程序的編程質量與程序設計語言的問題描述能力。C++程序設計語言具有支持數據封裝藏、繼承、多態(tài)和重用等面向對象特征。特別的是,C++還支持多繼承。1.2.3面向對象程序設計語言3.C++程序設計語言其主要優(yōu)點是,C++是在C語言的基礎上開發(fā)的一種面向對象編程語言,其應用領域十分廣泛。C++語言靈活,運算符和數據結構豐富、具有結構化控制語句、程序執(zhí)行效率高,而且同時具有高級語言與匯編語言的優(yōu)點。C++的主要缺點是缺少自動垃圾回收機制,設計出來的軟件容易造成內存泄漏(MemoryLeak)。從而影響軟件的可靠性。同時也是這一原因,使得優(yōu)秀的C++程序員成為稀缺資源。1.2.3面向對象程序設計語言4.C#程序設計語言C#程序設計語言是微軟公司開發(fā)的一種現代面向對象且類型安全的程序設計語言。C#不僅是一種面向對象的程序設計語言,C#也是一種對面向組件(Component-Oriented)的語言?,F代軟件已經越來越依賴這種具有自包含和自描述功能包形式的軟件組件。這種組件的關鍵之處在于,它們可以通過屬性、方法和事件等概念來提供編程模型;它們還具有提供關于組件的聲明性信息的特性;1.2.3面向對象程序設計語言4.C#程序設計語言C#語言提供的結構成分直接支持組件及其相關概念,這使得C#語言自然而然成為創(chuàng)建和使用軟件組件的重要選擇。有助于構造健壯、持久的應用程序。C#還提供了垃圾自動回收(Garbagecollection)、異常處理(ExceptionHandling)和類型安全(TypeSafe)等三大機制。1.2.3面向對象程序設計語言4.C#程序設計語言1)垃圾自動回收機制可以自動釋放不再使用的對象所占用的內存,解決了C++的內存泄漏問題;2)異常處理機制提供了結構化和可擴展的錯誤檢測和恢復方法,為設計高可靠性的應用程序提供了語言基礎;3)類型安全機制可使設計出來的應用程序避免讀取未初始化的變量、數組索引超出邊界或執(zhí)行未經檢查的類型強制轉換等特殊情形。1.2.3面向對象程序設計語言4.C#程序設計語言同一類型系統(UnifiedTypeSystem)所有的C#類型(包括諸如int和double之類的基元類型)都繼承于一個惟一的一個Object根類型。這使得所有類型的對象都共享一組通用操作,并且任何類型的值都能夠以一致的方式進行存儲、傳遞和操作。1.2.3面向對象程序設計語言4.C#程序設計語言C#同時支持用戶定義的引用類型和值類型,既允許對象的動態(tài)分配,也允許輕量級結構的內聯存儲。為了確保C#程序和庫能夠以兼容的方式逐步演進,C#的設計中充分強調了版本控制(Versioning)。C#的設計在某些方面直接考慮到版本控制的需要,其中包括單獨使用的virtual和override修飾符、方法重載決策規(guī)則以及對顯式接口成員聲明的支持。1.2.3面向對象程序設計語言5.Java程序設計語言Java語言具有很多與當今使用的大多數編程語言相通的特性。Java語言與C++和C#程序設計語言有很多的相似之處,其本身就是用相似的C和C++結構設計的。Java語言最初的目標只是為了給萬維網創(chuàng)建Applet工具而定義的一種語言。Applet是一種運行在Web頁面中的小應用程序。下載之后,它可以在不使用Web服務器資源的情況下,在瀏覽器頁面中執(zhí)行任務并與用戶進行交互。1.2.3面向對象程序設計語言5.Java程序設計語言Java語言對于Web這樣的分布式網絡環(huán)境確實有非常重要的價值。然而,它已經遠遠超越了這個領域,成為了一種強大的通用編程語言,適用于構建各種不依賴于網絡特性的應用,并可滿足其它應用的不同需求。它在遠程主機上以安全的方式執(zhí)行下載代碼的能力正是許多組織的關鍵需求。1.2.3面向對象程序設計語言5.Java程序設計語言有些團隊甚至將Java作為一種通用編程語言,用于開發(fā)對機器無關性要求不高的項目。Java語言易于編程,安全性強,可用于快速地開發(fā)工作代碼。它同樣具有垃圾回收和類型安全引用這樣的特性,某些常見的編程錯誤在Java中是不會發(fā)生的。對多線程的支持滿足了基于網絡和圖形化用戶界面的現代應用的需要,因為這些應用必須同時執(zhí)行多個任務;而異常處理機制使得處理錯誤情況的任務變得簡單易行。盡管其內置工具非常強大,Java依然是一種簡單的語言,程序員可以很快就精通它。1.2.3面向對象程序設計語言以上簡單介紹了Simula、Samlltalk、C++、C#和Java等幾種典型的面向對象程序設計語言及其特性。這些語言中,目前最流行的是C++、C#和Java這三種程序設計語言。這幾種程序設計語言通常被作為軟件開發(fā)項目的首選語言。除了上述介紹的面向對象程序設計語言之外,還有一些所謂的基于對象的程序設計語言,例如PowerBuilder和VisualBasic等。事實上,在實際的軟件項目開發(fā)過程中,每種語言都有不同的編譯器版本、集成環(huán)境和資源庫等多方面的選擇,但所有這些選擇所依據的面向對象思想和開發(fā)方法都是基本相同的,或是語言無關的。1.2.4典型的面向對象的開發(fā)方法面向對象方法的產生和發(fā)展同樣也經歷一個比較漫長的過程。在這個過程中,首先出現的是面向對象程序設計語言和面向對象程序設計方法(OOP,ObjectOrientedProgramming),然后是面向對象系統設計(OOD,ObjectOrientedDesign),最后形成的是面向對象分析(OOA,ObjectOrientedAnalysis),隨后逐漸出現了面向對象測試(OOT,ObjectOrientedTesting)、面向對象度量(OOS,ObjectOrientedSoftwareMeasurement)和面向對象管理(OOM,ObjectOrientedManagement)等面向對象開發(fā)方法和技術。1.2.4典型的面向對象的開發(fā)方法典型的面向對象方法包括Coad-Yourdon方法、Rumbaugh方法、Booch方法、Wirfs-Brock方法、Jacobson方法和VMT(VisualModelingTechnique)方法等方法。這些方法既有聯系又相互區(qū)別,所有這些方法相互補充相互融合,構成了現代的面向對象開發(fā)方法。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法Coad-Yourdon方法是由PeterCoad和EdwardYourdon在1991年提出的,是一種漸進的面向對象分析與設計方法。Coad-Yourdon方法將整個開發(fā)過程劃分為分析和設計兩個階段。在分析階段,主要利用定義主題、發(fā)現和標識對象、標識服務、標識結構和標識屬性等五個層次的活動來定義和描述系統的結構和行為。在設計階段中,則在將系統劃分為問題論域、用戶界面、任務管理和數據管理等四個組成部分的基礎上,持續(xù)和細化這五個層次的活動,完成整個系統的設計。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法Coad-Yourdon方法中涉及到的主要概念如下:(1)主題層主題是對目標系統的結構和行為的一種較高層次的抽象,可以看成是一組關系密切的類組成的集合。將一個系統劃分成若干個主題,可以看成是對系統結構進行的一個劃分,不同的類(或對象)組合構成不同的主題,所有主題構成了系統的主題層。主題層的主要工作就是通過定義目標系統的主題實現對系統結構的劃分,給出系統的整體框架,從而建立系統結構的概念模型。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(2)對象層對象層的主要工作是發(fā)現和描述對象和類,這可以從應用領域開始,逐步發(fā)現和識別基礎類和對象,以確定形成整個應用的基礎。這個層次的活動要通過分析問題域中目標系統的責任、環(huán)境以及系統與環(huán)境之間的關系,從而確定對系統有用的類、對象及其責任。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(3)服務層一個對象對外提供的服務是指對象收到消息后所執(zhí)行的操作,它描述了系統需要執(zhí)行的功能和處理。定義服務的目的在于定義對象的行為之間的消息鏈接。其具體步驟包括標識對象狀態(tài)、標識必要的服務、標識消息鏈接和對服務的描述。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(4)結構層面向對象系統的結構通常表現為層次結構。典型的層次結構包括一般與特殊的類層次結構和整體與部分之間的對象層次結構。類層次結構也就是所謂的繼承結構。對象層次結構主要表現為對象的組合、聚合、關聯甚至是依賴等關系。這種結構通常被用來表示一個對象如何成為另一個對象的一部分,以及如何將多個對象組裝成更大的對象。結構層活動的主要工作內容就是對這兩種結構進行識別和標識1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(5)屬性層屬性所描述的主要是對象的狀態(tài)信息,在任何對象中,屬性值表示了該對象的狀態(tài)信息。屬性層的活動中,需要為每個對象找出其在目標系統中所需要的屬性,而后將屬性安排到適當的位置,找出實例鏈接,最后進行檢查對每個屬性應該給出描述,并確定其屬性的名字和屬性的描述與存在哪些特殊的限制(如只讀、屬性值限定于某個范圍之內等)。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法Coad-Yourdon方法將系統設計的任務劃分為數據管理、任務管理、問題域和人機交互子系統等四個子系統的設計。(1)數據管理子系統數據管理子系統是指系統中專門用于實現數據管理功能的子系統。其主要功能就是實現系統的數據存儲,一方面,規(guī)范數據的存儲和操作方式,提高數據訪問的通用性;另一方面,保證數據存儲的安全性、訪問的并發(fā)性、較好的可維護性等。數據管理部分的設計包括操作設計和數據存儲的設計兩部分。設計數據存儲設計要根據所使用的數據存儲管理模式來定。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(2)任務管理子系統任務也稱為進程,就是執(zhí)行一系列活動的一段程序,當系統中有許多并發(fā)任務時,需要依照各個行為的協調關系進行任務劃分,所以,任務管理主要是對系統各種任務進行選擇和調整的過程。采用面向對象程序設計方式,每一個對象都是一個獨立實體,因此,從概念上講,不同對象是可以并發(fā)工作的,但在實際系統中,許多對象之間往往存在相互依賴關系,而且多個對象可能是由一個處理器處理的。所以,設計任務管理工作時,主要是確定對象之間的關系,包括選擇必須同時動作的對象,以及對相互排斥的對象的處理進行調整。根據對象完成的任務及對象之間的關系,進一步設計任務管理子系統。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(3)問題域子系統問題域子系統設計的主要工作則是對在分析階段獲得的需求模型進行進一步的細化。在分析階段,通過詳細分析,已獲得了問題域的基本模型。進入設計階段后,則要根據所選擇的開發(fā)環(huán)境和系統的運行環(huán)境以及其它技術和管理約束等因素,對分析模型進行細化和完善。1.2.4典型的面向對象的開發(fā)方法1.Coad-Yourdon方法(4)人機界面子系統人機界面系統
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內墻面磚施工方案
- 外墻落水管更換施工方案
- 暖氣改造施工方案
- 二年級二班心理健康教育主題班會活動方案
- 電梯施工方案
- 2023年溫州教師招聘蒼南縣教育系統選聘筆試真題
- 2023年連州市赴高校招聘高中編制教師考試真題
- 2023年湖州教師招聘湖州市教育局招聘屆考試真題
- 2023年蚌埠市大學生鄉(xiāng)村醫(yī)生專項計劃招聘考試真題
- 住院醫(yī)師規(guī)范化培訓年度考核實施方案
- 直腸癌放射治療靶區(qū)勾畫課件
- 《市場營銷》知識點匯總
- 服務組織協調內容及措施
- 國開電大本科工程數學(本)在線形考(形成性考核作業(yè)4)試題及答案
- 大班數學《我的一天》
- 哲學與人生第十課歷史規(guī)律與人生目標
- 私生子斷絕父子關系協議書
- 等離子弧焊與切割課件
- 簡約遞進邏輯關系PPT模板
- 全過程工程咨詢工作總結報告(全過程咨詢)
- UCC3895芯片內部原理解析
評論
0/150
提交評論