面向對象技術提供了一種新的認知和表示世界的思想和方法,它對計算機工業的影響是深遠的。
計算機從業人士利用它提出了面向對象的計算機程序設計語言、面向對象的軟件設計方法、面向對象的數據庫等等。同時面向對象技術為軟件工業實現工程化提供了強有力的支持,正是面向對象技術造就了組件、構件、中間件等概念。
一、可重用軟件組件
計算機的不斷發展為計算機及網絡應用提供了大量技術先進、功能強大的應用軟件系統,同時也給軟件開發者和用戶帶來了相應的問題:
· 軟件系統規模龐大,研制周期長,維護費用高;
· 軟件系統過於復雜,在一個系統中集成了各種功能,大多數功能不能靈活地裝卸、單獨升級或重復利用;
· 應用軟件不易集成,即使各應用程序是用相同的編程語言編寫的,並且運行在相同的計算機上,特定應用程序的數據和功能也不能提供給其他應用程序使用。
為克服上述困難,實現全行業范圍內的軟件"即插即用",關鍵是解決軟件系統的可操作性、可擴展性、語言獨立性和跨平台的操作能力。
作為解決這類問題的一種方案,面向對象的程序設計思想20多年來得到很大發展。孤立的面向對象思想雖然功能強大,但目前其發展已接近極限,結果是產生了大量的"對象孤島"。將面向對象思想與組件編程思想相接合發展起來的基於對象的組件軟件結構為這一領域開辟了新的道路。
從廣義上說,軟件組件是一種定義良好的獨立、可重用的二進制代碼,包括功能模塊、被封裝的對象類、軟件框架和軟件系統模型等。
本世紀60年代末到80年代初,結構化的模塊式軟件開發思想占主導地位,當時的組件的含義是指一些定義良好的方法包或功能模塊。
80年代起,面向對象的軟件開發思想迅速發展起來,這時的軟件組件的含義就是類庫。類雖然提供了封裝性、多態性和繼承性,但需要依賴於具體的編程語言,耦合度高,且需要用戶對類庫的結構和宿主語言有較深入的了解,因此,不能完全達到軟件重用的可移植性和互操作性要求。
90年代後,組件的內涵進一步加強,聚合性、獨立性和重用性進一步提高。目前,基於對象的組件軟件體系結構中的組件是指可方便地插入到語言、工具、操作系統、網絡系統中的二進制代碼和數據。
這種軟件組件可以看作是一種軟件集成電路元件,具有以下特點:
· 軟件IC沒有硬件IC的天然聚合性,構成粒度大小自由,便於擴展;
· 通過規定一個統一的二進制標准,建立起機構之間的智能互操作機制和語言獨立性;
· 外界僅通過接口訪問組件;
· 多側面性,即組件表達的語義層次高,可以從不同側面進行連接,外部特性不唯一;
· 支持封裝、繼承、多態性。
基於經典面向對象技術的組件模型為軟件體系結構設計和大型應用軟件開發給予了強有力的支持,目前已經為軟件行業所廣泛接受。Microsoft的OLE/COM和SunSoft的JavaBeans都是典型的軟件組件規范。
1.1 JavaBeans
Java Bean是基於Java環境的,可視的、可操縱的、可重用的組件;JavaBeans組件模型是SunSoft制定的關於Bean的軟件組件標准,規定設計所有Bean所依據的框架,確保Bean在具備特定功能的同時,還能被可視化軟件構造工具所識別、操縱,並能將這些設計信息保存下來,指導運行時的行為。
作為可視化組件,所有JavaBean都具備如下特征:
· 內省(introspection)機制,能夠告訴軟件構造工具其所能完成的功能,從而允許軟件構造工具在設計時對其加以操縱;
· 用戶定制(customization)機制,允許程序員在軟件開發階段利用軟件構造工具改變Bean的外觀和行為方式。
· 事件(event)機制,能捕捉事件、引發事件,並將其所能產生和處理的事件告知軟件構造工具。
· 特性(properties)機制,除在軟件開發階段支持用戶定制外,還使得軟件系統能夠在運行時刻對Bean進行加工和控制;
· 保持(persistence)機制,保存程序員開發時利用構造工具對Bean所做的修改,並在運行時予以恢復。
· 設計時刻功能和運行時刻功能分離。
JavaBean主要用於可視化環境,為軟件構造工具所利用,但也能通過程序接口直接操縱,Java類庫中提供了相應的控制類。
1.2 OMA/CORBA
對象管理集團OMG (Object Management Group)是一個國際性的軟件行業協會,主要宗旨是促進面向對象的方法在軟件工程中的應用,以及在面向對象的軟件工程方法學的基礎上,為大規模並行系統(開放式並行計算)軟件的開發與應用制定軟件體系結構模型和通用接口規范。
OMG 於1990年末提出了一個對象管理結構的基准結構OMA (Object Management Architecture)。OMA主要涉及用於面向對象語言、系統、數據庫及應用程序框架的統一術語體系,面向對象軟件系統的抽象框架和基於面向對象技術的分布式軟件系統參考模型等。為了構造上述參考模型,OMA規定了四個方面的標准:
1.對象請求代理ORB (Object Request Broker),即關鍵通訊單元,在不同的應用程序對象之間以高度協同的方式發送消息;
2.對象模型,即獨立設計的、可移植的抽象模型,可以與其他符合OMA規范的面向對象系統進行通訊;
3.對象服務,利用ORB實現基本對象功能,確定對象的邏輯模型和物理存儲方式;
4.通用組件,包含了適用於很多應用領域的基本功能,這些功能可以通過符合OMA規范的類接口獲得。
OMG 於1991年末提出的CORBA (Common Object Request Broker Architecture),是OMA參考模型中的ORB接口技術規范。這一標准規定了如何定義、創建、調度、引用對象,以及對象之間如何通訊。符合CORBA規范的ORB是典型的中間件,允許Client對象向Service對象發出請求。
CORBA規范的基本組成如圖5.1所示
圖5.1 CORBA規范的基本組成
主要包括:
· 對象請求代理ORB (Object Request Broker),是CORBA的核心。作為一個軟件組件,對象可以通過ORB發出請求並接收響應。在CORBA中,所有的通訊都通過ORB進行,因而無論一個對象是本地的還是遠程的,對於與之進行通訊的其他對象來說都是等價的。CORBA並沒有規定如何具體實現一個ORB,幾乎每一個不同的產品都有其具體的ORB實現。
· 接口定義語言IDL (Interface Definition Language),是用於描述對象接口的一種高級符號語言。IDL不涉及任何接口的實現細節,所有COBRA系統都根據IDL用某種特定語言來實現接口。CORBA為C、C++、Smalltalk和JAVA制定了規范,ADA95和COBOL的映射規范也正在制定中。IDL描述通常以接口庫(Interface Repository)的方式進行存貯。
· 接口庫(Interface Repository),其中包括了所有描述服務對象屬性、操作、自定義數據類型及異常處理的IDL定義。
· 基本對象適配器BOA (Basic Object Adapter),描述了ORB和服務器端應用程序之間的接口。BOA負責調度服務器端應用程序維護的對象,並與服務對象交換消息。
· 靜態請求接口SII (Static Invocation Interface)。SII假設在編譯時刻客戶對象能夠明確了解服務對象的接口,即客戶與服務器之間的關系應當是可知的、固定的,服務接口的任何改變都會導致軟件系統的重新編譯。SII是由IDL描述的。
· 動態請求接口DII (Dynamic Invocation Interface)是一組與服務器無關的通用接口。與新服務對象及其行為相關的信息可以通過接口庫獲得,客戶程序根據這些信息可以在運行時刻動態構造請求。DII使得開發智能化即插即用的軟件系統成為可能,但需要涉及大量CORBA API調用,增加了軟件的復雜度。
總之,CORBA提供了一個集成框架,應用程序只要給出用接口定義語言IDL (Interface Definition Language)書寫的界面,就可插入框架,與其他對象協同工作,為在分布式環境下實現不同應用程序即插即用的集成提供了有力支持。
1.3 OLE/COM
與CORBA一樣,Microsoft的OLE/COM是基於分布式對象模型的開放標准,得到多系統軟件開發商、獨立軟件開發(ISV)商和用戶的支持。OLE實際上是建立在組件對象模型(COM)基礎上的一組高層次技術。從基本中間件功能視圖的角度來說,COM與CORBA非常相似,同樣支持對象的定義、創建、調度、引用及對象之間的通訊,同樣提供了接口定義語言(IDL)。但是兩者之間也存在顯著的差異。例如,COM支持由不同程序設計語言或不同編譯器實現的對象之間的二進制兼容,以及OLE Automation等。
OLE/COM的結構如圖5.2所示。這一結構的核心是組件對象模型(COM),支持對象的定義、創建、消除與調度,同時提供遍歷和詢問對象接口的功能。
圖5.2 OLE/COM的結構
服務控件管理SCM (Service Control Manager)集中負責搜索服務對象和在客戶與服務器之間建立信道。當客戶向某個特定的對象發出初始化請求時,SCM判斷包含該對象的服務程序是否已經運行,如否,則通過注冊表查找服務程序所在的位置。隨後,客戶端SCM建立起與服務器端SCM連接的RPC信道;服務器端SCM也進行同樣的處理,並在必要的情況下起動服務程序。最後,信道兩端的SCM分別將代理程序(proxy stub)載入到客戶進程和服務器進程中。
OLE/COM提供了與CORBA IDL類似的高級描述語言,用於定義COM概念上的接口,即一組邏輯相關的操作或方法。
OLE/COM結構的另一要素是Automation,允許客戶程序動態構造請求(包括方法名、相關參數的類型和取值等),並將請求發送到遠端對象。在CORBA中,客戶程序能夠通過接口庫(repository)獲取對象接口的相關信息;而OLE/COM則更進一步,任何符合OLE/COM規范的對象都能自動提供其所能支持的接口信息。
二、分布式對象中間件
90年代以來,計算技術逐步進入以網絡為中心的新時期,用戶迫切希望在網絡上建立更為豐富的分布式客戶/服務器應用;不僅實現數據共享,而且支持知識共享和各類計算資源的共享;並能實現包括整個企業在內的各個層次的的協同工作。
為適應上述要求,分布對象技術成為分布式計算環境發展的主流方向。其技術特點為:
1.主要針對異構環境下的應用互操作問題;
2.系統核心的對象管理將客戶/服務器模型與面向對象技術結合在一起;
3.提供面向對象的API;
4.已經成為建立集成框架和軟件部件標准的核心技術。
在此基礎上,為解決大型應用系統的集成性與可擴展性之間的矛盾,中間件(Middleware)技術應運而生。
中間件是軟件中介於在應用層和網絡層之間的一個功能層次,使應用系統獨立於由異構的操作系統、硬件平台與通信協議組成的底層環境。
中間件擴展了客戶/服務器結構,形成了一個包括客戶、中間件和服務器在內的三層結構及多層次結構,為開發可靠的、可擴展的、復雜的事務密集型應用提供了有力的支持。
中間件可以分為四種類型:
1.基於RPC (Remote Procedure Calls) 的中間件。RPC是傳統程序設計語言中過程調用的擴展,被調用的對象可以在分布系統中的任何物理平台上。OSF的DCE和SunSoft的ONC+等均屬此類中間件。
2.面向消息的中間件,支持基於消息傳遞的進程間通訊方式。這種中間件既適用於客戶/服務器模型,也適用於對等網模型,一般比基於RPC的中間件具有更高的運行效率。典型的系統有:SunSoft的ToolTalk、PeerLogic的Pipes和Talarian的SmartSockets等。
3.基於ORBs (Obecjt Request Brokers) 的中間件,此類中間件是面向對象應用程序的首選。消息通過ORB進行路由選擇,ORB同時處理集成和安全方面的問題。Microsoft的OLE/COM/DCOM和OMG的CORBA均屬此類中間件。
4.數據庫中間件,支持對異構的傳統關系數據庫的透明訪問。現有的此類系統包括Sybase的Open Server、Oracle的SQL Connect和BEA公司的WebLogic等。
三、基於面向對象技術的應用軟件體系結構
軟件體系結構是一個程序或系統的構件的組織結構、它們之間的關聯關系以及支配系統設計和演變的原則和方針。一般地,一個系統的軟件體系結構描述了該系統中的所有計算構件,構件之間的交互、連接件以及如何將構件和連接件結合在一起的約束。
研究軟件體系結構的首要問題是如何表示軟件體系結構,即如何對軟件體系結構建模。針對規模日益龐大、結構日益復雜的應用應用軟件,系統模型的設計目標是提高實際應用系統的開放性和集成性,同時兼顧效率。
軟件系統的開放性包括數據的開放性、功能的開放性和系統的可擴充性,是否具備良好的開放性基本取決於系統模型。軟件系統的集成性是指通過一致的信息描述手段和處理機制將各功能子系統統一到同一個集成環境,集成性的好壞也基本取決於系統模型。軟件系統的效率通常包括系統運行的效率和應用開發的效率。運行效率是系統運行時的時空復雜度,而應用開發的效率指開發的難易程度和執行效率。效率大部分取決於系統模型,也與系統的具體實現有關。
開放的系統模型使得子功能部件的集成易於實現,同時也必然提高應用開發的效率;集成和高效反過來又有利於更好地達到開放的目的。這三者相輔相成,其中又以開放性作為集成和效率的基礎,只有開放才有集成,只有開放才有效率。
針對應用軟件系統的開放性,曾先後出現了許多類系統模型,代表了應用軟件技術與產業發展的不同階段。各階段中有代表性的系統模型依次為:以數據為中心的系統模型、以執行為中心的系統模型、面向對象的系統模型、和基於總線的系統模型。
以數據為中心的系統模型如圖2a所示。這類模型將數據庫放在系統的核心層次共享,各功能部件采用統一的數據描述,各子系統的開發過程完全獨立;子系統間有統一的數據交換接口;整體的可擴充性好,可任意增加符合數據交換標准的應用程序。但是,這種模型整體結構松散,集成性不夠良好;只能做到數據復用,不能做到功能復用,造成大量的代碼冗余;由於應用相關數據的存在,難於定義符合所有應用需求的數據接口標准,因此會出現數據語義失真。從開放性的角度來講,這類系統只具有數據開放性,不具有功能開放性,但其可擴充性很好。
以執行為中心的系統模型著眼於將不同的應用系統通過統一的執行中心來實現數據和用戶界面的共享和一致,如圖2b所示。這類模型將共有的計算和執行功能從應用程序中分離出來,放在執行中心,避免了代碼冗余;用戶與系統的交互與應用程序相分離,便於實現統一風格的用戶界面;和數據庫的任何數據交換都要通過執行中心進行,有利於數據的嚴格管理,保證了數據的一致性。這類模型解決了以數據為中心的系統模型的代碼冗余及界面風格不統一等問題,但仍存在一些缺陷:執行中心的功能設計復雜,很難確切定義符合所有應用要求的功能集合,而且實現起來也相當困難;執行中心同時與用戶界面和所有應用程序保持通訊,又管理著數據,負擔過重,容易形成瓶頸。總之,這類模型既具有數據的開放性,又具有功能的開放性,可擴充性也好,整體上優於以數據為中心的系統模型。
隨著面向對象技術的成熟,出現了更為簡煉的面向對象的系統模型,與前兩類模型的設計思想有較大差別,如圖2c所示。其中,系統內核對象中封裝的是能為用戶界面對象和所有應用對象所共享的數據及相應的操作;用戶界面對象中封裝的是用戶界面數據及相應的操作;應用對象中封裝的是應用數據及相應的操作。所有這些對象通過相互間的通訊協調來完成指定的功能。從系統構成的角度來說,這類模型的結構是無中心的,系統由各對象實體構成,各對象實體具有平等的地位,這與以數據為中心和以執行為中心的模型不同。面向對象的系統模型的主要優點在於,數據和功能的合理封裝降低了由於數據和功能的集中管理所帶來的通訊上的開銷和操作上的復雜性;另外,系統的無中心結構也使系統的構成變得更加靈活。從整體上看,面向對象的系統模型無論其開放性還是其有效性都要優於前兩類模型。
面向對象模型比以往的模型有了很大的進步,但仍有不足:對象之間的聯系是一種點對點的直接聯系,當系統中對象數目增加時,通訊鏈接數將以平方級激增;同時,為支持通訊,每個對象實體都要維護一個包含所有對象實體功能服務信息的功能服務信息庫,這部分信息不但重復,而且還要保證其一致性。這些開銷都損害了系統的效率。更大的問題還在於:對象的接口沒有一致的標准,造成向系統中擴充對象時的隨意與不規范,不利於系統的維護以及對象的復用。
以面向對象為基礎的組件和中間件技術的逐漸成熟又為應用軟件系統的建模引入了新的思想,產生了基於總線的系統模型,如圖2d所示。組件、中間件是繼面向對象技術之後發展起來的新的軟件工程技術,是面向對象技術的延伸。基於總線的系統模型仍然是一種面向對象的結構,但系統中的對象是按照規范設計的模塊,這些定義良好的軟件模塊(組件)在系統中共存,並且充分地相互作用。按照這種結構,可以將若干組件組合起來,以建立更大和更復雜的系統。
這種模型的關鍵在於一種高效的總線結構,使組件之間能以一個公共的接口互相連接,做到組件的即插即用,無縫集成。這種模型的系統中,組件間的通訊鏈接數是線性的,並且由於各組件接口規范的一致性,通訊的復雜度大大下降,也提高了組件的互操作性。
根據組件在系統中地位的差異,應用軟件系統中的組件可以分為兩個層次:核心組件和應用組件。相對於核心組件來說,應用組件所要求的系統服務要少得多,請求服務的頻度也較低。相應地,總線也可以分為核心總線和應用總線,從而形成雙總線結構。在這種總線結構中,核心組件和應用組件之間仍然保持良好的互操作性,但應用總線屏蔽了應用組件的一部分服務請求,減少了核心總線上的流量,從而提高了應用軟件系統核心的效率。
核心組件與核心總線構成了應用軟件系統的原型和框架,在此基礎上與各應用組件集成。
通常在分布式環境中,應用組件不是直接連結到應用總線(也稱Broker)上,而是通過一個軟件代理(Agent)間接地連在總線上,如圖3所示。Agent的作用在於,一方面代理應用組件的復雜通訊過程,使應用組件更專注於功能的實現;另一方面將適應不同應用需求的組件內部的異構數據轉換成同構數據,以保證Broker上通訊語言的統一。由此可見,在基於總線的系統模型中,Broker與Agent構成了介於應用組件(客戶)與核心系統(服務器)之間的中間件。
四、並發面向對象技術
並行計算是未來計算機的發展方向。將面向對象與並行計算的相結合的並發面向對象技術是一個比較新的研究領域,許多問題有待解決。
目前一些流行的面向對象程序設計語言(如C++)只提供了描述程序順序執行的能力;即使有些語言(如Smalltalk)提供了描述程序並發執行的機制,但往往采用一些傳統的並發控制模式和設施,沒有從對象模型本身的特點來考慮並發控制,從而造成並發與對象模型中一些概念(如封裝、繼承及自治等)相沖突。
近年來,許多面向對象並發編程的方案被提出,可歸納為3種不同方法:
1.設計全新的並發面向對象語言;
2.擴展現存的順序面向對象語言;
3.使用現有的順序面向對象語言,通過外部庫提供並發抽象。
並發類庫正成為並發面向對象技術中最為重要的方法。這種方法的優點是不需要修改原有順序面向對象語言,保留原有編程方法,可以更好地利用面向對象技術中的一些特性,用戶容易接受。
為了在面向對象模型中引進並發機制,並發類庫的設計必須能與對象模型中一些現有的特性有機結合,為面向對象程序設計語言擴展描述系統並發行為的能力。此外,這種方法一般還需要某種底層特殊軟件(運行支撐系統)的支持,並將支撐系統的復雜性全部隱藏在類庫中。
順序對象模型由一組被動的對象構成。系統的執行行為是,外界激活其某個對象的某個方法,該方法的執行中向系統中其他對象發送消息,從而激活這些對象的方法的執行。這裡的消息發送就是過程調用,即消息發送者必須等到消息接受者的相應方法執行完畢,才能繼續執行下去,整個系統只有一個執行線程(Thread)。
在面向對象的並發模型中,可並發執行的基本單位是對象,稱為並發對象。與普通對象不同的,並發對象具有自己的控制線索和獨立的地址空間,多個並發對象可以並發運行,通過方法(消息傳遞)請求相互作用。目前存在兩種構造並發對象的典型方案:
1.采用異步消息發送。即一個對象向另一個對象發送消息後,前者不必等待後者處理消息即可繼續執行下去,後者則對消息進行緩存;
2.對象可以有一個體(Body),一旦對象被創建,這個體就開始執行。
在方案1中,由異步消息發送產生新的執行線程,從而引起系統的並發。由於采用異步消息發送,必須提供今後如何取得返回值的設施。異步消息發送的不足之處在於:它使得程序的行為難以把握,不利於對程序的推理(Reasoning)。
方案2通過創建新對象產生新的執行線程,在對象體執行的同時,對象還可以接收和發送消息,消息發送可采用同步方式,但應允許對象內部的並發,否則容易造成死鎖。
處於並發環境中的對象,隨時都會面臨環境對其方法的並發調用。為了保證對象狀態的一致性與完整性,必須對方法的並發調用加以同步控制。同步控制可以由消息發送者執行,也可以由消息接受者執行。但是,若同步控制僅由消息發送者執行,當消息發送者由於種種原因沒有進行同步控制時,將會產生對消息接受者方法的並發調用,造成消息接受者內部狀態的不一致與不完整。因此,消息接受者本身必須提供同步控制。
並發對象的同步控制可以分成兩類:條件同步和互斥。條件同步是指對象在某種狀態下只能接受某些消息;互斥是指當處於某種狀態下的對象可以接受(處理)多個消息時,由於這些消息的處理都有可能使用對象的成員變量,如果讓它們同時執行,就存在共享對象的成員變量問題,為了保證對象狀態的完整性和一致性,這些方法必須互斥地使用共享變量。
如何在並發對象類中描述對象的同步控制,一般存在兩種方式:集中控制和分散控制。
集中控制方式是把對象的同步控制放在對象(類)中某一個地方集中進行描述。這種方式要求設計者必須對對象的並發行為有整體的了解,還有可能帶來繼承異常,即在定義子類時,必須對父類的同步控制描述進行重定義,才能把新定義的方法考慮進來。
分散控制方式是把對象的並發控制描述分布到對象的各方法上。其中一種方案是在對象各方法的實現中進行同步控制,對象無條件地接收消息,在消息的處理方法中,根據對象目前的狀態決定是等待還是繼續執行。這種方案的不足之處在於:被掛起的方法往往使得對象處於一種不穩定狀態,使得對象此時不適合於處理其他消息;並且當在子類中改變父類某方法的同步控制時,需對整個方法重定義。另一種方案是在對象類中給每個方法加一個激勵條件,當對象接收到消息時,將根據相應方法的激勵條件來決定是否處理該消息,對不滿足激勵條件的消息讓其等待。這種方案優於前一種方案,因為,當定義子類時可以對父類中各方法的激勵條件和方法的實現分開進行繼承,從而避免了不必要的重定義。