面向?qū)ο蟮能浖_發(fā)
1 歷史回顧
針對日趨復雜的軟件需求的挑戰(zhàn),軟件業(yè)界發(fā)展出了面向?qū)ο?OO)的軟件開發(fā)模式。目前作為針對“軟件危機”的最佳對策,OO技術已經(jīng)引起人們的普遍關注。最初被多數(shù)人看作只是一種不切實際的方法和滿足一時好奇心的研究,現(xiàn)在得到了人們近乎狂熱的歡迎。許多編程語言都推出了支持面向?qū)ο蟮男掳姹尽4罅康拿嫦驅(qū)ο蟮拈_發(fā)方法被提出來。關于OO的會議、學術研討班和課程極受歡迎。無數(shù)專業(yè)的學術期刊都為這一話題開辟了專門的版面。一些軟件開發(fā)合同甚至也指明了必須使用OO的技術和語言。面向?qū)ο蟮能浖_發(fā)對于90年代,就向是結(jié)構化的軟件開發(fā)對于70年代那樣讓人著迷,而且OO的發(fā)展勢頭還在日益加速。
諸如“對象”和“對象的屬性”這樣的概念,可以一直追溯到1950年代初。它們首先出現(xiàn)于關于人工智能的早期著作中。然而,OO的實際發(fā)展卻是始于1966年 (當年文化大革命在中國爆發(fā)) 。 當時Kisten Nygaard和Ole-Johan Dahl開發(fā)了具有更高級抽象機制的Simula語言。Simula提供了比子程序更高一級的抽象和封裝;為仿真一個實際問題,引入了數(shù)據(jù)抽象和類的概念。 大約在同一時期,Alan Kay正在尤他大學的一臺個人計算機上努力工作,他希望能在其上實現(xiàn)圖形化和模擬仿真。盡管由于軟硬件的限制,Kay的嘗試沒有成功,但他的這些想法并沒有丟失。70年代初期,他加入了Palo Alto研究中心(PARC),再次將這些想法付諸實施。
在PARC,他所在的研究小組堅信計算機技術是改善人與人、人與機器之間通訊渠道的關鍵。在這信念的支持下,并吸取了Simula的類的概念,他們開發(fā)出Smalltalk語言;1972年PARC發(fā)布了Smalltalk的第一個版本。大約在此時,“面向?qū)ο?rdquo;這一術語正式確定。Smalltalk被認為是第一個真正面向?qū)ο蟮恼Z言。 Smalltalk 的目標是為了使軟件設計能夠以盡可能自動化的單元來進行。在Smalltalk中一切都是對象-----即某個類的實例。最初的Smalltalk的世界中,對象與名詞緊緊相連。Smalltalk還支持一個高度交互式的開發(fā)環(huán)境和原型方法。這一原創(chuàng)性的工作開始并未發(fā)表,只是視為帶濃厚試驗性質(zhì)的學術興趣而已。
Smalltalk-80是PARC的一系列Smalltalk版本的總結(jié),發(fā)布于1981年。1981年8月的<<BYTE>>雜志公布了Smalltalk開發(fā)組的重要結(jié)果。在這期雜志的封面圖上,一個熱氣球正從一個孤島上冉冉升起來,標志著PARC的面向?qū)ο笏枷氲膯⒑健T撌窍蜍浖_發(fā)界公開發(fā)表的時候了。起初,影響只是漸進式的,但很快就躍升到火爆的程度。熱氣球確實啟航了,而且影響深遠。早期Smalltalk關于開發(fā)環(huán)境的研究導致了后來的一系列進展:窗口(window),圖標(icon),鼠標(mouse)和下拉式window環(huán)境。Smalltalk語言還影響了80年代早期和中期的面向?qū)ο蟮恼Z言,如:Object-C(1986), C++(1986), Self(1987),Eiffl(1987),Flavors(1986). 面向?qū)ο蟮膽妙I域也被進一步拓寬。對象不再僅僅與名詞相聯(lián)系,還包括事件和過程。1980 Grady Booch首先提出面向?qū)ο笤O計(OOD)的概念。然后其他人緊隨其后,面向?qū)ο蠓治龅募夹g開始公開發(fā)表。1985年,第一個商用面向?qū)ο髷?shù)據(jù)庫問世。1990年代以來,面向?qū)ο蟮姆治觥y試、度量和管理等研究都得到長足發(fā)展。目前對象技術的前沿課題包括設計模式(design patterns)、分布式對象系統(tǒng)和基于網(wǎng)絡的對象應用等。
2 動因
為什么面向?qū)ο筮\動發(fā)展到了現(xiàn)在這樣火暴的程度?部分是源于人們長久以來的一個希望:人們希望它,象以前其他的軟件開發(fā)技術一樣,能夠滿足軟件開發(fā)對于生產(chǎn)效率、可靠性、易維護性、易管理等方面的更高、更快、更強的迫切需求。除此之外,還有許多原因都促使了它的流行。
面向?qū)ο蟮拈_發(fā)強調(diào)從問題域的概念到軟件程序和界面的直接映射;心理學的研究也表明,把客觀世界看成是許多對象更接近人類的自然思維方式。對象比函數(shù)更為穩(wěn)定;軟件需求的變動往往是功能相關的變動,而其功能的執(zhí)行者----對象----通常不會有大的變動。另外,面向?qū)ο蟮拈_發(fā)也支持、鼓勵軟件工程實踐中的信息隱藏、數(shù)據(jù)抽象和封裝。在一個對象內(nèi)部的修改被局部隔離。面向?qū)ο箝_發(fā)的軟件易于修改、擴充和維護。
面向?qū)ο笠脖粩U充應用于軟件生命周期的各個階段---從分析到編碼。而且,面向?qū)ο蟮姆椒ㄗ匀欢坏刂С挚焖僭头ê蚏AD(Rapid Application Development)。面向?qū)ο箝_發(fā)的使用鼓勵重用,不僅軟件的重用,還包括分析、設計的模型的重用。更進一步,OO技術還方便了軟件的互換性,即,網(wǎng)絡中一個節(jié)點上應用能夠利用另一個節(jié)點上的資源。面向?qū)ο蟮拈_發(fā)還支持并發(fā)、層次和復雜等一些在目前的軟件系統(tǒng)中常見的現(xiàn)象。今天我們常常會需要建造一些軟件系統(tǒng)----不止是一黑盒應用。這些復雜系統(tǒng)通常包含由多個子系統(tǒng)組成的層次結(jié)構。面向?qū)ο蟮拈_發(fā)支持開放系統(tǒng)的建設;利用不同的應用來進行軟件集成有了更大的柔性。最后,面向?qū)ο箝_發(fā)的使用可以減小開發(fā)復雜系統(tǒng)所面臨的危險,主要是因為系統(tǒng)集成遍布軟件生命周期的各個階段。
3 面向?qū)ο蟮慕?nbsp;
面向?qū)ο蟮慕2粌H僅是新的編程語言的匯總。它是一種新的思維方式,一種關于計算和信息結(jié)構化的新思維。面向?qū)ο蟮慕#严到y(tǒng)看做是相互協(xié)作的對象,這些對象是結(jié)構和行為的封裝,都屬于某個類,那些類具有某種層次化的結(jié)構。系統(tǒng)的所有功能通過對象之間相互發(fā)送消息來獲得。面向?qū)ο蟮慕?梢砸暈槭且粋€包含以下元素的概念框架:抽象、封裝、模塊化、層次、分類、并行、穩(wěn)定、可重用和可擴展性。
面向?qū)ο蟮慕5某霈F(xiàn)并不能算是一場計算革命。更恰當?shù)刂v,它是面向過程和嚴格數(shù)據(jù)驅(qū)動的軟件開發(fā)方法的漸進演變結(jié)果。軟件開發(fā)的新方法受到來自兩個方面的推動:編程語言的發(fā)展和日趨復雜的問題域的需求驅(qū)動。盡管在實際中分析和設計在編程階段之前進行,但從發(fā)展歷史看卻是編程語言的革新帶來設計和分析技術的改變。同樣,語言的演變也是對計算機體系的增強和需求的日益復雜的自然響應。
影響OO產(chǎn)生的諸多因素中,最重要的可能要算是編程方法的進步了。在過去的幾十年中,編程語言中對抽象機制的支持已經(jīng)發(fā)展到了一個較高的水平。這種抽象的進化從地址(機器語言)到名字(匯編語言),到表達式(第一代高級語言,如Fortran),到控制(第二代高級語言,如Cobol),到過程和函數(shù)(第二代和早期第三代高級語言,如Pascal),到模塊和數(shù)據(jù)(晚期第三代高級語言,如modula),最后到對象(基于對象和面向?qū)ο蟮恼Z言)。Smalltalk和其他面向?qū)ο笳Z言的發(fā)展使得新的分析和設計的技術的實現(xiàn)成為可能。
這些新的OO的技術實際上是結(jié)構化和數(shù)據(jù)庫方法的融合。OO的方法中,小范圍內(nèi)對面向數(shù)據(jù)流的關注,如偶合和聚合,也是很重要的。同樣,對象內(nèi)部的行為最終也需要面向過程的設計方法。數(shù)據(jù)庫技術中的實體-關系(ER圖)的數(shù)據(jù)建模思想也在 OO的方法中得以體現(xiàn)。
計算機硬件體系結(jié)構的進步,性能價格比的提高和硬件設計中對象概念的引入都對OO的發(fā)展產(chǎn)生了一定的影響。OO的程序通常要更加頻繁地訪問內(nèi)存,需要更高的處理速度。他們需要并且也正在利用強大的計算機硬件功能。哲學和認知科學的層次和分類理論也促進了OO的產(chǎn)生和發(fā)展。最后,計算機系統(tǒng)不斷增長的規(guī)模、復雜度和分布性都對OO技術起了或多或少的推動作用。
因為影響OO發(fā)展的因素很多,OO技術本身還未成熟,所以在思想和術語上有很多不同的提法。所有的OO語言并非生而平等,他們在術語、概念的運用上也各不相同。盡管也存在統(tǒng)一的趨勢,但就如何進行面向?qū)ο蟮姆治觥⒃O計而言還沒有完全達成共識,更沒有統(tǒng)一的符號來描述這些活動。(說明:UML正在朝這方向努力) 但是,OO的開發(fā)已經(jīng)在以下領域被證明是成功的:空中交通管理、動畫設計、銀行、商業(yè)數(shù)據(jù)處理、命令和控制系統(tǒng)、CAD、CIM、數(shù)據(jù)庫、專家系統(tǒng)、圖象識別、數(shù)學分析、音樂合成、操作系統(tǒng)、過程控制、空間站軟件、機器人、遠程通訊、界面設計和VLSI設計。毫無疑問,OO技術的應用已經(jīng)成為軟件工業(yè)發(fā)展的主流。
4 面向?qū)ο缶幊?nbsp;
<1> 概念
在面向?qū)ο缶幊讨校绦虮豢醋魇窍嗷f(xié)作的對象集合,每個對象都是某個類的實例,所有的類構成一個通過繼承關系相聯(lián)系的層次結(jié)構。面向?qū)ο蟮恼Z言常常具有以下特征:對象生成功能、消息傳遞機制、類和遺傳機制。這些概念當然可以并且也已經(jīng)在其他編程語言中單獨出現(xiàn),但只有在面向?qū)ο笳Z言中,他們才共同出現(xiàn),以一種獨特的合作方式互相協(xié)作、互相補充。
過程化編程模式: 參數(shù)輸入----- | 代 碼 | ------結(jié)果輸出
為實現(xiàn)某個功能,參數(shù)被傳入某個處理過程,最后傳回計算結(jié)果。
| 對象------ 數(shù)據(jù)結(jié)構 面向?qū)ο缶幊棠J剑?nbsp;
界面 | 對象------ 和
| 對象------ 操作
OOP中,功能是通過與對象的通訊獲得的。對象可以被定義為一個封裝了狀態(tài)和行為的實體;或者說是數(shù)據(jù)結(jié)構(或?qū)傩裕┖筒僮鳌顟B(tài)實際上是為執(zhí)行行為而必須存于對象之中的數(shù)據(jù)、信息。對象的界面,也可稱之為協(xié)議,是一組對象能夠響應的消息的集合。 消息是對象通訊的方式,因而也是獲得功能的方式。對象受到發(fā)給他的消息后,或者執(zhí)行一個內(nèi)部操作(有時成為方法或過程),或者再去調(diào)用其他對象的操作。所有對象都是類的實例。類是具有相同特點的對象的集合,或者也可以說,類是可用于產(chǎn)生對象的一個模版。對象響應一個消息而調(diào)用的方法,由接受該消息的對象自己決定。 類可以以一種層次結(jié)構來安排。在這個層次結(jié)構中,子類可以從比他高的超類中繼承得到狀態(tài)和方法。當對象接收到一個消息后,尋找相應的方法的過程將在從該對象的類開始,并在該類所處的層次結(jié)構中展開,最后,直到找著該方法,或者什么也沒找到(將會報錯)。在某些語言中,一個給定的類可以從不止一個超類中繼承,稱之為多繼承。如果采用動態(tài)聯(lián)編,繼承就導致了多態(tài)性。多態(tài)性描述的是如下現(xiàn)象:如果幾個子類都重新定義了超類的某個函數(shù)(都用相同的函數(shù)名),當消息被發(fā)送到一個子類對象時,在執(zhí)行時該消息會由于子類確定的不同而被解釋為不同的操作。 方法也可以被包括在超類的界面中被子類繼承,而實際上并不去真正定義他。這樣的超類也叫抽象類。抽象類不能被實例化,因此也就只能被用于產(chǎn)生子類。
<2> 語言
面向?qū)ο蟮恼Z言包含4個基本的分支:
1 基于Smalltalk的; 包括smalltalk的5個版本,以Smalltalk-80為代表。
2 基于C的; 包括 objective-C, C++, Java
3 基于LISP的; 包括 Flavors, XLISP, LOOPS, CLOS
4 基于PASCAL的。包括 Object Pascal, Turbo Pascal, Eiffel, Ada 95
Simula實際上是所有這些語言的老祖宗。在這些OO語言中,術語的命名和支持OO的能力都有不同程度的差別。 盡管Smalltalk-80不支持多繼承,它仍被認為是最面向?qū)ο蟮恼Z言(the truest OO language)。
在基于C的OO語言中,Object-C 是Brad Cox開發(fā)的,它帶有一個豐富的類庫,已經(jīng)被成功用于大型系統(tǒng)的開發(fā)。C++是由貝爾實驗室的Bjarne Stroustrup寫的。它將C語言中的STRUCT 擴展為 具有數(shù)據(jù)隱藏功能的CLASS。多態(tài)性通過虛函數(shù)(virtual functions)來實現(xiàn)。C++ 2.0 支持多繼承。在多數(shù)軟件領域,尤其是Unix平臺上,C++都是首選的面向?qū)ο缶幊陶Z言。 同C和C++相類似的新一代基于Internet的面向?qū)ο笳Z言Java是由Sun microsystems研制的。它于1995年伴隨著Internet的崛起而風靡一時。用Java寫的applets可以嵌入HTML中被解釋執(zhí)行,這使它具備了跨平臺特性。Java和Ada一樣支持多線程和并發(fā)機制,又象C一樣簡單、便攜。
基于LISP的語言,多被用于知識表達和推理的應用中。其中CLOS(Common LISP Object System)是面向?qū)ο驦ISP的標準版。
在基于Pascal的語言中,Object Pascal是由Apple和Niklaus Wirth為Macintosh開發(fā)的,它的類庫是MacApp。Turbo Pascal 是Borland公司以Object Pascal為范本開發(fā)的。
Eiffel由交互軟件工程公司的Bertrand Meyer于1987年發(fā)布的。它的語法類似Ada,運行于Unix環(huán)境。Ada在1983年剛出來時并不支持繼承和多態(tài)性,因而不是面向?qū)ο蟮摹5搅?995年,一個面向?qū)ο蟮腁da終于問世,這就是Ada 95。
除了上述的面向?qū)ο蟮恼Z言之外,還有一些語言被認為是基于對象(Object-based)的。它們是:Alphard, CLU, Euclid, Gypsy, Mesa, Modula。
5 面向?qū)ο蟮能浖こ?nbsp;
生命周期
盡管面向?qū)ο蟮恼Z言正在取得令人激動的進展,但我們都知道,編碼并非是軟件開發(fā)中的問題的主要來源。相比之下,需求和分析的問題更加普遍,而且它們的糾錯代價更加昂貴。因此, 對OO開發(fā)技術的關注就不能僅僅集中在編碼上面,更應集中關心軟件工程的其他方面。OO方法在處理復雜系統(tǒng)的分析和設計、分析和設計的重用方面的應用前景也是非常可觀。如果我們承認OO的軟件開發(fā)不僅僅局限于編碼活動,那么就必須采用一種全新的開發(fā)模式,包括新的軟件生命周期。 目前最常見的生命周期是“瀑布”模型(結(jié)構化)。它是在60年代末“軟件危機”后出現(xiàn)的第一個生命周期模型。如下所示。
分析 ----- 設計 ----- 編碼 ----- 測試 ------ 維護
如圖所示,瀑布式生命周期的開發(fā)過程是順序行進的;活動流向基本是單向的。它假設開發(fā)者在開發(fā)初期對系統(tǒng)的了解足夠清楚。不幸的是,任何軟件開發(fā)活動都不可避免地要涉及大量迭代過程,無論你事先是否安排。好的設計人員指的是那些能同時在抽象的層面和具體的細節(jié)上進行工作的實踐家。總的來說,瀑布式生命周期的缺點表現(xiàn)在三個方面:<1> 后期的變化、迭代、改動困難 <2> 不支持重用 <3> 沒有一個聯(lián)系各個階段的統(tǒng)一模型。
面向?qū)ο蟮姆椒◤膯栴}模型開始,然后就是識別對象、不斷細化的過程。它從本質(zhì)上就是迭代的和漸增的。在這里,快速原型和反饋環(huán)路是必需的標準結(jié)構。開發(fā)過程就是一次次的迭代反復過程。隨著迭代的進行,系統(tǒng)的功能不斷完善。這里,傳統(tǒng)的開發(fā)模式中在分析、設計和編碼等各個階段之間的明顯界限變得模糊起來。其原因是因為對象的概念彌漫了整個開發(fā)過程。對象和它們之間的關系成為分析、設計和編碼等各個階段的共同表達媒介。開發(fā)的重心從編碼向分析偏移,從功能為中心向數(shù)據(jù)為中心偏移。而且,面向?qū)ο箝_發(fā)的迭代和無縫性使得重用變得更加自然。
近來,為改善面向?qū)ο箝_發(fā)的可管理性,玻姆(Boehm,1988)提出了一個結(jié)合了宏觀和微觀視角(macro & microview)的螺旋開發(fā)模型。宏觀包括3個階段:1分析---發(fā)現(xiàn)和識別對象;2 設計---發(fā)明和設計對象;3 實施---創(chuàng)建和實現(xiàn)對象。每個宏觀階段都包含一些微觀迭代活動。
6 OOA和OOD
由于面向?qū)ο蟮募夹g還比較新,目前存在許多種面向?qū)ο蟮姆治龊驮O計方法。面向?qū)ο蟮姆治?OOA)建立于以前的信息建模技術的基礎之上,可以定義為是一種以從問題域詞匯中發(fā)現(xiàn)的類和對象的概念來考察需求的分析方法。OOA的結(jié)果是一系列從問題域?qū)С龅?ldquo;黑箱”對象。OOA通常使用“劇情(scenarios)”來幫助確定基本的對象行為。一個劇情是發(fā)生在問題域的一個連續(xù)的活動序列。在對一個給定的問題域進行 OOA時,“框架”(Frameworks)的概念非常有用。框架是應用或應用子系統(tǒng)的骨架,包含一些具體或者抽象的類。或者說,框架是一個特定的層次結(jié)構,包含描述某一問題域的抽象父類。當下流行的所有的OOA方法的一個缺點就是他們都缺乏一種固定的模式(formality)。
在面向?qū)ο蟮脑O計(OOD)階段,注意的焦點從問題空間轉(zhuǎn)移到了解空間。OOD是一種包含對所設計系統(tǒng)的邏輯的和物理的過程描述,以及系統(tǒng)的靜態(tài)和動態(tài)模型的設計方法(Booch,1994)。
在OOA和OOD中,都存在著對重用性的關注。目前,OO技術的研究人員們正在嘗試定義“設計模式(design patterns)”這一概念。它是一種可重用的“財富”,可以應用于不同的問題域。通常,設計模式指的是一種多次出現(xiàn)的設計結(jié)構或解決方案。如果對他們進行系統(tǒng)的歸類,即可被重用,可以構成不同設計之間通信的基礎。
OOD技術實際上早于OOA技術而出現(xiàn)。目前在OOA和OOD已經(jīng)很難畫出一條清晰的界限。因此,下面的描述給出一些常用的OOA/OOD技術的(聯(lián)合)概貌。
Meyer 用語言作為表達設計的工具。(1988)
Booch的OOD技術擴展了他以前在Ada方面的工作。他采用一種“反復綜合(round-trip gestalt)”的方法,包括以下過程:識別對象,識別對象的語義,識別對象之間的關系,進行實施,同時包含一系列迭代。Booch是最先使用類圖,類分類圖,類模板和對象圖來描述OOD的人(1991)。
Wrifs-Brock's的OOD技術是由職責代理來驅(qū)動的。類職責卡(Class Responsibilities Cards)被用來記錄負責特定功能的類。在確定了類及其職責之后,再進行更詳細的關系分析和子系統(tǒng)的實施。(1990)
Rumbaugh使用3種模型來描述一個系統(tǒng):1 對象模型,描述系統(tǒng)中對象的靜態(tài)結(jié)構;2 動態(tài)模型,描述系統(tǒng)狀態(tài)隨時間變化的情況;3 功能模型,描述系統(tǒng)中各個數(shù)據(jù)值的轉(zhuǎn)變。對象圖,狀態(tài)轉(zhuǎn)換圖和數(shù)據(jù)流圖分別被用于描述這3個模型。(1991)
Coad和Yourdon采用以下的OOA步驟來確定一個多層OO模型(5個層次):找出類和對象,識別結(jié)構和關系,確定主題,定義屬性,定義服務。5個步驟分別對應模型的5個層次,即類和對象層,主題層,結(jié)構層,屬性層和服務層。他們的OOD方法既是多層次的又是多方面的(multicomponent)。層次機構和OOA一樣。多方面包括:問題域,人與人的交互,任務管理和數(shù)據(jù)管理。
Ivar Jacobson 提出了Objectory方法(或Jacbson法),一種他在瑞典Objective系統(tǒng)中開發(fā)的面向?qū)ο筌浖こ谭椒āacbson的方法特別強調(diào)了“Use Case”的使用。 Use Case成為分析模型的基礎,用交互圖(Interaction Diagram)進一步描述后就形成設計的模型。Use cases同時也驅(qū)動測試階段的測試工作。到目前為止,Jacbson法是最為完整的工業(yè)方法。 (1992)
以上所述的方法還有許多的變種,無法一一列出。近年來,隨著各種方法的演變,它們之間也互相融合。1995年,Booch,Rumbaugh和Jacbson聯(lián)手合作,提出了第一版的UML(Unified Modelling Language),一體化建模語言。(目前已經(jīng)成為OO建模語言的事實標準)
7 管理問題
當組織向面向?qū)ο蟮拈_發(fā)技術轉(zhuǎn)向時,支持軟件開發(fā)的管理活動也必然要有所改變。承諾使用OO技術即意味要改變開發(fā)過程,資源和組織結(jié)構。(Goldberg 1995) OO開發(fā)的迭代、原型以及無縫性消除了傳統(tǒng)開發(fā)模式不同階段之間的界限。新的界限必須被重新確定。同時,一些軟件測度的方法也不在適用了。“代碼行數(shù)”LOC(Lines of Code)絕對過時了。重用類的數(shù)目,繼承層次的深度,類與類之間關系的數(shù)目,對象之間的耦合度,類的個數(shù)以及大小顯得更有意義。在OO的軟件測度方面的工作還是相當新的,但也已經(jīng)有了一些參考文獻。(Lorenz 1993)
資源分配和人員配置都需要重新考慮。開發(fā)小組的規(guī)模逐步變小,擅長重用的專家開始吃香。重點應該放在重用而非LOC上。重用的真正實現(xiàn)需要一套全新的準則。在執(zhí)行軟件合同的同時,庫和應用框架也必須建立起來。長期的投資策略,以及對維護這些可重用財富的承諾和過程,變的更加重要。
至于軟件質(zhì)量保證,傳統(tǒng)的測試活動仍是必須的,但它們的計時和定義必須有所改變。例如,將某個功能“走一遍”將牽涉到激活一個劇情(scenario),一系列對象互相作用,發(fā)送消息,實現(xiàn)某個特定功能。測試一個OO系統(tǒng)是另一個需要進一步研究的課題。發(fā)布一個穩(wěn)定的原型需要不同與以往控制結(jié)構化開發(fā)的產(chǎn)品的配置管理。
另一個管理方面要注意的問題是合適的工具支持。一個面向?qū)ο蟮拈_發(fā)環(huán)境是必須的。同時需要的還包括:一個類庫瀏覽器,一個漸增型編譯器,支持類和對象語義的調(diào)試器,對設計和分析活動的圖形化支持和引用檢查,配置管理和版本控制工具,以及一個象類庫一樣的數(shù)據(jù)庫應用。
除非面向?qū)ο箝_發(fā)的歷史足以提供有關資源和消耗的數(shù)據(jù),否則成本估算也是一個問題。計算公式中應該加入目前和未來的重用成本。最后,管理也必須明白在向面向?qū)ο蠓椒ㄞD(zhuǎn)變的過程中要遇到的風險。如消息傳遞、消息傳遞的爆炸增長、動態(tài)內(nèi)存分配和釋放的代價。還有一些起步風險,如對合適的工具,開發(fā)戰(zhàn)略的熟悉,以及適當?shù)呐嘤枺悗斓拈_發(fā)等。
8 向面向?qū)ο筠D(zhuǎn)變
這個轉(zhuǎn)變的時期可能相當長。培訓是必須的。一個實驗性質(zhì)的向?qū)ы椖恳彩怯斜匾摹=ㄗh不要使用結(jié)構化和面向?qū)ο笙窠Y(jié)合的辦法。越來越多的證據(jù)表明,成功需要完全的 OO解決方案.
9 未來
總的來說,面向?qū)ο蟮募夹g是以前的軟件開發(fā)技術自然演進的成果,對許多應用領域的軟件開發(fā)都極具前途。借用Maurice Wilkes在他圖靈獎頒獎儀式上的演講的話:“對象是軟件界從70年代以來最激動人心的革新之一。” (1996) 然而,面向?qū)ο蟮拈_發(fā)并非是包醫(yī)百病的靈丹妙藥,其發(fā)展還遠未成熟。可是盡管OO技術的未來還未確定,但在90年代初期的一些預言都已實現(xiàn)。(Winblad 1990) 類庫和應用程序框架在市場上已經(jīng)可用。應用和環(huán)境之間的透明信息存取業(yè)已實現(xiàn)。支持用戶在應用之間通信的的環(huán)境以及面向?qū)ο蟮睦^承多媒體工具包正在涌現(xiàn)。隨著經(jīng)驗的積累,OO的發(fā)展將日漸流行,OO技術也將日趨成熟。當然,OO技術也有可能為某種處理更高一級抽象的開發(fā)技術取代或融合。這些都只是猜想。雖然在不遠的將來,談論對象無疑會顯得過時,但現(xiàn)在,還有許多的問題等著我們?nèi)ジ冻稣嬲臒崆椤?br />
http://et.21cn.com/movie/pinglun/2003/08/25/1243146.shtml
針對日趨復雜的軟件需求的挑戰(zhàn),軟件業(yè)界發(fā)展出了面向?qū)ο?OO)的軟件開發(fā)模式。目前作為針對“軟件危機”的最佳對策,OO技術已經(jīng)引起人們的普遍關注。最初被多數(shù)人看作只是一種不切實際的方法和滿足一時好奇心的研究,現(xiàn)在得到了人們近乎狂熱的歡迎。許多編程語言都推出了支持面向?qū)ο蟮男掳姹尽4罅康拿嫦驅(qū)ο蟮拈_發(fā)方法被提出來。關于OO的會議、學術研討班和課程極受歡迎。無數(shù)專業(yè)的學術期刊都為這一話題開辟了專門的版面。一些軟件開發(fā)合同甚至也指明了必須使用OO的技術和語言。面向?qū)ο蟮能浖_發(fā)對于90年代,就向是結(jié)構化的軟件開發(fā)對于70年代那樣讓人著迷,而且OO的發(fā)展勢頭還在日益加速。
諸如“對象”和“對象的屬性”這樣的概念,可以一直追溯到1950年代初。它們首先出現(xiàn)于關于人工智能的早期著作中。然而,OO的實際發(fā)展卻是始于1966年 (當年文化大革命在中國爆發(fā)) 。 當時Kisten Nygaard和Ole-Johan Dahl開發(fā)了具有更高級抽象機制的Simula語言。Simula提供了比子程序更高一級的抽象和封裝;為仿真一個實際問題,引入了數(shù)據(jù)抽象和類的概念。 大約在同一時期,Alan Kay正在尤他大學的一臺個人計算機上努力工作,他希望能在其上實現(xiàn)圖形化和模擬仿真。盡管由于軟硬件的限制,Kay的嘗試沒有成功,但他的這些想法并沒有丟失。70年代初期,他加入了Palo Alto研究中心(PARC),再次將這些想法付諸實施。
在PARC,他所在的研究小組堅信計算機技術是改善人與人、人與機器之間通訊渠道的關鍵。在這信念的支持下,并吸取了Simula的類的概念,他們開發(fā)出Smalltalk語言;1972年PARC發(fā)布了Smalltalk的第一個版本。大約在此時,“面向?qū)ο?rdquo;這一術語正式確定。Smalltalk被認為是第一個真正面向?qū)ο蟮恼Z言。 Smalltalk 的目標是為了使軟件設計能夠以盡可能自動化的單元來進行。在Smalltalk中一切都是對象-----即某個類的實例。最初的Smalltalk的世界中,對象與名詞緊緊相連。Smalltalk還支持一個高度交互式的開發(fā)環(huán)境和原型方法。這一原創(chuàng)性的工作開始并未發(fā)表,只是視為帶濃厚試驗性質(zhì)的學術興趣而已。
Smalltalk-80是PARC的一系列Smalltalk版本的總結(jié),發(fā)布于1981年。1981年8月的<<BYTE>>雜志公布了Smalltalk開發(fā)組的重要結(jié)果。在這期雜志的封面圖上,一個熱氣球正從一個孤島上冉冉升起來,標志著PARC的面向?qū)ο笏枷氲膯⒑健T撌窍蜍浖_發(fā)界公開發(fā)表的時候了。起初,影響只是漸進式的,但很快就躍升到火爆的程度。熱氣球確實啟航了,而且影響深遠。早期Smalltalk關于開發(fā)環(huán)境的研究導致了后來的一系列進展:窗口(window),圖標(icon),鼠標(mouse)和下拉式window環(huán)境。Smalltalk語言還影響了80年代早期和中期的面向?qū)ο蟮恼Z言,如:Object-C(1986), C++(1986), Self(1987),Eiffl(1987),Flavors(1986). 面向?qū)ο蟮膽妙I域也被進一步拓寬。對象不再僅僅與名詞相聯(lián)系,還包括事件和過程。1980 Grady Booch首先提出面向?qū)ο笤O計(OOD)的概念。然后其他人緊隨其后,面向?qū)ο蠓治龅募夹g開始公開發(fā)表。1985年,第一個商用面向?qū)ο髷?shù)據(jù)庫問世。1990年代以來,面向?qū)ο蟮姆治觥y試、度量和管理等研究都得到長足發(fā)展。目前對象技術的前沿課題包括設計模式(design patterns)、分布式對象系統(tǒng)和基于網(wǎng)絡的對象應用等。
2 動因
為什么面向?qū)ο筮\動發(fā)展到了現(xiàn)在這樣火暴的程度?部分是源于人們長久以來的一個希望:人們希望它,象以前其他的軟件開發(fā)技術一樣,能夠滿足軟件開發(fā)對于生產(chǎn)效率、可靠性、易維護性、易管理等方面的更高、更快、更強的迫切需求。除此之外,還有許多原因都促使了它的流行。
面向?qū)ο蟮拈_發(fā)強調(diào)從問題域的概念到軟件程序和界面的直接映射;心理學的研究也表明,把客觀世界看成是許多對象更接近人類的自然思維方式。對象比函數(shù)更為穩(wěn)定;軟件需求的變動往往是功能相關的變動,而其功能的執(zhí)行者----對象----通常不會有大的變動。另外,面向?qū)ο蟮拈_發(fā)也支持、鼓勵軟件工程實踐中的信息隱藏、數(shù)據(jù)抽象和封裝。在一個對象內(nèi)部的修改被局部隔離。面向?qū)ο箝_發(fā)的軟件易于修改、擴充和維護。
面向?qū)ο笠脖粩U充應用于軟件生命周期的各個階段---從分析到編碼。而且,面向?qū)ο蟮姆椒ㄗ匀欢坏刂С挚焖僭头ê蚏AD(Rapid Application Development)。面向?qū)ο箝_發(fā)的使用鼓勵重用,不僅軟件的重用,還包括分析、設計的模型的重用。更進一步,OO技術還方便了軟件的互換性,即,網(wǎng)絡中一個節(jié)點上應用能夠利用另一個節(jié)點上的資源。面向?qū)ο蟮拈_發(fā)還支持并發(fā)、層次和復雜等一些在目前的軟件系統(tǒng)中常見的現(xiàn)象。今天我們常常會需要建造一些軟件系統(tǒng)----不止是一黑盒應用。這些復雜系統(tǒng)通常包含由多個子系統(tǒng)組成的層次結(jié)構。面向?qū)ο蟮拈_發(fā)支持開放系統(tǒng)的建設;利用不同的應用來進行軟件集成有了更大的柔性。最后,面向?qū)ο箝_發(fā)的使用可以減小開發(fā)復雜系統(tǒng)所面臨的危險,主要是因為系統(tǒng)集成遍布軟件生命周期的各個階段。
3 面向?qū)ο蟮慕?nbsp;
面向?qū)ο蟮慕2粌H僅是新的編程語言的匯總。它是一種新的思維方式,一種關于計算和信息結(jié)構化的新思維。面向?qū)ο蟮慕#严到y(tǒng)看做是相互協(xié)作的對象,這些對象是結(jié)構和行為的封裝,都屬于某個類,那些類具有某種層次化的結(jié)構。系統(tǒng)的所有功能通過對象之間相互發(fā)送消息來獲得。面向?qū)ο蟮慕?梢砸暈槭且粋€包含以下元素的概念框架:抽象、封裝、模塊化、層次、分類、并行、穩(wěn)定、可重用和可擴展性。
面向?qū)ο蟮慕5某霈F(xiàn)并不能算是一場計算革命。更恰當?shù)刂v,它是面向過程和嚴格數(shù)據(jù)驅(qū)動的軟件開發(fā)方法的漸進演變結(jié)果。軟件開發(fā)的新方法受到來自兩個方面的推動:編程語言的發(fā)展和日趨復雜的問題域的需求驅(qū)動。盡管在實際中分析和設計在編程階段之前進行,但從發(fā)展歷史看卻是編程語言的革新帶來設計和分析技術的改變。同樣,語言的演變也是對計算機體系的增強和需求的日益復雜的自然響應。
影響OO產(chǎn)生的諸多因素中,最重要的可能要算是編程方法的進步了。在過去的幾十年中,編程語言中對抽象機制的支持已經(jīng)發(fā)展到了一個較高的水平。這種抽象的進化從地址(機器語言)到名字(匯編語言),到表達式(第一代高級語言,如Fortran),到控制(第二代高級語言,如Cobol),到過程和函數(shù)(第二代和早期第三代高級語言,如Pascal),到模塊和數(shù)據(jù)(晚期第三代高級語言,如modula),最后到對象(基于對象和面向?qū)ο蟮恼Z言)。Smalltalk和其他面向?qū)ο笳Z言的發(fā)展使得新的分析和設計的技術的實現(xiàn)成為可能。
這些新的OO的技術實際上是結(jié)構化和數(shù)據(jù)庫方法的融合。OO的方法中,小范圍內(nèi)對面向數(shù)據(jù)流的關注,如偶合和聚合,也是很重要的。同樣,對象內(nèi)部的行為最終也需要面向過程的設計方法。數(shù)據(jù)庫技術中的實體-關系(ER圖)的數(shù)據(jù)建模思想也在 OO的方法中得以體現(xiàn)。
計算機硬件體系結(jié)構的進步,性能價格比的提高和硬件設計中對象概念的引入都對OO的發(fā)展產(chǎn)生了一定的影響。OO的程序通常要更加頻繁地訪問內(nèi)存,需要更高的處理速度。他們需要并且也正在利用強大的計算機硬件功能。哲學和認知科學的層次和分類理論也促進了OO的產(chǎn)生和發(fā)展。最后,計算機系統(tǒng)不斷增長的規(guī)模、復雜度和分布性都對OO技術起了或多或少的推動作用。
因為影響OO發(fā)展的因素很多,OO技術本身還未成熟,所以在思想和術語上有很多不同的提法。所有的OO語言并非生而平等,他們在術語、概念的運用上也各不相同。盡管也存在統(tǒng)一的趨勢,但就如何進行面向?qū)ο蟮姆治觥⒃O計而言還沒有完全達成共識,更沒有統(tǒng)一的符號來描述這些活動。(說明:UML正在朝這方向努力) 但是,OO的開發(fā)已經(jīng)在以下領域被證明是成功的:空中交通管理、動畫設計、銀行、商業(yè)數(shù)據(jù)處理、命令和控制系統(tǒng)、CAD、CIM、數(shù)據(jù)庫、專家系統(tǒng)、圖象識別、數(shù)學分析、音樂合成、操作系統(tǒng)、過程控制、空間站軟件、機器人、遠程通訊、界面設計和VLSI設計。毫無疑問,OO技術的應用已經(jīng)成為軟件工業(yè)發(fā)展的主流。
4 面向?qū)ο缶幊?nbsp;
<1> 概念
在面向?qū)ο缶幊讨校绦虮豢醋魇窍嗷f(xié)作的對象集合,每個對象都是某個類的實例,所有的類構成一個通過繼承關系相聯(lián)系的層次結(jié)構。面向?qū)ο蟮恼Z言常常具有以下特征:對象生成功能、消息傳遞機制、類和遺傳機制。這些概念當然可以并且也已經(jīng)在其他編程語言中單獨出現(xiàn),但只有在面向?qū)ο笳Z言中,他們才共同出現(xiàn),以一種獨特的合作方式互相協(xié)作、互相補充。
過程化編程模式: 參數(shù)輸入----- | 代 碼 | ------結(jié)果輸出
為實現(xiàn)某個功能,參數(shù)被傳入某個處理過程,最后傳回計算結(jié)果。
| 對象------ 數(shù)據(jù)結(jié)構 面向?qū)ο缶幊棠J剑?nbsp;
界面 | 對象------ 和
| 對象------ 操作
OOP中,功能是通過與對象的通訊獲得的。對象可以被定義為一個封裝了狀態(tài)和行為的實體;或者說是數(shù)據(jù)結(jié)構(或?qū)傩裕┖筒僮鳌顟B(tài)實際上是為執(zhí)行行為而必須存于對象之中的數(shù)據(jù)、信息。對象的界面,也可稱之為協(xié)議,是一組對象能夠響應的消息的集合。 消息是對象通訊的方式,因而也是獲得功能的方式。對象受到發(fā)給他的消息后,或者執(zhí)行一個內(nèi)部操作(有時成為方法或過程),或者再去調(diào)用其他對象的操作。所有對象都是類的實例。類是具有相同特點的對象的集合,或者也可以說,類是可用于產(chǎn)生對象的一個模版。對象響應一個消息而調(diào)用的方法,由接受該消息的對象自己決定。 類可以以一種層次結(jié)構來安排。在這個層次結(jié)構中,子類可以從比他高的超類中繼承得到狀態(tài)和方法。當對象接收到一個消息后,尋找相應的方法的過程將在從該對象的類開始,并在該類所處的層次結(jié)構中展開,最后,直到找著該方法,或者什么也沒找到(將會報錯)。在某些語言中,一個給定的類可以從不止一個超類中繼承,稱之為多繼承。如果采用動態(tài)聯(lián)編,繼承就導致了多態(tài)性。多態(tài)性描述的是如下現(xiàn)象:如果幾個子類都重新定義了超類的某個函數(shù)(都用相同的函數(shù)名),當消息被發(fā)送到一個子類對象時,在執(zhí)行時該消息會由于子類確定的不同而被解釋為不同的操作。 方法也可以被包括在超類的界面中被子類繼承,而實際上并不去真正定義他。這樣的超類也叫抽象類。抽象類不能被實例化,因此也就只能被用于產(chǎn)生子類。
<2> 語言
面向?qū)ο蟮恼Z言包含4個基本的分支:
1 基于Smalltalk的; 包括smalltalk的5個版本,以Smalltalk-80為代表。
2 基于C的; 包括 objective-C, C++, Java
3 基于LISP的; 包括 Flavors, XLISP, LOOPS, CLOS
4 基于PASCAL的。包括 Object Pascal, Turbo Pascal, Eiffel, Ada 95
Simula實際上是所有這些語言的老祖宗。在這些OO語言中,術語的命名和支持OO的能力都有不同程度的差別。 盡管Smalltalk-80不支持多繼承,它仍被認為是最面向?qū)ο蟮恼Z言(the truest OO language)。
在基于C的OO語言中,Object-C 是Brad Cox開發(fā)的,它帶有一個豐富的類庫,已經(jīng)被成功用于大型系統(tǒng)的開發(fā)。C++是由貝爾實驗室的Bjarne Stroustrup寫的。它將C語言中的STRUCT 擴展為 具有數(shù)據(jù)隱藏功能的CLASS。多態(tài)性通過虛函數(shù)(virtual functions)來實現(xiàn)。C++ 2.0 支持多繼承。在多數(shù)軟件領域,尤其是Unix平臺上,C++都是首選的面向?qū)ο缶幊陶Z言。 同C和C++相類似的新一代基于Internet的面向?qū)ο笳Z言Java是由Sun microsystems研制的。它于1995年伴隨著Internet的崛起而風靡一時。用Java寫的applets可以嵌入HTML中被解釋執(zhí)行,這使它具備了跨平臺特性。Java和Ada一樣支持多線程和并發(fā)機制,又象C一樣簡單、便攜。
基于LISP的語言,多被用于知識表達和推理的應用中。其中CLOS(Common LISP Object System)是面向?qū)ο驦ISP的標準版。
在基于Pascal的語言中,Object Pascal是由Apple和Niklaus Wirth為Macintosh開發(fā)的,它的類庫是MacApp。Turbo Pascal 是Borland公司以Object Pascal為范本開發(fā)的。
Eiffel由交互軟件工程公司的Bertrand Meyer于1987年發(fā)布的。它的語法類似Ada,運行于Unix環(huán)境。Ada在1983年剛出來時并不支持繼承和多態(tài)性,因而不是面向?qū)ο蟮摹5搅?995年,一個面向?qū)ο蟮腁da終于問世,這就是Ada 95。
除了上述的面向?qū)ο蟮恼Z言之外,還有一些語言被認為是基于對象(Object-based)的。它們是:Alphard, CLU, Euclid, Gypsy, Mesa, Modula。
5 面向?qū)ο蟮能浖こ?nbsp;
生命周期
盡管面向?qū)ο蟮恼Z言正在取得令人激動的進展,但我們都知道,編碼并非是軟件開發(fā)中的問題的主要來源。相比之下,需求和分析的問題更加普遍,而且它們的糾錯代價更加昂貴。因此, 對OO開發(fā)技術的關注就不能僅僅集中在編碼上面,更應集中關心軟件工程的其他方面。OO方法在處理復雜系統(tǒng)的分析和設計、分析和設計的重用方面的應用前景也是非常可觀。如果我們承認OO的軟件開發(fā)不僅僅局限于編碼活動,那么就必須采用一種全新的開發(fā)模式,包括新的軟件生命周期。 目前最常見的生命周期是“瀑布”模型(結(jié)構化)。它是在60年代末“軟件危機”后出現(xiàn)的第一個生命周期模型。如下所示。
分析 ----- 設計 ----- 編碼 ----- 測試 ------ 維護
如圖所示,瀑布式生命周期的開發(fā)過程是順序行進的;活動流向基本是單向的。它假設開發(fā)者在開發(fā)初期對系統(tǒng)的了解足夠清楚。不幸的是,任何軟件開發(fā)活動都不可避免地要涉及大量迭代過程,無論你事先是否安排。好的設計人員指的是那些能同時在抽象的層面和具體的細節(jié)上進行工作的實踐家。總的來說,瀑布式生命周期的缺點表現(xiàn)在三個方面:<1> 后期的變化、迭代、改動困難 <2> 不支持重用 <3> 沒有一個聯(lián)系各個階段的統(tǒng)一模型。
面向?qū)ο蟮姆椒◤膯栴}模型開始,然后就是識別對象、不斷細化的過程。它從本質(zhì)上就是迭代的和漸增的。在這里,快速原型和反饋環(huán)路是必需的標準結(jié)構。開發(fā)過程就是一次次的迭代反復過程。隨著迭代的進行,系統(tǒng)的功能不斷完善。這里,傳統(tǒng)的開發(fā)模式中在分析、設計和編碼等各個階段之間的明顯界限變得模糊起來。其原因是因為對象的概念彌漫了整個開發(fā)過程。對象和它們之間的關系成為分析、設計和編碼等各個階段的共同表達媒介。開發(fā)的重心從編碼向分析偏移,從功能為中心向數(shù)據(jù)為中心偏移。而且,面向?qū)ο箝_發(fā)的迭代和無縫性使得重用變得更加自然。
近來,為改善面向?qū)ο箝_發(fā)的可管理性,玻姆(Boehm,1988)提出了一個結(jié)合了宏觀和微觀視角(macro & microview)的螺旋開發(fā)模型。宏觀包括3個階段:1分析---發(fā)現(xiàn)和識別對象;2 設計---發(fā)明和設計對象;3 實施---創(chuàng)建和實現(xiàn)對象。每個宏觀階段都包含一些微觀迭代活動。
6 OOA和OOD
由于面向?qū)ο蟮募夹g還比較新,目前存在許多種面向?qū)ο蟮姆治龊驮O計方法。面向?qū)ο蟮姆治?OOA)建立于以前的信息建模技術的基礎之上,可以定義為是一種以從問題域詞匯中發(fā)現(xiàn)的類和對象的概念來考察需求的分析方法。OOA的結(jié)果是一系列從問題域?qū)С龅?ldquo;黑箱”對象。OOA通常使用“劇情(scenarios)”來幫助確定基本的對象行為。一個劇情是發(fā)生在問題域的一個連續(xù)的活動序列。在對一個給定的問題域進行 OOA時,“框架”(Frameworks)的概念非常有用。框架是應用或應用子系統(tǒng)的骨架,包含一些具體或者抽象的類。或者說,框架是一個特定的層次結(jié)構,包含描述某一問題域的抽象父類。當下流行的所有的OOA方法的一個缺點就是他們都缺乏一種固定的模式(formality)。
在面向?qū)ο蟮脑O計(OOD)階段,注意的焦點從問題空間轉(zhuǎn)移到了解空間。OOD是一種包含對所設計系統(tǒng)的邏輯的和物理的過程描述,以及系統(tǒng)的靜態(tài)和動態(tài)模型的設計方法(Booch,1994)。
在OOA和OOD中,都存在著對重用性的關注。目前,OO技術的研究人員們正在嘗試定義“設計模式(design patterns)”這一概念。它是一種可重用的“財富”,可以應用于不同的問題域。通常,設計模式指的是一種多次出現(xiàn)的設計結(jié)構或解決方案。如果對他們進行系統(tǒng)的歸類,即可被重用,可以構成不同設計之間通信的基礎。
OOD技術實際上早于OOA技術而出現(xiàn)。目前在OOA和OOD已經(jīng)很難畫出一條清晰的界限。因此,下面的描述給出一些常用的OOA/OOD技術的(聯(lián)合)概貌。
Meyer 用語言作為表達設計的工具。(1988)
Booch的OOD技術擴展了他以前在Ada方面的工作。他采用一種“反復綜合(round-trip gestalt)”的方法,包括以下過程:識別對象,識別對象的語義,識別對象之間的關系,進行實施,同時包含一系列迭代。Booch是最先使用類圖,類分類圖,類模板和對象圖來描述OOD的人(1991)。
Wrifs-Brock's的OOD技術是由職責代理來驅(qū)動的。類職責卡(Class Responsibilities Cards)被用來記錄負責特定功能的類。在確定了類及其職責之后,再進行更詳細的關系分析和子系統(tǒng)的實施。(1990)
Rumbaugh使用3種模型來描述一個系統(tǒng):1 對象模型,描述系統(tǒng)中對象的靜態(tài)結(jié)構;2 動態(tài)模型,描述系統(tǒng)狀態(tài)隨時間變化的情況;3 功能模型,描述系統(tǒng)中各個數(shù)據(jù)值的轉(zhuǎn)變。對象圖,狀態(tài)轉(zhuǎn)換圖和數(shù)據(jù)流圖分別被用于描述這3個模型。(1991)
Coad和Yourdon采用以下的OOA步驟來確定一個多層OO模型(5個層次):找出類和對象,識別結(jié)構和關系,確定主題,定義屬性,定義服務。5個步驟分別對應模型的5個層次,即類和對象層,主題層,結(jié)構層,屬性層和服務層。他們的OOD方法既是多層次的又是多方面的(multicomponent)。層次機構和OOA一樣。多方面包括:問題域,人與人的交互,任務管理和數(shù)據(jù)管理。
Ivar Jacobson 提出了Objectory方法(或Jacbson法),一種他在瑞典Objective系統(tǒng)中開發(fā)的面向?qū)ο筌浖こ谭椒āacbson的方法特別強調(diào)了“Use Case”的使用。 Use Case成為分析模型的基礎,用交互圖(Interaction Diagram)進一步描述后就形成設計的模型。Use cases同時也驅(qū)動測試階段的測試工作。到目前為止,Jacbson法是最為完整的工業(yè)方法。 (1992)
以上所述的方法還有許多的變種,無法一一列出。近年來,隨著各種方法的演變,它們之間也互相融合。1995年,Booch,Rumbaugh和Jacbson聯(lián)手合作,提出了第一版的UML(Unified Modelling Language),一體化建模語言。(目前已經(jīng)成為OO建模語言的事實標準)
7 管理問題
當組織向面向?qū)ο蟮拈_發(fā)技術轉(zhuǎn)向時,支持軟件開發(fā)的管理活動也必然要有所改變。承諾使用OO技術即意味要改變開發(fā)過程,資源和組織結(jié)構。(Goldberg 1995) OO開發(fā)的迭代、原型以及無縫性消除了傳統(tǒng)開發(fā)模式不同階段之間的界限。新的界限必須被重新確定。同時,一些軟件測度的方法也不在適用了。“代碼行數(shù)”LOC(Lines of Code)絕對過時了。重用類的數(shù)目,繼承層次的深度,類與類之間關系的數(shù)目,對象之間的耦合度,類的個數(shù)以及大小顯得更有意義。在OO的軟件測度方面的工作還是相當新的,但也已經(jīng)有了一些參考文獻。(Lorenz 1993)
資源分配和人員配置都需要重新考慮。開發(fā)小組的規(guī)模逐步變小,擅長重用的專家開始吃香。重點應該放在重用而非LOC上。重用的真正實現(xiàn)需要一套全新的準則。在執(zhí)行軟件合同的同時,庫和應用框架也必須建立起來。長期的投資策略,以及對維護這些可重用財富的承諾和過程,變的更加重要。
至于軟件質(zhì)量保證,傳統(tǒng)的測試活動仍是必須的,但它們的計時和定義必須有所改變。例如,將某個功能“走一遍”將牽涉到激活一個劇情(scenario),一系列對象互相作用,發(fā)送消息,實現(xiàn)某個特定功能。測試一個OO系統(tǒng)是另一個需要進一步研究的課題。發(fā)布一個穩(wěn)定的原型需要不同與以往控制結(jié)構化開發(fā)的產(chǎn)品的配置管理。
另一個管理方面要注意的問題是合適的工具支持。一個面向?qū)ο蟮拈_發(fā)環(huán)境是必須的。同時需要的還包括:一個類庫瀏覽器,一個漸增型編譯器,支持類和對象語義的調(diào)試器,對設計和分析活動的圖形化支持和引用檢查,配置管理和版本控制工具,以及一個象類庫一樣的數(shù)據(jù)庫應用。
除非面向?qū)ο箝_發(fā)的歷史足以提供有關資源和消耗的數(shù)據(jù),否則成本估算也是一個問題。計算公式中應該加入目前和未來的重用成本。最后,管理也必須明白在向面向?qū)ο蠓椒ㄞD(zhuǎn)變的過程中要遇到的風險。如消息傳遞、消息傳遞的爆炸增長、動態(tài)內(nèi)存分配和釋放的代價。還有一些起步風險,如對合適的工具,開發(fā)戰(zhàn)略的熟悉,以及適當?shù)呐嘤枺悗斓拈_發(fā)等。
8 向面向?qū)ο筠D(zhuǎn)變
這個轉(zhuǎn)變的時期可能相當長。培訓是必須的。一個實驗性質(zhì)的向?qū)ы椖恳彩怯斜匾摹=ㄗh不要使用結(jié)構化和面向?qū)ο笙窠Y(jié)合的辦法。越來越多的證據(jù)表明,成功需要完全的 OO解決方案.
9 未來
總的來說,面向?qū)ο蟮募夹g是以前的軟件開發(fā)技術自然演進的成果,對許多應用領域的軟件開發(fā)都極具前途。借用Maurice Wilkes在他圖靈獎頒獎儀式上的演講的話:“對象是軟件界從70年代以來最激動人心的革新之一。” (1996) 然而,面向?qū)ο蟮拈_發(fā)并非是包醫(yī)百病的靈丹妙藥,其發(fā)展還遠未成熟。可是盡管OO技術的未來還未確定,但在90年代初期的一些預言都已實現(xiàn)。(Winblad 1990) 類庫和應用程序框架在市場上已經(jīng)可用。應用和環(huán)境之間的透明信息存取業(yè)已實現(xiàn)。支持用戶在應用之間通信的的環(huán)境以及面向?qū)ο蟮睦^承多媒體工具包正在涌現(xiàn)。隨著經(jīng)驗的積累,OO的發(fā)展將日漸流行,OO技術也將日趨成熟。當然,OO技術也有可能為某種處理更高一級抽象的開發(fā)技術取代或融合。這些都只是猜想。雖然在不遠的將來,談論對象無疑會顯得過時,但現(xiàn)在,還有許多的問題等著我們?nèi)ジ冻稣嬲臒崆椤?br />
http://et.21cn.com/movie/pinglun/2003/08/25/1243146.shtml
posted on 2006-02-13 14:42 bluesky 閱讀(733) 評論(0) 編輯 收藏 所屬分類: 記事本