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