摘 要:本文基于筆者多年從事計算機軟件的相關研究,以基于構件的軟件工程概念模型為研究對象,探討了面向對象軟件工程與傳統軟件工程之間的差別,給出了基于構件的軟件工程概念模型,全文是筆者長期工作實踐基礎上的理論升華,相信對從事相關工作的同行有著重要的參考價值和借鑒意義。
關鍵詞:構件軟件工程面向對象
中圖分類號:TP3文獻標識碼:A文章編號:1674-098X(2011)07(a)-0111-02
軟件是信息產業的靈魂,軟件工程是軟件產業的靈魂。1968年由NATO(北大西洋公約組織)在德國格密斯(Garmish)舉行的學術會議上正式提出“軟件工程(software engineering)”這一概念以來,軟件工程發展極快,取得了豐碩的成果。軟件工程分為傳統軟件工程、面向對象軟件工程、軟件過程工程和構件軟件工程四種。軟件工程沒有一個權威的定義,比較認可的定義為:軟件工程是一門交叉學科,它是解決軟件問題的工程,是對軟件開發、運作、維護的系統化的、有規律的、可定量的研究方法。軟件工程有明確的目標。那就是研制開發與生產出具有良好的軟件質量和費用合算的產品。軟件質量可用六個特性來評價:功能性、可靠性、易使用性、高效率性、可維護性、易移植性。
軟件工程不同于一般工程,具體表現在:
(1)軟件是邏輯產品而不是實物產品,所以費用集中在研制開發上而不在生產上。軟件不會用壞、磨損、老化,但有一個過時的問題。(2)由于軟件是邏輯產品,使得它的功能只能依賴于硬件和軟件的運行環境以及人們對它的操作,才能得以體現。(3)軟件產品的功能比一般產品的功能復雜得多。(4)軟件設計比一般產品復雜得多。具體表現在:功能的多樣性,實現的多樣性。推動軟件工程發展的原動力是提高軟件質量和軟件開發的生產效率。
1 傳統軟件工程
傳統軟件工程采用面向過程,即結構化程序設計方法,既有很多成功的例子,例如DOS操作系統,也有很多失敗的例子,例如美國阿波羅登月飛行計劃的軟件錯誤。因為傳統軟件工程不能駕馭復雜系統的開發,曾經一度產生了軟件危機。面對越來越復雜的軟件系統,傳統軟件工程已經不能勝任,在實踐中,人們呼喚能適應復雜系統開發的軟件工程方法學和軟件開發技術的誕生,面向對象軟件工程應運而生。進入20世紀90年代以來,Internet飛速發展,人們碰到了另一個難題,快節奏地開發基于Web的大型應用程序,面向對象軟件工程及其技術已經不能勝任,人們嘗試利用基于構件的技術來解決,于是誕生了CORBA,COM及COM+,J2EE及EJB等基于構件的技術和軟件開發方法。然而,今天的構件技術離人們追求的目標—— 軟件工廠還相差甚遠。
面向過程的優點:面向過程的思維方法是符合人類認識規律的,因為人們解決問題,總是一步一步進行的,其中,有順序,條件和循環,利用這三大結構,可以解決世界上的任何問題。這些方法是優秀的,被面向對象和面向構件所吸收,成為類或構件內部實現的有力工具。面向過程的缺點:著眼于細節,不能很好地從宏觀上把握系統。
傳統軟件工程提出的軟件生存周期概念,影響深遠。詳細的軟件生存周期分為軟件系統的可行性研究、需求分析、概要設計、詳細設計、實現、組裝測試、確認測試、使用、維護、退役十個階段。粗略的軟件生存周期分為系統分析、系統設計、編程、調試、使用、維護六個階段。軟件生存周期是一個自然的過程,所有軟件開發都或多或少地要遵循這一過程。
2 面向對象軟件工程
面向對象軟件工程是運用面向對象方法,符合人類認識規律的一種軟件工程。20世紀60年代后期出現了面向對象的編程語言,70年代初Xerox公司推出了Smailtalk語言。奠定了面向對象程序設計的基礎,1980年出現的Smatltalk-80標志著面向對象程序設計進入了實用階段。自80年代中期起,人們注重于面向對象分析和設計的研究,逐步形成了面向對象軟件工程方法學。典型的方法有ECoad和E.YourDon的面向對象分析和設計,GBooch的面向對象開發方法,J.Rumbaugh等人提出的對象建模技術(OMT),Jacobson的面向對象軟件工程等。90年代中期,由GBooth,J.Rumbaugh,Jacobson等人發起,在Booch方法、OMT方法、OOSE方法的基礎上推出了統一的建模語言(UML),1997年被國際對象組織(OMG)確定為標準的建模語言。
面向對象方法的出現受到了計算機軟件界的親睞,并成為90年代的主流開發方法。面向對象方法的優點。
(1)從認知學的角度來看,面向對象方法符合人們對客觀世界的認識規律很長一段時間里,我們分析、設計、實現一個軟件系統的過程與我們認識一個系統的過程存在著差異。例如結構化方法分析的結果是數據流圖,設計的結果是模塊結構,實現的結果是由程序模塊組成的源程序。這些圖中的成分或程序模塊不能直接映射到客觀世界中系統的實體上,也就是說,解空間的結構與問題空間的結構是不一致的。當用戶需求有一些小的改變時,這種不一致性將導致分析、設計的較大變化。而面向對象方法則以客觀世界中系統的實體為基礎,將客觀實體的屬性及其操作封裝成對象。在分析階段,識別系統中的對象以及它們之間的關系;在設計階段,仍延用分析的結果,并根據實現的需要增加、刪除或合并某些對象,或在某些對象中添加相關的屬性和操作,同時設計實現這些操作的方法;在實現階段,則用程序設計語言來描述這些對象以及它們之間的聯系。因此,面向對象方法的分析、設計、實現的結果能直接映射到客觀世界中系統的實體上,也就是說,解空問的結構與問題空間的結構是一致的。分析、設計、實現一個系統的過程與認識這個問題的過程是一致的。由于面向對象的分析和設計采用同樣的圖形表示形式,分析、設計和實現都以對象為基礎,因此面向對象開發的各階段之間具有很好的無縫連接。當用戶的需求有所改變時,由于客觀世界中的實體相對穩定,實體之間的聯系也是基本不變,因此面向對象的總體結構也相對比較穩定,所引起的變化大多集中在對象的屬性與操作及對象之間的消息通信上。總之,面向對象方法符合人們對客觀世界的認識規律,所開發的系統相對比較穩定。
(2)開發的軟件系統易于維護,其體系結構易于理解、擴充和修改面向對象方法開發的軟件系統由對象類組成,對象的封裝性很好地體現了抽象和信息隱蔽的特征。對象以屬性及操作作為接口,使用者只可通過接口訪問對象,對象的具體實現細節對外是不可見的。這些特征使得軟件系統的體系結構是模塊化的,這種體系結構易于理解、擴充和修改。當對象的接口確定以后,實現細節的修改不會影響其他對象,易于維護。同時也便于分配給不同的開發人員去實現,依據規定的接口能方便地組裝成系統。
(3)面向對象方法中的繼承機制有力支持軟件的復用在同一應用領域的不同應用系統中,往往會涉及到許多相同或相似的實體,這些實體在不同的應用系統中存在許多相同的屬性和操作。在開發一個新的軟件系統時,可以復用已有系統中的某些類,通過繼承和補充形成新系統的類。在同一個應用系統中,某些類之問也存在一些公共的屬性和操作,也可以通過繼承來復用公共的屬性和操作。
3 構件軟件工程的概念模型
構件和基于構件的方法是電子商務革命的驅動力,它們是Internet時代開發企業級解決方案的方法。在任何行業中,復雜情況通常是通過很多關鍵概念來解決的。這些概念是通過抽象、分解、選代、細化等方法來表達的。其中的關鍵是分解技術—— 把一個較大的問題分解成較小的、可管理的單元,這樣每一個單元都是可以單獨處理的,這個技術是軟件工程的許多方法的核心。這些方法可以稱為結構化設計,模塊化編程,面向對象程序設計,基于構件的程序設計,它們產生的單元稱為模塊、包、對象或構件。
基于構件軟件開發是歷史發展的必然,基于構件的軟件開發(Component Based Software Development),簡稱CBD。基于構件的軟件工程(Component Based Software Engineering),簡稱CBSE。CBD追求的目標是軟件的“即插即用”。回顧經典的工業化革命,不難得出一些有益的啟示:功能再復雜的產品都是由大量標準的零件(領域構件)組成,零件在生產線上裝配成一個產品,所有零件在產品中共同發揮作用。分工越細致,專業生產的程度越高,總體生產效率就越高。把這些啟示運用于軟件開發,那就是:標準的零件就是軟件生產的構件,構件在軟件生產線上通過集成得到新開發的軟件。
3.1 為什么要使用基于構件的軟件開發
使用基于構件的軟件開發方法,有以下優點。
(1)遏制復雜性;(2)縮短發布時問;(3)提高一致性;(4)復用本領域的最佳方法;(5)提高生產率;(6)提高軟件質量;(7)增加項目進度的可視性;(8)支持并行的和分布式的開發;(9)減少維護費用。
3.2 構件的分類
構件有兩個層次,粗粒度構件和細粒度構件。粗粒度構件指的是基于操作系統平臺的構件,已經實現即插即用的目標。例如,基于Windows平臺開發的各種應用軟件,Microsoft Office,Windows Media Player, Realone Player,FlashGet,金山詞霸,瑞星殺毒軟件等等,這些應用程序可以直接安裝使用,當不再需要這些應用程序的時候,可以通過自帶的卸載程序或通過控制面板將其卸載。很明顯,這正是我們所討論的軟件的“即插即用”,只不過這些構件跨平臺能力太差,不能直接從Windows平臺移植到Unix平臺、Solaris平臺或其它平臺;復用程度也太差,不是我們心目中最求的目標。
細粒度構件指的是可以用來組裝應用程序的構件,包括通用構件和專用構件,基于構件的軟件開發討論的就是這種構件。另一種分類是根據軟件復用來進行分類的,分為廣義構件和狹義構件。廣義構件是指用于復用的軟件實體,包括分析文檔、詳細設計、代碼實現等。狹義構件特指二進制代碼構件,可以用于組裝應用程序。
3.3 CBD模型描述
基于構件的軟件開發,簡稱CBD,足面向對象程序設計的繼承和發展。一個構件由一個或多個對象經過包裝構成,通過接口獨立地對外提供服務。接口和硬件接口相似,有輸入接口、輸出接口和輸入輸出接口。我們看現實生活的一個例子,可以引發我們的很多思考。人是一個對象,也是經過規范包裝的一個構件,其接口是眼、耳、鼻、舌、口、身,其中眼、耳、鼻、舌是輸入接口,口是輸出接口,身是輸入輸出接口。人通過輸入接口接收信息和對外界的感知,通過神經傳遞消息,集中在大腦進行加工處理,反饋信息通過神經傳遞到輸出接口,從而完成人對現實世界的認識和感知,完成人與人之問的溝通與協調,這樣就構成了整個人類社會。
CBD也是相似的,每個構件都是由一個或多個對象經過規范包裝構成的,形成標準的部件,然后在構件集成開發環境下,組裝成應用程序。下面我們詳細看一下CBD生存周期的概念。
基于構件的軟件開發生存周期為系統分析,藍圖設計,構件的準備與生產,構件的集成與測試,使用,維護六個階段。經過系統分析和藍圖設計之后,就必須進行構件的準備和生產,這時候,可以復用通用構件,對于特定領域的特殊構件,必須自己進行生產,實現領域內的特殊業務邏輯。系統分析的時候,采用自上而下的分析方法,識別出系統的所有需求,把整個系統分解為多個一級子模塊,如果需要,再進行更細的詳分,標識為二級子模塊,三級子模塊等等。一般來說,模塊的劃分不宜太深,二級就可以了,否則理解起來就很困難。當把子模塊詳細分解為構件之后,在構件集成開發環境下,首先進行構件設計,實現業務邏輯,然后標識接El,進行規范包裝,使構件像工業上的標準零件一樣。在集成開發環境下,采用和c棚似的兩層界面,一層是設計界面,一層是代碼界面,構件集成開發環境的成功之處在于,雙擊任何一個構件,能夠將構件和構件代碼一一對應起來,從而大大方便編程和調試程序。當把各個小構件準備好了之后,把它們集成編譯為更大的構件,直至集成為一級構件,最后把一級構件組裝為應用程序。
為了更加直觀,可以把包裝好的構件用圖形界面表示出來。有的構件是獨立構件,有的構件由很多小構件組裝而成。圖1~3用直觀的方式描述了這種思想。
3.4 單個構件生產圖
如圖1。
3.5 基于構件軟件開發體系結構
如圖2。
3.6 構件軟件開發層次結構
如圖3。
參考文獻
[1]朱三元,錢樂秋,宿為民.軟件工程技術概論[M].北京:科學出版社,2007.
[2]R.Otte,P.Patrick,M.Roy[著],李師賢,等[譯].CORBA教程[M].北京:清華大學出版社,2009.
[3]朱其亮,鄭斌.CORBA原理及應用[M].北京:北京郵電大學出版社,2010.
[4]OMG[著].CORBA服務[M].北京:電子工業出版社,2009.