軟體項目實訓及課程設計指導——可擴展性和可重用性是面向對象架構設計的主要目標
1、什麼是合理的軟體應用系統的系統架構設計
軟體應用系統的設計人員經常會陷入一種困惑,面向對象系統架構設計結果的評價標準是什麼?也就是說,什麼是好的軟體應用系統的系統設計或者不好的系統設計結果!
作者認為,軟體應用系統的架構設計乃至整個軟體應用系統的設計不存在「好」和「壞」之分,而只有「合理」和「不合理」之區別。因為軟體應用系統設計的結果是要滿足多種不同的應用要求,而往往這些應用要求之間可能是相互矛盾的。
因此,軟體應用系統的設計人員必須要採用「中庸」的設計解決方案——綜合考慮不同的應用要求、並儘可能地滿足各個方面的應用要求或者合理地進行取捨。
什麼是合理的軟體應用系統的系統架構設計?合理的系統架構設計結果應該能夠滿足如下幾個基本的要求,而滿足了這些基本的要求,才有可能保證本軟體應用系統的體系架構設計結果達到高內聚低耦合的系統設計目標。
1)可擴展性(Extensibility)
2)可重用性(Reusability)
3)靈活性(Flexibility)
4)可插入性(Pluggablity)
其中的可插入性是指能夠容易地將軟體應用系統中的一個功能模塊抽出,同時也能夠將另一個有同樣接口的功能模塊加入到該軟體應用系統中以替換原有的功能模塊。
而可擴展性是指軟體應用系統本身能夠根據外界需求的變化不斷地調整和完善以適應外界需求的變化——也就是能夠循序漸進地進行軟體應用系統功能的擴展、並且也能夠滿足企業對軟體應用系統的逐步升級的需要。
下圖所示為某個軟體應用系統持久層中的各個組件的設計和實現方案的圖示,在資料庫操作組件和各個資料庫連接具體實現組件兩者之間添加一個資料庫連接接口,並在該接口中包含數據訪問操作組件中所需要的各種資料庫連接的服務方法的定義,而某個具體的資料庫連接組件則實現這個接口。
此時資料庫訪問操作組件則只需要調用資料庫連接組件接口中的服務來實現對資料庫的各種連接功能,兩者都只依賴於資料庫連接組件的接口。如果資料庫連接的具體實現要求發生變化,只需要再提供另一個資料庫連接實現組件就可以滿足這些變化——比如當軟體應用系統應用MySQL資料庫系統時,則只需要提供一個連接MySQL資料庫系統的資料庫連接組件實現類,而如果軟體應用系統最終應用MS SQLServer資料庫系統時,則只需要提供一個連接MS SQLServer資料庫系統的資料庫連接組件實現類。
如下示圖為某個BBS論壇應用系統中的系統持久層系統架構設計中針對不同類型的業務處理數據設計出不同的資料庫訪問操作DAO組件的UML類圖的局部截圖,為了保證本BBS論壇系統能夠適應不同的物理資料庫系統的應用環境的變化,各個不同的資料庫訪問操作DAO組件都依賴關聯資料庫連接的接口ConnectDBBean。
2、什麼是不合理的軟體應用系統的系統架構設計
什麼是不合理的軟體應用系統的系統架構設計?為什麼會出現不合理的系統架構設計?如何避免出現不合理的系統架構設計?希望讀者多深入思考這些問題,一個不合理的軟體應用系統的系統架構設計結果的主要表現如下:
1)缺乏靈活性——很難在軟體應用系統中添加新的功能模塊,因為對軟體應用系統中的每一處的修改就會影響到軟體應用系統中其他多個不同的功能模塊,產生「牽一髮而動全身」的影響效果,該軟體應用系統的體系架構設計是僵化的!
2)脆弱性——對軟體應用系統中的某個模塊進行修改後,卻導致軟體應用系統中的另一個關聯的模塊也要發生被動地變化和修改,產生「多米諾骨牌」式的連鎖修改!
3)不可重用性——軟體應用系統中的某些功能模塊很難在別的軟體應用系統中被重新使用,因為不能將它從現有的軟體應用系統中獨立地提取出來,產生類似「拔出蘿蔔帶出泥」的狀況!如下示圖為某個Web應用系統中的Web頁面實現的代碼局部截圖--HTML標籤和Java處理邏輯代碼混雜在一起。
下圖所示為某個軟體應用系統持久層中的各個組件的不合理的設計和實現方案的圖示,從下圖中所示的資料庫操作組件和資料庫連接組件之間的關係來看,兩者產生了緊密的藕合關係。一旦資料庫連接組件有了任何變化(比如連接的方式或者資料庫系統類型等),資料庫操作組件都有可能會受其影響而需要被改動——意味著該軟體應用系統的系統持久層缺乏靈活性和太脆弱,也就意味著該軟體應用系統的系統架構設計存在一定的缺陷!
3、為什麼要保證軟體應用系統的體系架構設計結果具有良好的可擴展性
企業推廣或者應用信息化系統的基本目的是希望能夠提高企業的競爭力,但企業隨著業務的發展,如新增業務功能的處理、新增服務渠道等或者由於技術本身的不斷進步等方面的各種原因,原有的軟體應用系統可能不能完全再滿足企業目前經營的新的應用要求。
當然,對於軟體應用系統的使用者也不希望拋棄原有的軟體應用系統,如果重新再開發新的軟體應用系統,這將會增加用戶方企業的經營成本。而是希望能夠在原有的軟體應用系統的基礎上,進一步完善原有的軟體應用系統的功能和進一步地增加新的功能——延續軟體應用系統的生命期。
一個合理的軟體應用系統的系統架構設計的結果是能夠適應用戶方的「變化」的要求,並且所添加的擴展功能模塊都可在原有的軟體應用系統的系統架構的基礎上加以擴展實現的——設計人員應該要保證軟體應用系統中分層中的每一層中的各個功能組件都能夠擴展。
如果軟體應用系統的體系架構設計本身是僵化的,也就是不具有良好的可擴展性,軟體應用系統在升級的過程中將不可避免地要改變原來的軟體應用系統的系統架構。而軟體應用系統的體系架構的重新調整和完善,不僅會增加軟體應用系統代碼維護的工作量,也還會帶來技術和成本等方面的風險。
如下示圖為某個BBS論壇系統的整體架構設計示例圖,該BBS論壇系統採用Struts +Spring +Hibernate架構所組成。這樣的架構設計首先是多層非分布式的構架,上圖展示了軟體應用系統的分層以及每一層中所採用的技術和對應的框架,並且各層將存在於同一個Web容器中。
本BBS論壇系統的總體架構設計所體現出的主要特點:
(1)遵循Sun J2EE中兩個主要的設計原則:「多層架構、松藕合」。
由於採用分層的設計方式,各個模塊功能相互獨立封裝,層與層之間關聯少,保持鬆耦合連接,穩定性高,便於擴展和維護。
(2)本軟體應用系統項目中的每一層所採用的技術都是可替換的,從而保證了體系架構設計結果具有良好的可擴展性。
例如系統表示層中的Struts框架可以被JSF或者Tapestry替換掉,JDO可替換系統持久層中的Hibernate框架。
1)在系統中的每個層中都不同程度地應用了J2EE中常用的設計模式
2)使用基於POJO的輕量級架構,從而使得軟體應用系統易於測試;便於移植;「開發—發布」周期短。
4、為什麼要保證軟體應用系統的體系架構設計結果具有良好的可重用性
(1)什麼是軟體應用系統設計中的「可重用性」
軟體應用系統設計中的「可重用性」一般是指軟體應用系統中代碼實現的可重用性。當然,軟體設計的可重用性不應該僅僅局限於功能實現的代碼方面,也還應該包括軟體應用系統的系統架構設計方面。因此,軟體應用系統的系統設計中的「可重用性」應該體現在「系統結構(分層和分塊)」和「代碼實現(源程序代碼和可執行的功能組件)」兩個方面。
如下示圖為某個BBS論壇系統中應用Struts +Spring +Hibernate架構的系統結構設計示例圖,在系統的表示層重用Struts框架,而在系統的業務服務處理層中重用Spring框架,在系統的持久層中重用Hibernate框架,從而保證了本應用系統在系統架構級別上能夠重用成熟的J2EE應用框架。
如果能夠實現軟體應用系統的系統架構級別上的重用,則能夠大大地簡化軟體應用系統設計的工作量、減少系統設計中的錯誤,並減少系統測試和調試的時間。因此,軟體應用系統的系統架構設計是整個軟體應用系統開發過程中比較關鍵的一個環節,並且系統架構的選擇結果將決定軟體應用系統開發實現的成敗。
(2)軟體應用系統設計中的可重用性表現為多個不同的層次
通用和共性的軟體模塊一般都是由底層的作業系統或開發平臺、開發工具所提供的,如通用API系統庫、平臺級別的功能組件、程序模板庫等;企業應用系統的開發人員主要專注於解決某一領域的特定的應用問題時的可重用性方面。
對這些特定的應用問題,從表面上來看,各個問題都有差別。但只要對它們進行細分處理後,仍然也會發現有許多共性之處——將公共的、相對獨立的和穩定不變的邏輯或模塊同特定的邏輯相互分開。比如各個商業銀行中的帳戶管理系統,都應該提供「存錢」、「取錢」和「轉帳」等方面的功能,這些是公共的、相對獨立的和穩定不變的邏輯。
(3)在面向對象編程中實現類級別重用的基本方法
在面向對象編程實現中有兩種方法可以重用類:其一是創建該類的對象實例,並通過該對象實例直接使用類中的方法;而另一種方法便是繼承該類以派生出一個滿足需要的子類。
面向對象編程技術中的繼承機制不僅可以重用基類的數據結構和功能方法的程序代碼,而且還可以在基類的基礎上根據具體的需要進行修改和擴充——通過新增、覆蓋或者重載等形式。
如下示圖為某個BBS論壇系統中的控制層組件部分程序類關係的UML類圖的局部截圖,在控制層組件中對系統的ActionServlet基類進行繼承,並根據應用系統的需求擴充出對應的派生類BBSActionServlet子類。
此外,系統中的不同業務處理的Action類都繼承於系統的ActionBase基類,從而實現對系統框架的重用,同時也允許根據應用系統的特定應用需求修改和擴充——通過新增、覆蓋或者重載等形式。