軟件復用本質是為了快速適應不斷變化的需求(adapt to changing needs ),兩者目標是一致的,但是當我們過于注重軟件復用(如組件復用component reuse又譯構件復用)時,千萬需要牢記:快速適應不斷變化的需求是根本目的,它的重要性要重于組件復用技術本身。本文試圖闡述兩者概念比較以及時下流行的組件復用技術概要。
適應需求變化
現如今是一個計劃趕不上變化的時代,企業競爭力逐漸表現在企業適應變化能力的競爭,誰能更快適應市場的變化,誰就能夠在競爭中勝出,這種快速適應能力如果靠“人民戰爭”無疑是不現實的,軟件可以幫助我們來適應這種快速變化。
談到這里,稍微再說明一下國人軟件教育的誤區,不錯,軟件曾經是科學計算的工具,因此,我們非常注重軟件的算法和數據結構,甚至將之作為數學的衍生物,但是,現如今已經成為一種幫助我們快速響應變化的有力工具,如果我們的教育背景中只有算法和數據結構,能夠編制出應付快速變化的軟件嗎?很顯然,他們是風馬牛不相及,由此可見國人軟件概念和軟件教育的落后性,在這樣的軟件認識背景下,固然設計模式的崇高位置得不到確立,軟件設計被拋棄在腦后,編制出的大多數企業軟件系統根本不具備應付變化的能力,程序員拒絕頻繁更改程序,甚至借助技術原因阻擾軟件的頻繁更改,這種軟件程序員和軟件用戶之間的矛盾可以稱為miscommunication, miscommunication是導致軟件系統的失敗一個重要原因。
國內早就有著名言論:“不上ERP等死;上了ERP找死”,如果你的企業不上ERP,那么你的企業就不能借助軟件應付快速的市場等環境變化,那么必然會被淘汰;但是,如果上了一個不注重“適應需求變化”的ERP軟件系統,那就是企業被僵化的ERP軟件框死,喪失了使用ERP的根本目的。
適應需求變化則成為現代軟件系統一個孜孜不倦的追求目標,那么如何實現呢?
原則:給予人們可以裁剪他們系統的能力應適應需求變化,建立一個適應需求變化的系統,允許系統在一系列小的、可控制的步驟上進行改變!
組件誕生
將不變的通用的東西抽象出來,以達到在不同項目中重用復用,將我們有限的精力集中在項目具體變化和特點上。當然這些抽象復用的東西之間彼此必須是松耦合,這樣才能根據需求挑選組合。
讓我們先回顧一下軟件的發展史,軟件開發的發展史實際是一部我們思維不斷抽象拔高的發展過程,這種抽象概念非常類似于建模的思考方式:概要貼切地描述事物,忽視次要的細節。抽象體現在軟件開發上就是每個具體項目需要完成的代碼行數量越來越少。
從1970到1980這段時間,軟件開發從機器語言到匯編語言。進而發展到高級語言,甚至一些CASE工具,面向功能編程發展到面向對象編程,功能模塊重用細化到類的重用,類的重用是最初是通過設計模式實現的。
進入90年代中期,誕生了基于組件的開發模式(CBD:component based development),CBD將抽象概念帶往了一個新的方向,與減少代碼數量相反,CBD將功能各個方面細化分離到不同的、相互隔離層中,如表現層、業務邏輯層、持久層、安全層以及核心層等,并且可以管理這些組件之間的依賴關系,通過這種分離,我們可以提純細化組件功能,進而產生可以重用的框架,如Struts框架可以重用在大部分應用系統的表現層中,,Struts+JdonFramework+Hibernate是一個框架組合,代表一種架構設計,這種架構設計其實可以重用在大部分應用系統,這種重用我稱之為架構級別重用。
組件復用
軟件組件(Software components)是軟件提供業務或技術功能的基本單元或元素,這些單元可以獨立地被部署、他們可以自我管理并且被虛擬部署到網絡的任何地方,業務組件((Business components)執行業務邏輯、遵循一定的業務規則并且管理相應的數據(數據庫操作稱為manage corporate data);而技術組件(Technical components)則提供相應的平臺以便業務組件可以依賴其上運行,例如權限、組件管理等。
JdonFramework/Spring都屬于一種技術組件框架,而我們具體項目的業務層代碼如果能夠提煉可以復用,則是業務組件;JdonFramework/Spring則都提供了業務組件賴于運行的一些核心底層機制,特別是組件的管理,如組件的創建、組件的獲得、組件的資源管理、組件的消亡等生命周期支持,所以,我們可以在JdonFramework/Spring中加入自己的業務組件,當然,JdonFramework還提供了Session等狀態管理的支持功能,為業務組件提供了更廣闊的生命周期支持。
組件復用技術以前是停留在編譯前期,也就是說:我們在編程時,導入所需要的其他組件Jar包,然后混同我們的項目編譯部署,但是這需要通過專業技術人員實現,很顯然是不能適應原則中第一句:給予人們可以裁剪他們系統的能力應適應需求變化,這里的“人們”應該是指軟件最終用戶,應該給予用戶自己改變系統的能力,也就是說:需要提供軟件系統運行時能夠動態改變自身的能力。
組件復用技術以前停留在軟件編譯階段,現在則更靠前,必須在軟件運行階段,當然對技術要求相當高,需要語言支持RTTI(簡單又神秘的Class.forName發揮作用了),這在"Evolution, Architecture, and Metamorphosis"一文中被認為是Metamorphosis,現在由于AOP技術出現,AOP有一種動態Weaving技術,實際就是在軟件運行時實現動態攔截,這樣給予終端用戶更大的改變系統能力,他們基本可以以動態插拔的概念實現多個組件的組合運行。在"AOP vs Decorator"一文中,我把編譯階段的組件組合方式(我更愿意稱為靜態組合)和運行時組合等兩種處理方式,合并稱為過濾器模式,如果你希望采取組件可插拔式的復用,就可以使用過濾器模式。
文章來源于領測軟件測試網 http://www.kjueaiud.com/