面向?qū)ο蠓治雠c設計 課件 第1、2章 面向?qū)ο箝_發(fā)方法、統(tǒng)一建模語言概述_第1頁
面向?qū)ο蠓治雠c設計 課件 第1、2章 面向?qū)ο箝_發(fā)方法、統(tǒng)一建模語言概述_第2頁
面向?qū)ο蠓治雠c設計 課件 第1、2章 面向?qū)ο箝_發(fā)方法、統(tǒng)一建模語言概述_第3頁
面向?qū)ο蠓治雠c設計 課件 第1、2章 面向?qū)ο箝_發(fā)方法、統(tǒng)一建模語言概述_第4頁
面向?qū)ο蠓治雠c設計 課件 第1、2章 面向?qū)ο箝_發(fā)方法、統(tǒng)一建模語言概述_第5頁
已閱讀5頁,還剩349頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第1章面向?qū)ο箝_發(fā)方法學習目標

理解對象的概念

了解面向?qū)ο筌浖_發(fā)方法

理解面向?qū)ο蟮拈_發(fā)過程第1章面向?qū)ο箝_發(fā)方法本章的主要內(nèi)容:面向?qū)ο蠓椒ǖ幕靖拍?,及其?nèi)涵與外延。軟件開發(fā)方法的發(fā)展過程和典型的面向?qū)ο箝_發(fā)方法。概括性地介紹面向?qū)ο蟮能浖_發(fā)過程,如面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O計等。1.1對象及對象模型對象模型是計算機科學中的一個基本概念,它不僅僅適用于程序設計語言,也適用于軟件系統(tǒng)的用戶界面、數(shù)據(jù)庫甚至計算機架構(gòu)的設計。這種廣泛適用的原因就是,面向?qū)ο竽軌驇椭覀兲幚矶喾N不同系統(tǒng)中固有的復雜性。面向?qū)ο笙到y(tǒng)分析和設計代表了一種漸進式的開發(fā)方式,它并沒有完全拋棄傳統(tǒng)的方法的優(yōu)點,而是建立在有效的傳統(tǒng)方法基礎之上的一種新方法。例如,傳統(tǒng)方法中的“算法分解”技術在處理復雜程度較高的系統(tǒng)時是有局限性的,而面向?qū)ο蠹夹g則可以更有效地幫助人們解決這一問題。1.1.1對象的基本概念1.對象和類的定義在面向?qū)ο蠓椒ㄖ?,人們曾?jīng)給出了多個不同的對象定義。這些定義的共同點是均把對象看作是一個封裝了數(shù)據(jù)和操作的實體。GradyBooch給出的對象定義如下:所謂對象(Object)就是將一組數(shù)據(jù)和與這組數(shù)據(jù)有關的操作組裝在一起所形成的一個完整的實體。對象中的數(shù)據(jù)被稱為對象的屬性,一個對象的所有屬性的值被稱為這個對象的狀態(tài)。對象的操作則被稱為對象的行為,也稱為對象的外部接口。1.1.1對象的基本概念1.對象和類的定義在特定的軟件系統(tǒng)中,對象表示的是軟件系統(tǒng)中存在的某個特定實體,它們可以有不同的類型,大多數(shù)對象通常是一種對現(xiàn)實世界客觀事物的計算機描述。例如,圖書管理系統(tǒng)中的一本圖書,一個讀者,或一次借閱記錄都可以被視為是一個對象。它們就分別表示了現(xiàn)實世界中一個圖書館的一本書、一個讀者和一個借閱事件。但這些對象并不等同于現(xiàn)實世界中的實際事物,圖書管理系統(tǒng)中的這些對象只描述它們在計算機系統(tǒng)中的狀態(tài)和行為,因此它們不過是對現(xiàn)實世界中對應的客觀實體的一種計算機描述而已。1.1.1對象的基本概念1.對象和類的定義一個現(xiàn)實的系統(tǒng)中,通常會有很多的對象,為了有效地管理這些對象并使之發(fā)揮作用,人們又從分類的角度出發(fā),給出了類的定義。類(class)可以被定義成具有某些相同的屬性和方法的全體對象構(gòu)成的集合。這個定義將類看成是對一組具有相同屬性和方法的對象的一種抽象描述,其本質(zhì)在于這些對象所具有的相同屬性和方法。因此,類也可以被定義成是一組屬性和方法構(gòu)成的一個整體。目前的各種程序設計語言中,就都采用了這樣的方式來定義類。1.1.1對象的基本概念1.對象和類的定義例如圖1-1就給出讀者、圖書和借閱這三個對象的一個抽象描述。它們分別表示了三個類,當然也表示了這三個類之間的關系。圖1-1圖書管理系統(tǒng)中的圖書和讀者類圖1.1.1對象的基本概念1.對象和類的定義另外,從類與對象之間的關系的角度來看,類和對象顯然分別屬于兩個不同的抽象層次。與對象相比較,類處于較高的抽象層次;當然,對象則處于較低的抽象層次。為了描述二者之間的層次關系,面向?qū)ο蠓椒ㄊ褂脤嵗母拍顏砻枋鲞@兩個不同的抽象之間的關系。將類看成一個對象集合時,這個集合中的任何一個對象又可以被稱為這個類的一個實例(Instance)。顯然,一個類通常會有多個實例。特殊情況下,只有一個對象的類被稱為單件類。沒有實例的類則被稱為抽象類。1.1.1對象的基本概念1.對象和類的定義從這個概念出發(fā),還可以進一步引申出實例化的概念,我們將創(chuàng)建類實例的過程稱為實例化。顯然,任何對象均需要一個實例化過程,這個過程可能簡單,也可能很復雜。實例化過程的復雜度與類結(jié)構(gòu)的復雜度有關。從上述定義出發(fā),一個對象就是一個具有某種特定狀態(tài)和行為的實體。同時,結(jié)構(gòu)和行為類似的對象又被定義在它們共同所屬的類中。實例和對象這兩個術語可以互換使用。對象可以表示現(xiàn)實世界中的各種事物,從簡單的一個數(shù)字到一個復雜的系統(tǒng)等均可看作是一個對象。它既可以表示具體的事物,也可以表示抽象的邏輯事物,如一本圖書、一個業(yè)務規(guī)則、一份計劃或一個事件等。1.1.1對象的基本概念1.對象和類的定義在對象模型中,如果一個對象使用了另一個對象,則將使用者稱為客戶(client)對象,稱被使用者為服務器(server)對象。對于任何一個對象來說,這個對象中可以被調(diào)用的操作集合以及這些操作的合法調(diào)用順序被稱為對象的接口(interface)或協(xié)議(agreement)。這個協(xié)議描述了對象的動作和反應的方式,構(gòu)成了對象抽象的和完整的外部視圖。1.1.1對象的基本概念2對象的狀態(tài)對象的狀態(tài)(status)是指一個對象的所有屬性在某一時刻的取值或一個對象的某些屬性值所滿足的條件。顯然,任何對象的狀態(tài)都是由這個對象屬性值決定的。一般情況下,一個對象可能會有多個不同的狀態(tài)。例如,圖書管理系統(tǒng)中的圖書對象,就可能具有借出(Lend)、被預定(Reserve)和就緒(Ready)等幾種不同的狀態(tài)。1.1.1對象的基本概念2對象的狀態(tài)對于任何兩個對象來說,只有當它們所擁有的屬性及屬性值均完全相同時,才可以說這兩個對象的狀態(tài)完全相同,但值得注意的是,兩個狀態(tài)相同的對象不等同于它們是同一個對象。判斷兩個對象是否是相同的對象,不僅僅要看它們的屬性值,還要它們不同的存在時間和存在空間。1.1.1對象的基本概念2對象的狀態(tài)當多個對象擁有相同的屬性定義,但屬性值卻不完全相同時,我們只能說它們具有相同的表現(xiàn)形式,但不能說它們具有相同的狀態(tài)。當多個對象不僅屬性值不同,而且擁有屬性定義也不盡相同時,我們則說它們不僅狀態(tài)不同,并且它們的表現(xiàn)形式(或所屬的類)也不相同。1.1.1對象的基本概念3對象的行為軟件系統(tǒng)中,任何一個對象通常都不是孤立存在的,對象之間還會存在各種各樣的聯(lián)系和影響。我們將一個對象在其狀態(tài)發(fā)生某種改變或接收到某個外部消息時所進行的動作和做出反應的方式稱為對象的行為(behaviour)。換句話來說,對象的行為代表了它們的外部可見的活動。面向?qū)ο蠓椒ㄖ?,通常使用操作來描述對象的行為。一個操作(Operation)可以定義成一個對象向外部提供的某種服務,如果外部對象調(diào)用對象的某個操作,這就意味著被調(diào)用的對象將執(zhí)行這個操作中包含的動作,并相應地調(diào)整其自身的狀態(tài)。1.1.1對象的基本概念3對象的行為面向?qū)ο蠓椒ㄖ?,還可以使用消息(Message)的概念來描述對象之間的交互,并將消息傳遞作為對象之間惟一的交互方式。在面向?qū)ο笳Z言中,通常將調(diào)用一個對象的操作稱為向這個對象發(fā)送一個消息。消息和操作是密切相關的兩個不同概念。操作描述的是對象提供的外部服務,消息描述的是兩個對象之間的一次交互。而二者之間又是密切相關的,即向一個對象發(fā)送一條消息就是調(diào)用這個對象的某個操作。因此,在一般情況下,可以不加區(qū)別地使用操作和消息這兩個術語。1.1.1對象的基本概念3對象的行為值得注意的是,消息傳遞只定義了對象行為的一個方面。另一方面,對象的行為還要受到對象自身狀態(tài)的影響。一個對象所表現(xiàn)出來的行為不僅取決于施加在該對象上面的操作,而且還取決于它的當前狀態(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對象的行為下面再來討論一下,操作的分類問題。一個對象通常會有多個操作,每個操作都代表了這個對象所屬的類提供給這個對象本身的一種服務。按照操作的作用,可以將操作劃分成構(gòu)造、析構(gòu)、修改、選擇和遍歷等五種不同的類型。其中構(gòu)造和析構(gòu)是缺省操作,分別用于對象的創(chuàng)建和銷毀,后三種類型則表示三種不同類型的常見操作。修改(modify)操作是一種能夠更改一個對象本身狀態(tài)的操作;選擇(select)或只讀(readonly)是指能夠訪問一個對象的狀態(tài),但并不更改這個狀態(tài)的操作;遍歷(thrughout)則是以某種方式訪問一個對象的所有組成部分的操作。1.1.1對象的基本概念3對象的行為軟件建模時,通常應該明確標明操作的類型。程序設計語言通常提供了不同的語言機制來表示操作的這些類型。例如,C++程序語言就定義了特定的構(gòu)造函數(shù)和析構(gòu)函數(shù)的表示法,還提供了const關鍵字來定義選擇操作。進一步,屬性和操作之間的關系也決定了各操作之間的執(zhí)行順序,這個執(zhí)行順序則構(gòu)成了對象的一種使用規(guī)則。對象建模時,同樣也需要清楚地認識和描述這個規(guī)則??梢哉f,系統(tǒng)中任何對象都定義或封裝了它自己的狀態(tài),系統(tǒng)所有的狀態(tài)都是由其對象所封裝的。但對象的狀態(tài)只是問題的一個方面,我們還必須要考慮對象的行為以及狀態(tài)和行為之間的相互影響。1.1.1對象的基本概念4角色和責任對于任何一個對象來說,它必然要承擔部分系統(tǒng)責任,責任(duty)表示了對象的一種目標以及它在系統(tǒng)中的位置。一個對象必須為它所承擔的系統(tǒng)責任提供全部服務。當一個對象承擔了較多的系統(tǒng)責任時,就可能需要提供多組不同的方法以履行這些責任。此時,按照責任對對象的這些方法進行分組就顯得非常有意義了。這些分組劃分了對象的行為空間,也描述了一個對象可能承擔的多種系統(tǒng)責任。如果將對象承擔的不同的系統(tǒng)責任抽象成不同的角色(Role),那么,我們就得到了一個新的概念。這個概念定義了對象與它的客戶之間的契約的一種抽象。1.1.1對象的基本概念4角色和責任事實上,大多數(shù)對象都有可能承擔了多種不同的系統(tǒng)責任,或者說充當了多種不同的系統(tǒng)角色。此時,一個對象所扮演的角色即是動態(tài)的,同時也是互斥的??傊粋€對象的狀態(tài)和行為共同決定了這個對象可以扮演的角色,這些角色又決定了這個對象它所承擔的系統(tǒng)責任。也就是說,角色代表了對對象的責任的一種抽象。1.1.1對象的基本概念5對象標識符在面向?qū)ο笙到y(tǒng)中,一個對象通常對應了現(xiàn)實世界的某個特定的物理或邏輯實體?,F(xiàn)實世界中,不同的實體之間顯然應該存在不同的區(qū)別。為了區(qū)別不同的對象,任何一個對象均需要擁有一個對象標識符。面向?qū)ο蠓椒ㄖ?,并沒有明確規(guī)定對象標識符的表示方法,但實際的軟件系統(tǒng)中,對象標識符又是一個必須關注和實現(xiàn)的概念??梢允褂枚喾N方法實現(xiàn)對象標識符,如為對象定義的一個屬性、使用的程序設計語言表示的變量名等。1.1.1對象的基本概念5對象標識符例如,可以將對象標識符定義為對象的一個內(nèi)部屬性,這個內(nèi)部屬性不一定具有問題域方面的含義,其主要作用在于將當前對象與其它對象區(qū)別開來。例如,學生的學號、社會保險號碼或居民身份證號等。在應用程序中,可以使用對象的變量名作為對象標識符,用來區(qū)分不同的對象,這實際上是把尋址方法作為對象標識符。在數(shù)據(jù)庫系統(tǒng)中,還可以使用“主鍵”作為對象標識符,來區(qū)分不同的數(shù)據(jù)實體(持久對象),這實際上是將對象的某個(或某性)屬性作為標識符,這種表示方法具有一定的業(yè)務邏輯方面的意義。1.1.1對象的基本概念5對象標識符總之,對象標識符僅僅作為面向?qū)ο蠓椒ㄖ械囊粋€概念,通常并不代表程序設計語言中的“標識符”意義或數(shù)據(jù)庫中“主鍵”意義上的標識符。面向?qū)ο笙到y(tǒng)中,如果不能夠正確區(qū)分對象的名稱和對象本身,這將會導致面向?qū)ο蟪绦蛟O計中的許多錯誤。每個對象都需要有一個惟一的標識符,對象標識符在其整個生命周期中都將被保持的,即使它的狀態(tài)發(fā)生了某種改變時也是如此。1.1.2對象模型的構(gòu)成要素對象模型是面向?qū)ο蠓椒ǖ倪壿嫽A。從概念上來說,對象模型包括抽象、封裝、模塊化、層次結(jié)構(gòu)、類型、并發(fā)和持久等七個基本構(gòu)成要素,其中抽象、封裝、模塊化、層次結(jié)構(gòu)為主要要素,類型、并發(fā)和持久為次要要素。其中主要要素是指模型必須包含的要素,缺少任何一個主要要素,這個模型都不再被稱為是面向?qū)ο蟮哪P?。次要要素是指這些要素是對象模型的有用組成部分,但不是本質(zhì)要素。1.1.2對象模型的構(gòu)成要素正確地理解這個概念框架,對于使用面向?qū)ο蠓椒ㄩ_發(fā)應用系統(tǒng)具有非常重要的理論意義和現(xiàn)實意義。反之,即使使用了面向?qū)ο蟪绦蛟O計語言,但編寫出來的程序可能仍然不具備面向?qū)ο蟮奶卣?,很可能與傳統(tǒng)的結(jié)構(gòu)化應用程序沒有太大區(qū)別。更重要的是,使用面向?qū)ο蠹夹g的主要目的是為了更好地把握問題的復雜性。1.1.2對象模型的構(gòu)成要素1抽象抽象(abstract)是人們分析復雜事物是常用的最基本的思維方式,也是人正確認識客觀事物,解決問題的重要方法。抽象也可以看成是對客觀事物的一種簡單的概述性描述,通常僅關注客觀事物的重要細節(jié),而忽略事物的非本質(zhì)特征的細節(jié)或枝節(jié)。對于一個概念,只有當它可以獨立于最終使用和實現(xiàn)它的機制來描述、理解和分析時,我們才說這個概念是抽象的。1.1.2對象模型的構(gòu)成要素1抽象例如,數(shù)據(jù)結(jié)構(gòu)中,線性表對具有線性關系的數(shù)據(jù)集合及其處理的一個抽象描述。這個概念抓住了數(shù)據(jù)元素之間的線性關系及其處理算法等這一本質(zhì)特征,而忽略了其元素的數(shù)據(jù)類型、存儲結(jié)構(gòu)和算法的實現(xiàn)等具體特征。這個抽象使我們可以抓住問題的本質(zhì)特征而忽略問題具體的細枝末節(jié),從而是我們可以在更高的層次上討論要解決的問題。也可以說,抽象是對客觀事物所具有的基本特征的概念性描述,通過抽象可以將一種事物與其它事物嚴格區(qū)分開來。抽象也是一種分析問題和解決問題的基本方法,1.1.2對象模型的構(gòu)成要素1抽象面向?qū)ο蠓椒ㄖ?,對象、屬性、方法、類、責任、職責和接口等都是運用抽象思維得出的抽象概念,正是這些概念構(gòu)成了面向?qū)ο蠓椒ǖ幕驹~匯。面向?qū)ο蠓椒ㄒ蠼H藛T能夠正確地運用抽象這一基本的思維方式,正確認識問題域中所面臨的問題及其解決方法。從給定問題域中分析出一組正確的抽象,則是面向?qū)ο蠓治雠c設計的核心問題。1.1.2對象模型的構(gòu)成要素1抽象面向?qū)ο蠓治龅膶嵸|(zhì),就是從問題域中抽象出對實現(xiàn)系統(tǒng)目標有意義的對象。這些對象可能包括問題域中的實體對象、通用操作對象、業(yè)務邏輯對象、偶然對象等,因此,面向?qū)ο蠓治龅倪^程的實質(zhì)就是一系列的抽象過程。作為一種最基本的思維方式,抽象的運用范圍不僅僅在于發(fā)現(xiàn)對象,而是更廣泛地存在于軟件開發(fā)過程中所涉及到的每個不同的領域。1.1.2對象模型的構(gòu)成要素2封裝確定了一個對象的屬性和行為,僅僅給出了這個對象在某種意義上的一個抽象,還需要進一步給出其具體實現(xiàn)。一個對象通??梢杂枚喾N方式實現(xiàn),對于對象的客戶來說,選擇什么樣的實現(xiàn)方式并不重要,對象只要提供對外的契約就可以了。換句話說,對象的抽象應該優(yōu)先于它的實現(xiàn)。而實現(xiàn)則應該僅作為這種抽象后面的私有信息并對絕大多數(shù)客戶隱藏。1.1.2對象模型的構(gòu)成要素2封裝所謂的封裝(encapsulation)是指:在構(gòu)造對象的結(jié)構(gòu)和行為的過程中,需要明確地定義對象的外部可見部分和不可見的部分,這可以使對象的接口部分和實現(xiàn)部分相分離,從而降低對象與其客戶之間的耦合。例如,在C++程序設計語言中,類中的屬性和方法的可見性(公共、私有和保護)實際上就是封裝的一種實現(xiàn)機制。1.1.2對象模型的構(gòu)成要素2封裝抽象和封裝是兩個互補的概念,抽象通常描述的是對象的外部可見行為,而封裝關注的則是這些外部行為的實現(xiàn)。封裝一般通過信息隱藏加以實現(xiàn),信息隱藏是將那些不涉及對象本質(zhì)特征的秘密都隱藏起來的過程。1.1.2對象模型的構(gòu)成要素2封裝通常情況下,一個對象的結(jié)構(gòu)是對外不可見(隱藏)的,其方法的實現(xiàn)也是外部不可見(隱藏)的,只有其外部行為是外部可見的。抽象描述的是對象能夠做什么,而封裝則是為了使程序可以借助最少的工作進行可靠地修改。1.1.2對象模型的構(gòu)成要素2封裝例如,在設計數(shù)據(jù)庫應用程序時,通常不需要關心數(shù)據(jù)在數(shù)據(jù)庫中的物理表示,而是僅對數(shù)據(jù)的邏輯結(jié)構(gòu)進行編程。這確保了數(shù)據(jù)庫數(shù)據(jù)的物理獨立性。在實踐中,每個類必須有接口和實現(xiàn)兩個部分。類的接口描述了它的外部視圖,包含了這個類所有實例的共同行為的抽象。類的實現(xiàn)包括抽象的表示以及實現(xiàn)期望的行為的機制。通過類的接口,我們能知道客戶可以對這個類的所有實例做出哪些假定。實現(xiàn)封裝了細節(jié),客戶不能對這些細節(jié)做出任何假定。1.1.2對象模型的構(gòu)成要素2封裝信息隱藏的另一個相關的問題是,隱藏還具有層次性。即在一個抽象層次被隱藏起來的東西,在另一個抽象層次里可能代表了外部視圖,此時,對象的內(nèi)部表示就可能被暴露出來。1.1.2對象模型的構(gòu)成要素2封裝例如,在C++程序設計語言中,類屬性和方法的可見性分為公共、私有和保護等三種,事實上,C++還通過友元機制為友元類實例提供了一種更寬泛的接口。這使得C++定義了公共、私有、保護和友元等多個層次的封裝性。大多數(shù)情況下,隱藏層次的劃分雖然為對象的設計提供了比較充分的支持,但同時也會為設計帶來額外的復雜性。所以,封裝層次的運用并不保證設計出高質(zhì)量的軟件系統(tǒng)。1.1.2對象模型的構(gòu)成要素3模塊化模塊化可以被看成是系統(tǒng)的一種屬性,這個屬性使得系統(tǒng)可以被分解成一組高內(nèi)聚和低耦合的模塊。模塊化過程中,抽象、封裝和模塊化的原則是相輔相承的。一個對象圍繞單一的抽象提供了一個明確的邊界,封裝和模塊化都圍繞這種抽象提供了屏障。1.1.2對象模型的構(gòu)成要素3模塊化結(jié)構(gòu)化方法中,模塊化主要是按照高內(nèi)聚低耦合的設計原則對程序進行分組。而在面向?qū)ο蠓椒ㄖ校K化的任務通常演變成了對類和對象通過打包(package)的方式來進行分組,此時每一個包可以被定義成若干個類(或?qū)ο螅?gòu)成的集合,而且包里面還可以包含其它的包,這與結(jié)構(gòu)化設計的模塊化有著明顯的不同。1.1.2對象模型的構(gòu)成要素3模塊化從分支策略的角度來看,將一個程序劃分成若干個不同的模塊可以在一定程度上降低程序的復雜性。但更重要的是,模塊劃分可以在程序內(nèi)部定義出一些結(jié)構(gòu)良好的、具有清晰定義的模塊邊界。這些模塊邊界(或接口)對于理解程序是非常有價值的。1.1.2對象模型的構(gòu)成要素3模塊化模塊化的設計原則通常包括:為降低軟件的開發(fā)和維護成本,每個模塊必須可以被獨立地進行設計和修改;每個模塊的結(jié)構(gòu)都應該足夠簡單,使它更容易理解;可以在不知道其它模塊的實現(xiàn)細節(jié)和不影響其它模塊行為的情況下,修改某個模塊的實現(xiàn);修改設計的容易程度應該能夠滿足可能的需求變更。1.1.2對象模型的構(gòu)成要素3模塊化模塊化最重要的一點是:發(fā)現(xiàn)正確的類和對象,然后將它們放到不同的模塊中,這是最基本的設計決策。類和對象的確定是系統(tǒng)邏輯結(jié)構(gòu)設計的一部分,而模塊的劃分和確定則是系統(tǒng)物理結(jié)構(gòu)設計的組成部分。我們不可能在物理設計開始之前完成所有邏輯設計,反之亦然。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)任何一個面向?qū)ο蟮南到y(tǒng)都包含了類結(jié)構(gòu)(繼承)和對象結(jié)構(gòu)(組成)這兩種基本的層次結(jié)構(gòu),類繼承描述類之間的繼承關系,對象組成則描述對象組成意義上的結(jié)構(gòu)關系。1)類結(jié)構(gòu)類結(jié)構(gòu)是指系統(tǒng)的所有類和這些類之間的關系。類之間的關系中最重要的關系就是繼承(Inheritance)關系。對于兩個類A和B,如果類A擁有類B的所有屬性和行為,則稱類A和類B之間存在繼承關系。此時,稱類A是類B的派生類,類B是類A的基類。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)從語義上說,繼承實際上表明了“是一種”的關系。例如,汽車“是一種”交通工具,快速排序“是一種”排序算法。繼承因此實現(xiàn)類之間的一種“一般/具體”的層次結(jié)構(gòu),其中子類將超類的一般結(jié)構(gòu)和行為具體化。從繼承關系出發(fā),當多個類之間具有比較復雜的繼承關系時,這些繼承關系將使系統(tǒng)構(gòu)成了一種層次結(jié)構(gòu),在這個層次結(jié)構(gòu)中,一個子類將繼承其超類的所有屬性和方法,同時子類也可以擴展或重新定義超類中的結(jié)構(gòu)和行為。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)使用繼承關系建模一個系統(tǒng)時,可以將多個不同的類中的相同屬性和方法遷移到它們共同的基類(或超類)中,從而減少這些屬性和方法的冗余,并且減少這些類之間的耦合,這也是面向?qū)ο蠓椒P注繼承關系的一個重要原因。在這個層次關系中,層次高的類代表了較高層次的抽象,低層次的則代表了較為低層次的抽象,同時,低層次類中也可以添加新的屬性和方法,也可以修改甚至隱藏繼承自高層次的類的屬性和方法。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)通過這種方式,繼承可以使得模型(甚至是程序)的描述方式更為經(jīng)濟。一個類通常把其內(nèi)部分成對外部開放和隱藏的兩個部分,開放的部分用接口描述,內(nèi)部屬性和狀態(tài)則是隱藏的。但繼承則要求重新定義一個用于繼承的接口,從而允許派生類來訪問、修改或隱藏其某些狀態(tài)和方法。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)繼承機制為類引進了子類這樣一種新的客戶類類型,但也增加了類封裝問題的復雜度。程序設計語言中定義的保護可見性就是一種專門為其子類提供的一種接口。這樣既支持了繼承,又在最大限度地保護了類的封裝性,同時也支持了不同層次的類之間的多態(tài)。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)2)多繼承(MultiInheritance)層次結(jié)構(gòu)中的另一個問題是所謂的多繼承(MultiInheritance)問題,即一個類擁有多個基類(或超類)。在很多情況下,多繼承是有意義的。例如,如圖1-2描述了一個多繼承的設計。其中水陸兩棲汽車同時繼承了汽車和輪船這兩個類,水陸兩棲汽車還同時還重復地繼承了交通工具類的屬性和方法。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)圖1-2多繼承實例1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)多繼承引入了一定的復雜性,即需要關注這些類中的名字沖突和重復繼承等問題。(1)名字沖突當多個超類含有相同名字的屬性或操作時,在它們共同的派生類中,就會發(fā)生名字沖突的情況。例如,當汽車和輪船這兩個類具有相同的屬性名或方法名時,在水路兩棲汽車類中,就會繼承了兩個同名的屬性和方法。這會給水路兩棲汽車類帶來額外的設計負擔。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)(2)重復繼承當多個同層次的類具有共同的超類時,它們的共同子類就會發(fā)生重復繼承的情況。又例如汽車和輪船這兩個類就具有共同的超類交通工具,這兩個類繼承了交通工具類的屬性和方法。當水路兩棲汽車類同時繼承了汽車和輪船這兩個類時,它就可能重復地繼承了來自交通工具類的屬性和方法。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)目前,大多數(shù)程序設計語言(如java,C#等)都不支持多繼承,對于不支持多繼承的語言,可以將多繼承結(jié)構(gòu)調(diào)整成一個超類加上與其它類的聚合的形式。支持多繼承的程序設計語言(如C++),則提供了相應的語言機制來解決上述兩個問題,但這增加了程序設計方面的負擔。具體的設計決策則由程序員來決定是否使用以及如何使用多繼承。1.1.2對象模型的構(gòu)成要素4層次結(jié)構(gòu)目前,大多數(shù)程序設計語言(如java,C#等)都不支持多繼承,對于不支持多繼承的語言,可以將多繼承結(jié)構(gòu)調(diào)整成一個超類加上與其它類的聚合的形式。支持多繼承的程序設計語言(如C++),則提供了相應的語言機制來解決上述兩個問題,但這增加了程序設計方面的負擔。具體的設計決策則由程序員來決定是否使用以及如何使用多繼承。1.1.2對象模型的構(gòu)成要素3)對象的層次結(jié)構(gòu)聚合(Aggregation)關系描述的是對象之間的層次關系,當一個對象是由另外一些對象組合而成時,則稱整體對象是一個聚合對象。也稱整體對象與部分對象之間的關系是一種聚合關系。當部分對象與整體對象具有相同的生命周期時,又可以稱這個聚合關系為組合關系。將繼承和聚合結(jié)合在一起可以構(gòu)成具有強大功能的結(jié)構(gòu),聚合允許對邏輯結(jié)構(gòu)進行物理分組,而繼承允許這些共同的部分在不同的抽象中被復用。1.1.2對象模型的構(gòu)成要素5類型類型的概念源于程序設計語言中的數(shù)據(jù)類型,其主要強調(diào)的數(shù)據(jù)的表示方法、取值范圍、允許進行的計算以及一個特定的標識符。將類型與類的概念相比較,二者具有較強的相似性,類型中的數(shù)據(jù)表示方法與類的屬性定義、類型的計算與類的操作、類型標識符與類名等都有很強的相似性。但類型的概念更基本,并且類型的適用范圍顯然更為寬泛。1.1.2對象模型的構(gòu)成要素5類型面向?qū)ο蠓椒ㄈ匀话杨愋鸵暈閷ο竽P椭械囊粋€獨立要素,即類型被看作是面向?qū)ο箢I域中某些結(jié)構(gòu)成分(如屬性、方法的形式參數(shù)和返回值等)的一種抽象描述。面向?qū)ο蠓椒ㄖ?,類型是關于某種結(jié)構(gòu)成分的強制規(guī)定,不同類型的結(jié)構(gòu)成分一般不能夠互換使用,或者至少它們的互換使用應該受到某種非常嚴格的限制。1.1.2對象模型的構(gòu)成要素5類型類型可以分為靜態(tài)類型和動態(tài)類型兩種類型。靜態(tài)類型是指所有變量和表達式的類型在編譯時就確定下來的數(shù)據(jù)類型。而動態(tài)類型(遲后綁定)是指變量和表達式的類型直到運行時刻才能夠確定下來的數(shù)據(jù)類型。也可以將靜態(tài)類型稱為強類型,將動態(tài)類型視為弱類型。1.1.2對象模型的構(gòu)成要素5類型另外,多態(tài)(polymorphism)也是動態(tài)類型和繼承互相作用時所表現(xiàn)出來的一種情形。多態(tài)代表了類型理論中的一個概念,即一個名字(或變量)可以代表許多個不同類型的對象,這些類具有某個共同的超類。因此這個對象可以響應一組共同的操作。多態(tài)可能是面向?qū)ο笳Z言中除了對抽象的支持以外最強大的功能,也正是它,區(qū)分了面向?qū)ο缶幊毯蛡鹘y(tǒng)的抽象數(shù)據(jù)類型編程。1.1.2對象模型的構(gòu)成要素6并發(fā)并行系統(tǒng)中,通常要考慮程序并行或并發(fā)執(zhí)行方面的問題。進程是指一個程序的一次可并發(fā)的執(zhí)行活動,進程通常是由操作系統(tǒng)獨立地進行管理的,每個進程都有獨立的地址空間。進程之間可以進行通訊,進程控制機制通常是由操作系統(tǒng)提供的,所以進程的通信開銷比較大,涉及到進程間通信技術。而線程則是某種輕量級的進程,線程一般共處于同一進程空間之內(nèi),它們共享同樣的地址空間和資源,這使得線程之間的通訊開銷較小,但需要解決共享數(shù)據(jù)資源的并發(fā)控制問題。1.1.2對象模型的構(gòu)成要素6并發(fā)設計一個含有多線程特性的大型軟件會有更多的困難,因為設計者必須考慮并發(fā)控制方面的問題,即系統(tǒng)的死鎖、饑餓、互斥和競爭條件等問題。在面向?qū)ο笙到y(tǒng)中,可以將并發(fā)和并發(fā)控制(進程或線程)封裝在可復用的抽象中,以減輕程序員在并發(fā)問題上的負擔。從并發(fā)的角度出發(fā),我們可以給出主動對象和被動對象的概念,我們把封裝了某個并發(fā)的進程或線程的對象稱為主動對象,否則稱為被動對象。1.1.2對象模型的構(gòu)成要素6并發(fā)一般來說,在面向?qū)ο蟮脑O計中,共有三種并發(fā)方式。(1)并發(fā)程序設計語言這種情況下,并發(fā)是程序設計語言的內(nèi)在特征,該種語言本身就提供了并發(fā)和同步控制機制。可以直接創(chuàng)建一個主動對象,它與其它主動對象一起并發(fā)執(zhí)行某些處理過程。1.1.2對象模型的構(gòu)成要素6并發(fā)(2)軟件開發(fā)環(huán)境目前,大多數(shù)軟件開發(fā)環(huán)境均以提供類庫的方式支持并發(fā)程序設計。當然,這種類庫通常是平臺相關的,也可能是不可移植的。在這種方式下,并發(fā)并不是語言的內(nèi)在特征,但提供的這些標準類,使得并發(fā)看起來似乎是對象的內(nèi)在的特征。其并發(fā)的本質(zhì)在于軟件的運行環(huán)境對并發(fā)的支持。1.1.2對象模型的構(gòu)成要素6并發(fā)(3)中斷機制最后一種方式,是利用中斷機制來實現(xiàn)并發(fā)。當然,這種方法是一種最古老的并發(fā)方式,使用中斷機制,不僅要求程序員具有某些底層硬件細節(jié)方面的知識,同時還要考慮軟件環(huán)境是否支持這樣的方式。1.1.2對象模型的構(gòu)成要素6并發(fā)不論如何實現(xiàn)并發(fā),當在一個系統(tǒng)中引入并發(fā)時,必須考慮主動對象之間活動的同步。例如,如果兩個主動對象試圖同時給第三個對象發(fā)送消息,則必須確保使用了某種互斥手段,這樣,被調(diào)用對象的狀態(tài)才不會因為兩個主動對象的同時訪問而被破壞。這是使用并發(fā)時必須注意的要點。在并發(fā)的情況下,僅定義對象的方法是不夠的,還必須確保這些方法的語義在多個控制線程的情況下仍然有效。1.1.2對象模型的構(gòu)成要素7持久性軟件中的一個對象通常會占用一定量的存儲空間,并在一定的時間內(nèi)存在。一個對象從建立到消亡的時間間隔稱為對象的生命周期(lifetime)。1.1.2對象模型的構(gòu)成要素7持久性按照對象在軟件中的生命周期可以把對象分為如下幾種類型:1)瞬時對象,只在某個時刻存在的對象,如表達式計算使用的臨時對象。2)過程對象,僅存在于某個過程的局部對象。這個過程開始時,對象被創(chuàng)建,這個過程結(jié)束時,這些對象被自動銷毀。如某個過程的局部變量;1.1.2對象模型的構(gòu)成要素7持久性3)全局對象,在軟件運行期間全局存在的對象,如軟件中的全局變量、堆中的值,它們的存在性和可見性可能會有所不同:4)持久對象,存在性與軟件的運行狀態(tài)無關的對象。這類對象通常需要數(shù)據(jù)文件或數(shù)據(jù)庫技術的支持,當軟件處在運行狀態(tài)時,這些對象會根據(jù)需要被調(diào)入內(nèi)存并參與系統(tǒng)的運行,在程序運行結(jié)束后,這些對象的屬性數(shù)據(jù)將被保存在數(shù)據(jù)文件或數(shù)據(jù)庫中。我們將實現(xiàn)對象在數(shù)據(jù)文件或數(shù)據(jù)庫與內(nèi)存之間轉(zhuǎn)換的技術稱為對象的序列化或持久化。1.1.2對象模型的構(gòu)成要素7持久性除了上述四種類型的對象之外,某些商業(yè)軟件還需要處理存在與不同版本的軟件之間的數(shù)據(jù)的兼容性問題,如MicrosoftOfficeWord軟件的版本兼容問題。此時,對象還存在不同版本之間的轉(zhuǎn)換問題。傳統(tǒng)編程語言通常只關注前三種類型的對象存在性問題,持久對象通常會涉及數(shù)據(jù)文件處理技術或數(shù)據(jù)庫技術。某些面向?qū)ο缶幊陶Z言提供了對持久化技術的直接支持,如Java提供的EnterpriseJavaBeans(EJB)和JavaDataObject(JDO)。1.1.2對象模型的構(gòu)成要素7持久性將對象序列化到數(shù)據(jù)文件只是序列化技術中比較初級的解決方案,因為這種技術不適合處理大量對象的情況。更常用的持久化技術是對象到數(shù)據(jù)庫中的映射。本書將在第九章詳細討論對象與關系數(shù)據(jù)庫的映射(OR映射)問題。另外,持久性問題要解決的不僅僅是對象的生命周期問題。在實際應用中,這些持久對象還有可能會跨越不同的空間(應用)而存在。這種情況下,不同的應用都會以不同的方式來解釋和處理持久對象。當這些跨越不同應用空間的持久對象被存儲在數(shù)據(jù)庫中時,顯然會增加保持數(shù)據(jù)完整性的難度。1.1.2對象模型的構(gòu)成要素7持久性例如,一個WORD文檔可以看成是由一組WORD文檔對象的屬性數(shù)據(jù)組成的集合,這些數(shù)據(jù)它也可以被WORD軟件使用,但某些其它軟件(如WPS軟件)也可以處理這個文檔的數(shù)據(jù),并且至少這些軟件處理這些數(shù)據(jù)的方式是一樣的,這些數(shù)據(jù)在不同的應用中的語義是相通的。但不同軟件中定義的封裝這些文檔對象數(shù)據(jù)的類卻不太可能會完全相同,至少這些類的方法不會完全相同。這個例子說明了持久對象的持久性還包含了空間方面的屬性。1.1.2對象模型的構(gòu)成要素7持久性對于分布式系統(tǒng)來說,有時候還必須考慮跨越空間的對象轉(zhuǎn)換問題。例如在分布式系統(tǒng)中,對象從一個結(jié)點遷移到另一個結(jié)點時,它們在不同結(jié)點中甚至會有非常不同的狀態(tài)和行為。綜上所述,我們可以給出如下的持久性的定義。持久是對象本身所具有的一種特性,通過這種特性,對象可以跨越時間和空間而存在。本小節(jié)詳細討論了對象模型的各個構(gòu)成要素,所有這些要素共同構(gòu)成了完整的面向?qū)ο蟮暮诵母拍睢?.1.3對象模型的主要優(yōu)點從模型的構(gòu)成要素上來看,對象模型與傳統(tǒng)的結(jié)構(gòu)化方法所使用的模型有著很大的不同,其重要區(qū)別在于對象模型引進了對象等相關概念。但并不是說對象模型完全放棄了傳統(tǒng)模型中好的原則和經(jīng)驗。相反,對象模型只是在原有模型的基礎上引入了一些新的元素和思想。因此,對象模型提供了一些其它模型沒有提供的重要優(yōu)點。最重要的是,使用對象模型可以構(gòu)建出具有一些更好結(jié)構(gòu)特性的復雜系統(tǒng)。1.1.3對象模型的主要優(yōu)點1.提高編程能力正確地理解對象模型有助于提高使用面向?qū)ο蟪绦蛟O計語言描述系統(tǒng)的能力,編寫面向?qū)ο蟪绦虻倪^程實質(zhì)上也是一個使用面向?qū)ο笳Z言描述系統(tǒng)結(jié)構(gòu)和行為的過程。正確理解對象模型的概念框架,對編程能力的提高將具有十分重要的基礎作用。雖然,在編寫程序的過程中,人們關注得更多的往往是語言的語法方面的細節(jié)。但更抽象一層的知識和概念將為編程提供方向性的指導。經(jīng)驗表明,如果不能正確地理解對象模型中的這些抽象的要素,那么程序設計語言中的很多表現(xiàn)力很強的功能就有可能被忽略或者被錯誤地使用了。1.1.3對象模型的主要優(yōu)點2.支持軟件復用所謂軟件復用(SoftwareReuse),是指將已有軟件的各種相關知識用于建立新的軟件,以縮減在軟件開發(fā)和維護方面的花費。顯然,軟件復用是提高軟件生產(chǎn)力和質(zhì)量的一種重要技術手段。早期的軟件復用主要是指代碼級的復用,被復用的知識專指部分程序代碼,后來軟件復用被擴展到領域知識、開發(fā)經(jīng)驗、設計決策、體系結(jié)構(gòu)、需求分析、軟件設計、程序代碼和軟件文檔等一切與軟件開發(fā)有關的各個方面。1.1.3對象模型的主要優(yōu)點2.支持軟件復用面向?qū)ο蠓椒ú粌H可以有效地支持軟件復用,而且甚至可以支持設計和分析的復用,這導致了可復用的應用程序框架的產(chǎn)生。例如,MicrosoftVisualC++提供的應用程序框架技術,為開發(fā)人員提供了一個完整的可運行的應用程序。程序員只要擴充這個程序框架就可以獲得他想要的完整應用。而這個程序框架本身就是一個可復用的軟件。1.1.3對象模型的主要優(yōu)點2.支持軟件復用人們發(fā)現(xiàn),面向?qū)ο笙到y(tǒng)的實現(xiàn)通常要比等價的非面向?qū)ο髮崿F(xiàn)的規(guī)模更小。這不僅意味著系統(tǒng)的代碼量更小,而且軟件的可復用度的提高也會反映到成本和開發(fā)進度上。但另一方面,并不是說面向?qū)ο蟮脑O計就一定就是可復用的設計,如果復用不是項目的主要目標,那么就不太可能實現(xiàn)復用。最后,可復用的設計可能要求在初次實現(xiàn)時的花費更多。但積極的一面是,初次開發(fā)付出的高成本將在組件的后續(xù)復用中獲得補償。1.1.3對象模型的主要優(yōu)點2.支持軟件復用再次,使用對象模型可以獲得更具有可維護性的系統(tǒng),這樣的系統(tǒng)將更適合修改和擴充。也就是說,面向?qū)ο笙到y(tǒng)可以隨時間而進化,而不是經(jīng)歷一次較大的需求變更就放棄原來的系統(tǒng)或者完全重新設計。1.2面向?qū)ο蟮能浖_發(fā)從計算機誕生之日開始,軟件開發(fā)就成為計算機應用和研究的一個十分重要的課題。軟件開發(fā)方式和開發(fā)方法也經(jīng)歷了翻天覆地的其巨大變化。開發(fā)方式經(jīng)歷了個體工作方式、軟件作坊方式和團隊開發(fā)方式等三種基本方式的演化。開發(fā)方法則經(jīng)歷了從早期的程序設計、結(jié)構(gòu)化方法和目前的面向?qū)ο蠓椒ㄟ@樣一個基本的歷程。這些方法從不同的角度出發(fā),各自提出了不盡相同的開發(fā)步驟和方法,這些不同的方法基本上都有效地解決了當時在軟件開發(fā)過程中所面臨的各種問題,但隨著時間的發(fā)展,也都組件暴露出它們各自的局限性?,F(xiàn)在的人們通常將軟件開發(fā)方法歸結(jié)成結(jié)構(gòu)化和面向?qū)ο髢蓚€大類,它們分別基于結(jié)構(gòu)化和面向?qū)ο蟮某绦蛟O計方法。習慣上,人們通常將面向?qū)ο蠓椒ㄖ暗姆椒ńy(tǒng)稱為結(jié)構(gòu)化方法或傳統(tǒng)的軟件開發(fā)方法。1.2.1典型的結(jié)構(gòu)化開發(fā)方法在結(jié)構(gòu)化開發(fā)方法的發(fā)展過程中,人們提出過很多種開發(fā)方法。典型的結(jié)構(gòu)化方法包括Parnas方法、SASD方法、Jackson方法、Warnier方法和PAM方法等。這些方法不僅解決了當時面臨的問題,同時他們也提出了很多有深遠意義的思想、概念和基本方法。這些思想、概念和基本的方法也已經(jīng)成為軟件開發(fā)方法發(fā)展的重要基石。1.2.1典型的結(jié)構(gòu)化開發(fā)方法1.Parnas方法Parnas方法是D.Parnas在1972年提出的一種軟件開發(fā)方法。其主要目的是解決軟件的可維護性和可靠性問題。在該方法中,Parnas提出了著名的信息隱蔽原則,目前這個原則已經(jīng)成為現(xiàn)代軟件工程學中的一個非常重要的軟件設計原則。1.2.1典型的結(jié)構(gòu)化開發(fā)方法1.Parnas方法信息隱藏(InformationHiding)原則的內(nèi)容是:代碼模塊應該采用定義良好的接口來封裝,這些模塊的內(nèi)部結(jié)構(gòu)應該是私有的,外部是不可見的。設計時可以列出將來可能發(fā)生變化的因素,并在模塊劃分時將這些因素放到個別模塊的內(nèi)部。這樣,在將來由于這些因素變化而需修改軟件時,只需修改這些個別模塊,其它模塊不受影響。信息隱蔽技術不僅提高了軟件的可維護性,而且也避免了錯誤的蔓延,改善了軟件的可靠性。1.2.1典型的結(jié)構(gòu)化開發(fā)方法1.Parnas方法Parnas提出的第二條原則是,在軟件設計時應對可能發(fā)生的各種意外(Exception)故障采取措施。軟件意外故障是指軟件在運行時發(fā)生的各種錯誤。軟件是很脆弱的,任何軟件很可能因為一個微小的錯誤而引發(fā)嚴重的事故,所以必須加強防范。模塊之間也要加強檢查,防止錯誤蔓延。1.2.1典型的結(jié)構(gòu)化開發(fā)方法2.SASD方法1978年,E.Yourdon和L.L.Constantine提出了結(jié)構(gòu)化方法,即SASD方法,也可稱為面向功能的軟件開發(fā)方法或面向數(shù)據(jù)流的軟件開發(fā)方法。1979年TomDeMarco對此方法作了進一步的完善。Yourdon方法是80年代使用最廣泛的軟件開發(fā)方法。它首先用結(jié)構(gòu)化分析(SA)對軟件進行需求分析,然后用結(jié)構(gòu)化設計(SD)方法進行總體設計,最后是結(jié)構(gòu)化編程(SP)。這一方法不僅開發(fā)步驟明確,而且給出了兩類典型的軟件結(jié)構(gòu)(既變換型和事務型),便于參照,提高了軟件開發(fā)的成功率。1.2.1典型的結(jié)構(gòu)化開發(fā)方法3.面向數(shù)據(jù)結(jié)構(gòu)的軟件開發(fā)方法(1)Jackson方法1975年,M.A.Jackson提出了一類至今仍廣泛使用的軟件開發(fā)方法。這一方法從目標系統(tǒng)的輸入、輸出數(shù)據(jù)結(jié)構(gòu)入手,導出程序框架結(jié)構(gòu),再補充其它細節(jié),就可得到完整的程序結(jié)構(gòu)圖。這一方法對輸入、輸出數(shù)據(jù)結(jié)構(gòu)明確的中小型系統(tǒng)特別有效,如商業(yè)應用中的文件表格處理。該方法也可與其它方法結(jié)合,用于模塊的詳細設計。Jackson方法也被稱為面向數(shù)據(jù)結(jié)構(gòu)的軟件設計方法。1.2.1典型的結(jié)構(gòu)化開發(fā)方法(2)Warnier方法1974年,J.D.Warnier提出的軟件開發(fā)方法與Jackson方法類似。差別有三點:1)使用的圖形工具不同,分別使用Warnier圖和Jackson圖;2)使用的偽碼不同;3)在構(gòu)造程序框架時,Warnier方法僅考慮輸入數(shù)據(jù)結(jié)構(gòu),而Jackson方法不僅考慮輸入數(shù)據(jù)結(jié)構(gòu),而且還考慮輸出數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。1.2.1典型的結(jié)構(gòu)化開發(fā)方法4.問題分析法PAM(ProblemAnalysisMethod)問題分析法80年代末由日立公司提出的一種軟件開發(fā)方法。PAM方法希望能兼顧Yourdon方法、Jackson方法和自底向上的軟件開發(fā)方法的優(yōu)點,而避免它們的缺陷。它的基本思想是:考慮到輸入、輸出數(shù)據(jù)結(jié)構(gòu),指導系統(tǒng)的分解,在系統(tǒng)分析指導下逐步綜合。1.2.1典型的結(jié)構(gòu)化開發(fā)方法4.問題分析法PAM(ProblemAnalysisMethod)問題分析法80年代末由日立公司提出的一種軟件開發(fā)方法。PAM方法希望能兼顧Yourdon方法、Jackson方法和自底向上的軟件開發(fā)方法的優(yōu)點,而避免它們的缺陷。它的基本思想是:考慮到輸入、輸出數(shù)據(jù)結(jié)構(gòu),指導系統(tǒng)的分解,在系統(tǒng)分析指導下逐步綜合。1.2.1典型的結(jié)構(gòu)化開發(fā)方法4.問題分析法這一方法的具體步驟是:從輸入、輸出數(shù)據(jù)結(jié)構(gòu)導出基本處理框;分析這些處理框之間的先后關系;按先后關系逐步綜合處理框,直到畫出整個系統(tǒng)的PAD圖??梢钥闯觯@一方法本質(zhì)上是綜合的自底向上的方法,但在逐步綜合之前已進行了有目的的分解,這個目的就是充分考慮系統(tǒng)的輸入、輸出數(shù)據(jù)結(jié)構(gòu)。1.2.1典型的結(jié)構(gòu)化開發(fā)方法4.問題分析法PAM方法的另一個優(yōu)點是使用了PAD圖。這是一種二維樹形結(jié)構(gòu)圖,是到目前為止最好的詳細設計表示方法之一,遠遠優(yōu)于NS圖和PDL語言。這一方法曾經(jīng)較為流行,軟件開發(fā)的成功率也很高。但由于在輸入、輸出數(shù)據(jù)結(jié)構(gòu)與整個系統(tǒng)之間同樣存在著鴻溝,這一方法仍只適用于中小型問題。1.2.1典型的結(jié)構(gòu)化開發(fā)方法4.問題分析法這些方法的出現(xiàn)和應用,成功地解決了當時軟件開發(fā)面臨的諸如可靠性和可維護性等各種問題。但隨著計算機硬件技術的發(fā)展、計算機應用的普及以及計算機應用領域和規(guī)模的不斷擴大,軟件的規(guī)模和復雜性也不斷隨之擴大和增強,原有的軟件開發(fā)方法也隨之出現(xiàn)了不相適應的情況。隨著以Smalltalk為代表的面向?qū)ο蟪绦蛟O計語言的出現(xiàn),面向?qū)ο蠓椒ǖ玫搅搜杆俚陌l(fā)展,而且這一方法已經(jīng)成為當前軟件開發(fā)的主流方法。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程面向?qū)ο蠓椒?Object-OrientedMethod)是一種把面向?qū)ο蟮乃枷霊迷谲浖_發(fā)過程中,并指導開發(fā)活動的系統(tǒng)方法。簡稱OO(Object-Oriented)方法,是一種建立在“對象”概念基礎上的方法學。所謂面向?qū)ο缶褪且詫ο蟾拍顬榛A,以對象為中心,以封裝、繼承、關聯(lián)、多態(tài)等特性為構(gòu)造機制,來認識、理解和描述客觀世界,并以此為基礎構(gòu)建相應的軟件系統(tǒng)。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程面向?qū)ο蠓椒ǖ幕境霭l(fā)點是盡可能按照人類認識問題和解決問題的方式方法來分析設計和實現(xiàn)需要的軟件系統(tǒng)。面向?qū)ο蠓椒ㄕJ為客觀世界是由各種事物和事物之間的聯(lián)系構(gòu)成的,并將客觀世界描述為對象和對象之間的關系。面向?qū)ο蠓椒ㄕ且詫ο笞鳛樽罨镜臉?gòu)成元素,它也是分析問題和解決問題的核心。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程面向?qū)ο笤O計技術是軟件技術的一次革命,在軟件開發(fā)史上具有重要的里程碑意義。面向?qū)ο蠓椒ǖ陌l(fā)展過程經(jīng)歷了從面向?qū)ο缶幊?、面向?qū)ο笤O計和面向?qū)ο蠓治龅陌l(fā)展過程,最終形成了基于對象模型技術的面向?qū)ο筌浖_發(fā)方法(ObjectModellingTechnique,OMT)[1]。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程OMT是目前公認的面向?qū)ο筌浖_發(fā)方法。這是一種采用了自底向上分析和自頂向下設計相結(jié)合的策略的分析和設計方法,它以對象建模為基礎,充分考慮了輸入、輸出數(shù)據(jù)結(jié)構(gòu),實際上也包含了所有對象的數(shù)據(jù)結(jié)構(gòu)。所以OMT方法徹底實現(xiàn)了PAM沒有完全實現(xiàn)的目標。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程不僅如此,面向?qū)ο蠹夹g在需求分析、可維護性和可靠性這三個軟件開發(fā)的關鍵環(huán)節(jié)和質(zhì)量指標上有了實質(zhì)性的突破,徹底地解決了在這些方面存在的嚴重問題,從而宣告了軟件危機末日的來臨。人們通常將面向?qū)ο蠓椒ǖ陌l(fā)展過程劃分為早期、發(fā)展和當前現(xiàn)狀等三個階段。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程1.早期階段面向?qū)ο蠓椒ǖ淖钤绯霈F(xiàn)并得到發(fā)展的標識是面向?qū)ο蟪绦蛟O計語言的出現(xiàn),這導致了新的面向?qū)ο蟪绦蛟O計方法的出現(xiàn)和發(fā)展。最早的面向?qū)ο笳Z言是1967年挪威計算中心的KistenNygaard和OleJohanDahl開發(fā)的Simula67語言,該語言首次引入了類的概念和繼承機制,它是面向?qū)ο蟮南闰?qū)。1972年PaloAlno研究中心(PARC)發(fā)布了Smalltalk72語言,其中正式使用了“面向?qū)ο蟆边@一術語。Smalltakl的問世標志著面向?qū)ο蟪绦蛟O計方法的正式形成。隨后的幾年中,PARC先后發(fā)布了Smalltalk72、76和78等多個版本,直至1981年推出該語言完善的版本Smalltalk80。Smalltalk80的問世被認為是面向?qū)ο笳Z言發(fā)展史上最重要的里程碑事件。Smalltalk80具備了迄今為止,絕大部分面向?qū)ο蟮幕靖拍罴捌渲С謾C制在。它是第一個完善的、能夠?qū)嶋H應用的面向?qū)ο笳Z言[1]。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程2.發(fā)展階段從20世紀80年代中期到90年代,是面向?qū)ο蟪绦蛟O計語言走向繁榮的重要階段。其主要的表現(xiàn)是大批實用的面向?qū)ο蟪绦蛟O計語言的涌現(xiàn),如C++、ObjectiveC、ObjectPascal、CLOS、Eiffel和Actor等,這使得面向?qū)ο蟪绦蛟O計語言的應用得到了迅速的普及。這些面向?qū)ο蟮木幊陶Z言又可以劃分純面向?qū)ο笮驼Z言和混合型面向?qū)ο笳Z言?;旌闲驼Z言是在傳統(tǒng)的結(jié)構(gòu)化程序設計語言基礎上增加了面向?qū)ο笳Z言成分形成的,例如C++,它們既支持傳統(tǒng)的結(jié)構(gòu)化程序設計,也支持面向?qū)ο蟮某绦蛟O計,其在實用性方面具有更大的靈活性。而純面向?qū)ο笮驼Z言則是所謂的純粹的面向?qū)ο笳Z言,這種語言僅支持面向?qū)ο蟮某绦蚪Y(jié)構(gòu)。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程2.發(fā)展階段目前,在面向?qū)ο缶幊谭矫?,大多?shù)面向?qū)ο笳Z言普遍采用了程序語言、類庫和可視化集成開發(fā)環(huán)境相結(jié)合的方式,如VisualC++、JBuilder和Delphi等。這極大地提高了程序設計的效率。客觀上也推動了面向?qū)ο笤O計和面向?qū)ο蠓治龇椒ǖ陌l(fā)展,使面向?qū)ο蠓椒〝U展到整個軟件生命周期的各個階段。到20世紀90年代,面向?qū)ο蟮姆治雠c設計方法已多達數(shù)十種,這些方法都各有所長。目前,統(tǒng)一建模語言已經(jīng)成為世界性的建模語言,適用于多種開發(fā)方法。把UML作為面向?qū)ο蟮慕UZ言,不但在軟件產(chǎn)業(yè)界獲得了普遍支持,在學術界也具有很大的影響。在面向?qū)ο筮^程指導方面,雖然目前還沒有統(tǒng)一的規(guī)范。但也已經(jīng)產(chǎn)生了一些具有相當大的影響力的面向?qū)ο筌浖_發(fā)的過程。例如,著名的統(tǒng)一軟件開發(fā)過程(RUP)。1.2.2面向?qū)ο蠓椒ǖ陌l(fā)展過程3.面向?qū)ο蠓椒ǖ漠斍艾F(xiàn)狀當前,面向?qū)ο蠓椒◣缀醺采w了計算機軟件領域的所有分支。這些分支包括面向?qū)ο蟮木幊陶Z言(OOP)、面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O計(OOD)、面向?qū)ο鬁y試(OOT)和面向?qū)ο缶S護(OOM)等軟件工程領域的分支,也包括圖形用戶界面設計(GUI)、面向?qū)ο髷?shù)據(jù)庫(OODB)、面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)(OODS)、面向?qū)ο蟮闹悄艹绦蛟O計、面向?qū)ο蟮能浖_發(fā)環(huán)境(OOSE)和面向?qū)ο蟮捏w系結(jié)構(gòu)(OOSA)等技術領域。此外,許多新領域都以面向?qū)ο罄碚摓榛A或主要技術,如面向?qū)ο蟮能浖w系結(jié)構(gòu)、領域工程、智能代理、面向構(gòu)件的軟件工程和面向服務的軟件開發(fā)等。1.2.3面向?qū)ο蟪绦蛟O計語言在面向?qū)ο蠓椒ǖ陌l(fā)展過程中,面向?qū)ο蟪绦蛟O計語言的出現(xiàn)和發(fā)展起到了十分重要的引領作用,同時語言本身也得到了不斷地發(fā)展。這些語言也不斷豐富和促進了面向?qū)ο蠓椒ǖ陌l(fā)展。1.2.3面向?qū)ο蟪绦蛟O計語言1.Simula語言1967年5月,挪威科學家Ole-JohanDahl和KristenNygaard正式發(fā)布了Simula67語言。之后,在1968年2月形成了Simula67的正式文本。Simula67被認為是最早的面向?qū)ο蟪绦蛟O計語言,它引入了對象、類和繼承等概念。這些概念構(gòu)成了后來出現(xiàn)的所有面向?qū)ο笳Z言都必須遵循的基礎概念,同時,這些概念也構(gòu)成了面向?qū)ο蠓椒ǖ暮诵母拍畹闹匾M成部分。Simula67的面向?qū)ο蟾拍畹挠绊懯亲罹薮蠖钸h的。它本身雖然因為比較難學、難用而未能廣泛流行,但在它的影響下所產(chǎn)生的面向?qū)ο蠹夹g卻迅速傳播開來,并在全世界掀起了一股面向?qū)ο蠹夹g熱潮,至今盛行不衰。面向?qū)ο蟪绦蛟O計在軟件開發(fā)領域引起了大的變革,極大地提高了軟件開發(fā)的效率,為解決軟件危機帶來了一線希望。1.2.3面向?qū)ο蟪绦蛟O計語言2.Smalltalk語言20世紀70年代到80年代前期,美國施樂公司的帕洛阿爾托研究中心(PARC)開發(fā)了Smalltalk編程語言。從Smalltalk-72、Smalltalk-78到Smalltalk-80,它們開發(fā)完成了整個Smalltalk系列,Smalltalk編程語言對近代面向?qū)ο缶幊陶Z言影響很大,所以稱之為“面向?qū)ο缶幊讨浮薄?.2.3面向?qū)ο蟪绦蛟O計語言2.Smalltalk語言與許多其它程序設計語言的不同之處在于,Smalltalk還具有如下幾個特點。1)Smalltalk是一種全新的純面向?qū)ο蟮某绦蛟O計語言。它是一種包含完整語法和語義的純面向?qū)ο蟮恼Z言。使用編譯器可以將Smalltalk源程序生成可以在虛擬機上運行的二進制代碼,Smalltalk語言本身非常精煉。1.2.3面向?qū)ο蟪绦蛟O計語言2.Smalltalk語言2)提供一個完整的程序開發(fā)環(huán)境Smalltalk附帶了一個巨大的標準類庫,這使得開發(fā)Smalltalk程序的效率非常高。甚至其它一些語言(如Ada,C和Pascal)中的部分功能(例如條件判斷,循環(huán)等)也被當成特定的Smalltalk類提供。1.2.3面向?qū)ο蟪绦蛟O計語言2.Smalltalk語言3)應用開發(fā)環(huán)境(ADE)由于Smalltalk的歷史原因,它具有一個非常優(yōu)秀的高度集成、開放的應用開發(fā)環(huán)境。由于開發(fā)環(huán)境中的瀏覽器、監(jiān)視器以及調(diào)試器都由同樣的源程序衍生出來的,不同的版本之間也具有相當好的兼容性。此外,這些工具的源程序都可以在ADE直接存取。1.2.3面向?qū)ο蟪绦蛟O計語言2.Smalltalk語言malltalk被公認為歷史上第二個面向?qū)ο蟮某绦蛟O計語言和第一個真正的集成開發(fā)環(huán)境(IDE)。是由AlanKay,DanIngalls,TedKaehler,AdeleGoldberg等于70年代初在XeroxPARC開發(fā)。Smalltalk對其它眾多的面向?qū)ο蟪绦蛘Z言的產(chǎn)生起到了極大的推動作用,如Objective-C、Actor、Java和Ruby等。90年代的許多軟件開發(fā)思想均得益于Smalltalk,例如設計模式(DesignPatterns),極限編程(ExtremeProgramming,XP)和軟件重構(gòu)(Refactoring)等。1.2.3面向?qū)ο蟪绦蛟O計語言3.C++程序設計語言由于C語言是一門通用的計算機編程語言,其應用十分廣泛。所以,面向?qū)ο笳Z言出現(xiàn)以后,出現(xiàn)了多種不同的基于C語言的面向?qū)ο笤O計語言。這些語言以C語言為基礎,以不同的方式擴充了對象的概念框架,從而構(gòu)成了不同的面向?qū)ο笳Z言。人們也將這種從C++擴充出來的語言稱為C族語言。常見的C族語言包括:ObjectC、C++、C#和Java等程序設計語言。1.2.3面向?qū)ο蟪绦蛟O計語言3.C++程序設計語言C++程序設計語言是對C語言的繼承,它既可以過程化編程,又可以基于對象編程,還可以進行以繼承和多態(tài)為特點的面向?qū)ο缶幊?,當然也可以混合編程。C++不僅擁有計算機高效運行的實用性特征,同時還致力于提高大規(guī)模程序的編程質(zhì)量與程序設計語言的問題描述能力。C++程序設計語言具有支持數(shù)據(jù)封裝藏、繼承、多態(tài)和重用等面向?qū)ο筇卣?。特別的是,C++還支持多繼承。1.2.3面向?qū)ο蟪绦蛟O計語言3.C++程序設計語言其主要優(yōu)點是,C++是在C語言的基礎上開發(fā)的一種面向?qū)ο缶幊陶Z言,其應用領域十分廣泛。C++語言靈活,運算符和數(shù)據(jù)結(jié)構(gòu)豐富、具有結(jié)構(gòu)化控制語句、程序執(zhí)行效率高,而且同時具有高級語言與匯編語言的優(yōu)點。C++的主要缺點是缺少自動垃圾回收機制,設計出來的軟件容易造成內(nèi)存泄漏(MemoryLeak)。從而影響軟件的可靠性。同時也是這一原因,使得優(yōu)秀的C++程序員成為稀缺資源。1.2.3面向?qū)ο蟪绦蛟O計語言4.C#程序設計語言C#程序設計語言是微軟公司開發(fā)的一種現(xiàn)代面向?qū)ο笄翌愋桶踩某绦蛟O計語言。C#不僅是一種面向?qū)ο蟮某绦蛟O計語言,C#也是一種對面向組件(Component-Oriented)的語言。現(xiàn)代軟件已經(jīng)越來越依賴這種具有自包含和自描述功能包形式的軟件組件。這種組件的關鍵之處在于,它們可以通過屬性、方法和事件等概念來提供編程模型;它們還具有提供關于組件的聲明性信息的特性;1.2.3面向?qū)ο蟪绦蛟O計語言4.C#程序設計語言C#語言提供的結(jié)構(gòu)成分直接支持組件及其相關概念,這使得C#語言自然而然成為創(chuàng)建和使用軟件組件的重要選擇。有助于構(gòu)造健壯、持久的應用程序。C#還提供了垃圾自動回收(Garbagecollection)、異常處理(ExceptionHandling)和類型安全(TypeSafe)等三大機制。1.2.3面向?qū)ο蟪绦蛟O計語言4.C#程序設計語言1)垃圾自動回收機制可以自動釋放不再使用的對象所占用的內(nèi)存,解決了C++的內(nèi)存泄漏問題;2)異常處理機制提供了結(jié)構(gòu)化和可擴展的錯誤檢測和恢復方法,為設計高可靠性的應用程序提供了語言基礎;3)類型安全機制可使設計出來的應用程序避免讀取未初始化的變量、數(shù)組索引超出邊界或執(zhí)行未經(jīng)檢查的類型強制轉(zhuǎn)換等特殊情形。1.2.3面向?qū)ο蟪绦蛟O計語言4.C#程序設計語言同一類型系統(tǒng)(UnifiedTypeSystem)所有的C#類型(包括諸如int和double之類的基元類型)都繼承于一個惟一的一個Object根類型。這使得所有類型的對象都共享一組通用操作,并且任何類型的值都能夠以一致的方式進行存儲、傳遞和操作。1.2.3面向?qū)ο蟪绦蛟O計語言4.C#程序設計語言C#同時支持用戶定義的引用類型和值類型,既允許對象的動態(tài)分配,也允許輕量級結(jié)構(gòu)的內(nèi)聯(lián)存儲。為了確保C#程序和庫能夠以兼容的方式逐步演進,C#的設計中充分強調(diào)了版本控制(Versioning)。C#的設計在某些方面直接考慮到版本控制的需要,其中包括單獨使用的virtual和override修飾符、方法重載決策規(guī)則以及對顯式接口成員聲明的支持。1.2.3面向?qū)ο蟪绦蛟O計語言5.Java程序設計語言Java語言具有很多與當今使用的大多數(shù)編程語言相通的特性。Java語言與C++和C#程序設計語言有很多的相似之處,其本身就是用相似的C和C++結(jié)構(gòu)設計的。Java語言最初的目標只是為了給萬維網(wǎng)創(chuàng)建Applet工具而定義的一種語言。Applet是一種運行在Web頁面中的小應用程序。下載之后,它可以在不使用Web服務器資源的情況下,在瀏覽器頁面中執(zhí)行任務并與用戶進行交互。1.2.3面向?qū)ο蟪绦蛟O計語言5.Java程序設計語言Java語言對于Web這樣的分布式網(wǎng)絡環(huán)境確實有非常重要的價值。然而,它已經(jīng)遠遠超越了這個領域,成為了一種強大的通用編程語言,適用于構(gòu)建各種不依賴于網(wǎng)絡特性的應用,并可滿足其它應用的不同需求。它在遠程主機上以安全的方式執(zhí)行下載代碼的能力正是許多組織的關鍵需求。1.2.3面向?qū)ο蟪绦蛟O計語言5.Java程序設計語言有些團隊甚至將Java作為一種通用編程語言,用于開發(fā)對機器無關性要求不高的項目。Java語言易于編程,安全性強,可用于快速地開發(fā)工作代碼。它同樣具有垃圾回收和類型安全引用這樣的特性,某些常見的編程錯誤在Java中是不會發(fā)生的。對多線程的支持滿足了基于網(wǎng)絡和圖形化用戶界面的現(xiàn)代應用的需要,因為這些應用必須同時執(zhí)行多個任務;而異常處理機制使得處理錯誤情況的任務變得簡單易行。盡管其內(nèi)置工具非常強大,Java依然是一種簡單的語言,程序員可以很快就精通它。1.2.3面向?qū)ο蟪绦蛟O計語言以上簡單介紹了Simula、Samlltalk、C++、C#和Java等幾種典型的面向?qū)ο蟪绦蛟O計語言及其特性。這些語言中,目前最流行的是C++、C#和Java這三種程序設計語言。這幾種程序設計語言通常被作為軟件開發(fā)項目的首選語言。除了上述介紹的面向?qū)ο蟪绦蛟O計語言之外,還有一些所謂的基于對象的程序設計語言,例如PowerBuilder和VisualBasic等。事實上,在實際的軟件項目開發(fā)過程中,每種語言都有不同的編譯器版本、集成環(huán)境和資源庫等多方面的選擇,但所有這些選擇所依據(jù)的面向?qū)ο笏枷牒烷_發(fā)方法都是基本相同的,或是語言無關的。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法面向?qū)ο蠓椒ǖ漠a(chǎn)生和發(fā)展同樣也經(jīng)歷一個比較漫長的過程。在這個過程中,首先出現(xiàn)的是面向?qū)ο蟪绦蛟O計語言和面向?qū)ο蟪绦蛟O計方法(OOP,ObjectOrientedProgramming),然后是面向?qū)ο笙到y(tǒng)設計(OOD,ObjectOrientedDesign),最后形成的是面向?qū)ο蠓治觯∣OA,ObjectOrientedAnalysis),隨后逐漸出現(xiàn)了面向?qū)ο鬁y試(OOT,ObjectOrientedTesting)、面向?qū)ο蠖攘浚∣OS,ObjectOrientedSoftwareMeasurement)和面向?qū)ο蠊芾恚∣OM,ObjectOrientedManagement)等面向?qū)ο箝_發(fā)方法和技術。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法典型的面向?qū)ο蠓椒ò–oad-Yourdon方法、Rumbaugh方法、Booch方法、Wirfs-Brock方法、Jacobson方法和VMT(VisualModelingTechnique)方法等方法。這些方法既有聯(lián)系又相互區(qū)別,所有這些方法相互補充相互融合,構(gòu)成了現(xiàn)代的面向?qū)ο箝_發(fā)方法。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法Coad-Yourdon方法是由PeterCoad和EdwardYourdon在1991年提出的,是一種漸進的面向?qū)ο蠓治雠c設計方法。Coad-Yourdon方法將整個開發(fā)過程劃分為分析和設計兩個階段。在分析階段,主要利用定義主題、發(fā)現(xiàn)和標識對象、標識服務、標識結(jié)構(gòu)和標識屬性等五個層次的活動來定義和描述系統(tǒng)的結(jié)構(gòu)和行為。在設計階段中,則在將系統(tǒng)劃分為問題論域、用戶界面、任務管理和數(shù)據(jù)管理等四個組成部分的基礎上,持續(xù)和細化這五個層次的活動,完成整個系統(tǒng)的設計。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法Coad-Yourdon方法中涉及到的主要概念如下:(1)主題層主題是對目標系統(tǒng)的結(jié)構(gòu)和行為的一種較高層次的抽象,可以看成是一組關系密切的類組成的集合。將一個系統(tǒng)劃分成若干個主題,可以看成是對系統(tǒng)結(jié)構(gòu)進行的一個劃分,不同的類(或?qū)ο螅┙M合構(gòu)成不同的主題,所有主題構(gòu)成了系統(tǒng)的主題層。主題層的主要工作就是通過定義目標系統(tǒng)的主題實現(xiàn)對系統(tǒng)結(jié)構(gòu)的劃分,給出系統(tǒng)的整體框架,從而建立系統(tǒng)結(jié)構(gòu)的概念模型。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(2)對象層對象層的主要工作是發(fā)現(xiàn)和描述對象和類,這可以從應用領域開始,逐步發(fā)現(xiàn)和識別基礎類和對象,以確定形成整個應用的基礎。這個層次的活動要通過分析問題域中目標系統(tǒng)的責任、環(huán)境以及系統(tǒng)與環(huán)境之間的關系,從而確定對系統(tǒng)有用的類、對象及其責任。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(3)服務層一個對象對外提供的服務是指對象收到消息后所執(zhí)行的操作,它描述了系統(tǒng)需要執(zhí)行的功能和處理。定義服務的目的在于定義對象的行為之間的消息鏈接。其具體步驟包括標識對象狀態(tài)、標識必要的服務、標識消息鏈接和對服務的描述。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(4)結(jié)構(gòu)層面向?qū)ο笙到y(tǒng)的結(jié)構(gòu)通常表現(xiàn)為層次結(jié)構(gòu)。典型的層次結(jié)構(gòu)包括一般與特殊的類層次結(jié)構(gòu)和整體與部分之間的對象層次結(jié)構(gòu)。類層次結(jié)構(gòu)也就是所謂的繼承結(jié)構(gòu)。對象層次結(jié)構(gòu)主要表現(xiàn)為對象的組合、聚合、關聯(lián)甚至是依賴等關系。這種結(jié)構(gòu)通常被用來表示一個對象如何成為另一個對象的一部分,以及如何將多個對象組裝成更大的對象。結(jié)構(gòu)層活動的主要工作內(nèi)容就是對這兩種結(jié)構(gòu)進行識別和標識1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(5)屬性層屬性所描述的主要是對象的狀態(tài)信息,在任何對象中,屬性值表示了該對象的狀態(tài)信息。屬性層的活動中,需要為每個對象找出其在目標系統(tǒng)中所需要的屬性,而后將屬性安排到適當?shù)奈恢?,找出實例鏈接,最后進行檢查對每個屬性應該給出描述,并確定其屬性的名字和屬性的描述與存在哪些特殊的限制(如只讀、屬性值限定于某個范圍之內(nèi)等)。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法Coad-Yourdon方法將系統(tǒng)設計的任務劃分為數(shù)據(jù)管理、任務管理、問題域和人機交互子系統(tǒng)等四個子系統(tǒng)的設計。(1)數(shù)據(jù)管理子系統(tǒng)數(shù)據(jù)管理子系統(tǒng)是指系統(tǒng)中專門用于實現(xiàn)數(shù)據(jù)管理功能的子系統(tǒng)。其主要功能就是實現(xiàn)系統(tǒng)的數(shù)據(jù)存儲,一方面,規(guī)范數(shù)據(jù)的存儲和操作方式,提高數(shù)據(jù)訪問的通用性;另一方面,保證數(shù)據(jù)存儲的安全性、訪問的并發(fā)性、較好的可維護性等。數(shù)據(jù)管理部分的設計包括操作設計和數(shù)據(jù)存儲的設計兩部分。設計數(shù)據(jù)存儲設計要根據(jù)所使用的數(shù)據(jù)存儲管理模式來定。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(2)任務管理子系統(tǒng)任務也稱為進程,就是執(zhí)行一系列活動的一段程序,當系統(tǒng)中有許多并發(fā)任務時,需要依照各個行為的協(xié)調(diào)關系進行任務劃分,所以,任務管理主要是對系統(tǒng)各種任務進行選擇和調(diào)整的過程。采用面向?qū)ο蟪绦蛟O計方式,每一個對象都是一個獨立實體,因此,從概念上講,不同對象是可以并發(fā)工作的,但在實際系統(tǒng)中,許多對象之間往往存在相互依賴關系,而且多個對象可能是由一個處理器處理的。所以,設計任務管理工作時,主要是確定對象之間的關系,包括選擇必須同時動作的對象,以及對相互排斥的對象的處理進行調(diào)整。根據(jù)對象完成的任務及對象之間的關系,進一步設計任務管理子系統(tǒng)。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(3)問題域子系統(tǒng)問題域子系統(tǒng)設計的主要工作則是對在分析階段獲得的需求模型進行進一步的細化。在分析階段,通過詳細分析,已獲得了問題域的基本模型。進入設計階段后,則要根據(jù)所選擇的開發(fā)環(huán)境和系統(tǒng)的運行環(huán)境以及其它技術和管理約束等因素,對分析模型進行細化和完善。1.2.4典型的面向?qū)ο蟮拈_發(fā)方法1.Coad-Yourdon方法(4)人機界面子系統(tǒng)人機界面系統(tǒng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論