如何保證軟體應用系統架構設計結果的可擴展性和可重用性(上篇)

2020-12-14 楊教授工作室

軟體項目實訓及課程設計指導——如何保證軟體應用系統架構設計結果的可擴展性和可重用性(上篇)

1、良好的可重用性軟體系統架構設計結果的主要體現

可重用性的軟體應用系統的系統架構設計結果主要體現在如下兩個方面——本項目的系統架構設計的結果是可重用的和在本項目的系統架構設計中重用成熟的系統架構設計方案。

當然,要能夠達到這樣的軟體系統架構設計結果,需要設計人員充分地應用面向對象技術中的抽象機制,對軟體應用系統中共性的部分進行充分的抽取。

而為了能夠保證軟體應用系統的系統架構設計結果是可擴展的,必須要應用「封裝」和「隔離」的設計手段、並且遵守一些相關的設計原則和應用典型的設計模式。

作者在下文將為讀者詳細介紹如何保證軟體應用系統的系統架構設計結果具有良好的可擴展性和可重用性。

2、軟體應用系統在縱向結構方面需要進行分層和隔離

(1)縱向分層和隔離

「層(Layer)」在面向對象的系統設計中是指對軟體應用系統中的功能模塊和類、或子系統等粗粒度的分組機制,每一層具有相對獨立和內聚的職責——各層之間的依賴關係應該是逐層向下而不能跨層產生依賴關係;而且只能是上層依賴於下層、而不能讓下層反過來依賴於上層。

比如,本系列文章中所給出的示例項目——銀行帳戶信息管理系統項目在縱向分層隔離方面採用四層次的系統架構設計,下圖所示中的UML包圖為體現本軟體應用系統項目的系統架構設計結果的分層包圖。

示例UML包圖中所示的系統分層設計完全遵守依賴倒置原則——依賴倒置原則的本質就是要求將軟體應用系統的架構設計中的各個層之間的關係要建立在依賴抽象接口的基礎上,同時要求上層模塊不應該直接依賴於下層的模塊,它們兩者都共同依賴於一個抽象;抽象元素不能依賴於具體元素,而具體元素則必須依賴於抽象元素。

(2)合理地對軟體應用系統在縱向方向進行分層隔離設計

通過合理地對軟體應用系統在縱向方向進行分層隔離設計——如目前的C/S和B/S等架構模式中的各個分層策略,將允許設計人員將複雜的軟體應用系統中所涉及的各個方面的問題分解成多個不同層次的實現。每一層最多只影響其相關聯的上、下兩層,同時只要給相鄰的上、下層提供接口或者實現接口,從而也就能夠允許每層使用不同的方法包括不同的技術來實現,因此為軟體應用系統的可重用提供了強大的結構支持。

經典的三層架構的系統設計——即自底向上依次是數據訪問層、業務邏輯層和表示層,而MVC架構模式是對它的進一步完善;下圖所示的J2EE Web系統平臺中的四層架構設計(表示層、控制層、業務邏輯層和數據訪問層)能夠保證軟體應用系統架構設計的結果是可重用的。

當然,為了進一步分離系統中的業務處理層和持久層之間的依賴耦合關係,也可以在系統的業務處理層和持久層之間插入一個數據服務層(一般應用於採用J2EE EJB分布式的數據訪問和存儲的應用系統的系統架構設計中)。如下示圖為J2EE EJB系統平臺中的五層架構設計示例圖,同樣也都能夠保證軟體應用系統架構設計的結果是可重用的。

(3)層與層之間應該要相互分離

在軟體應用系統的多層架構設計中,一般都倡導將軟體應用系統中的界面顯示功能、業務邏輯處理功能和數據訪問功能完全分離(但按照MVC架構模式的劃分規則,在軟體應用系統的系統架構設計中的業務邏輯層以及數據訪問層中的各個組件都屬於MVC架構模式中的模型組件),而不要在軟體應用系統的界面組件(一般處於系統的表示層)中加入應用邏輯功能實現,從而避免了在應用系統的需求發生變化時(功能方面或者非功能方面),而產生牽一髮而動全身的連鎖修改軟體應用系統的設計方案和功能實現的代碼,可以實現軟體應用系統的鬆耦合和良好的系統可維護性。

如下示圖為某個Web應用系統中的Web頁面實現的代碼局部截圖--HTML標籤和Java處理邏輯代碼混雜在一起。這樣的代碼設計導致表示層和業務邏輯處理層相關的程序代碼緊密耦合,其中的業務邏輯處理的程序代碼也是不可重用的——因為其中的某些功能模塊很難在別的軟體應用系統中被重新使用,因為不能將它從現有的軟體應用系統中獨立地提取出來——在Java程序代碼中混雜有HTML標籤,產生類似「拔出蘿蔔帶出泥」的狀況!

3、軟體應用系統在橫向結構方面也需要拆分為不同的功能模塊

(1)橫向拆分為不同的功能模塊

軟體應用系統的系統架構設計師為了能夠分離各個模塊之間的藕合度,應該要對軟體應用系統的橫向結構也進行拆分為不同的功能模塊。但設計人員如何能夠獲得低藕合的模塊設計結果?

常用的設計策略是遵守面向對象設計中所倡導的依賴倒置原則、並應用控制反轉和依賴注入技術(IOC,Inversion of Control)。下圖所示為某個字符轉換小系統的橫向分塊設計結果的UML組件圖的局部截圖。

(2)模塊之間依賴關係應該要儘可能達到低藕合的模塊設計目標

應用面向對象設計中所倡導的依賴倒置原則實現將依賴關係倒置為依賴接口,從而在很大程度上阻止了「由於需求發生變化而導致代碼修改」的變化波及範圍的擴大,有效地隔離了「變化」和有助於增強軟體應用系統的可重用性和可擴展性。

利用控制反轉技術能夠消解框架系統和軟體應用系統之間的依賴關係——因為利用「控制反轉」技術能夠減少對象的請求者對服務提供者的特定功能實現邏輯的依賴,此時系統中的各個組件類不再需要自己去查找或者實例化它們所依賴的其它目標組件類的對象實例。

如下示圖所示,在Struts 2框架中由於應用了ActionProxy代理,從而隔離軟體應用系統中的各種業務處理的Action組件對Servlet容器的依賴,並且Struts 2框架中的Action組件類無須繼承Struts2框架中的任何基類或實現任何的接口,為純的POJO。

而在早期的Struts框架中,由於承擔系統業務處理功能的Action組件直接繼承於Struts框架系統的ActionServlet組件(示例圖中的上圖),從而導致系統業務處理功能的Action組件緊密耦合Struts框架系統。

利用依賴注入消除軟體應用系統中的各個對象在創建時所產生的依賴藕合關係,在橫向分塊設計中儘管遵守了依賴倒置原則,也只能夠隔離對象的使用者和對象功能的實現者之間的依賴關係。但在創建具體實現類的對象實例時,仍會造成對於具體功能實現類的直接依賴。而採用依賴注入技術則可以消除這種在對象創建方面所產生的依賴性,如下示圖所示在Struts 2框架中應用struts.xml配置文件實現對軟體應用系統中的各個Action類的對象實例進行定義,而不是直接在程序代碼中創建出對象實例。

(3)通過不斷地進行設計重構過程逐步完善系統架構設計的設計結果

當然,軟體應用系統的設計人員在進行橫向分塊設計時,應該要儘可能減少各個模塊之間的相互關係、特別是要避免出現「多對多」的依賴關係。從上圖所示的組件圖中,讀者應該可以發現出該軟體應用系統中的各個功能組件之間的關係是比較複雜的!

其中軟體應用系統中的業務層(用戶信息管理、各種形式的字符轉換功能管理等)與軟體應用系統中的持久層之間存在「多對多」的關係、並且軟體應用系統中的業務層中的各個組件緊密依賴於持久層中的組件具體技術實現方式。

因此,對軟體應用系統中橫向分模塊設計需要不斷地進行系統重構,也就是在軟體應用系統的「持久層」和「業務層」之間可以增加一個「數據服務層」,從而隔離「業務層」對「持久層」的過分的依賴,並且可以在軟體應用系統中的「持久層」的具體技術實現發生變化時,不會影響到軟體應用系統中的「業務層」的功能實現。

該軟體應用系統重構後的各個組件模塊的UML組件圖請見下圖所示,最終解除了軟體應用系統中的業務層與持久層之間的「多對多」的關係!軟體應用系統中的各個組件模塊之間的關係都簡化為「單一關係」、而且高層組件只依賴於底層的組件——遵守了面向對象設計中的依賴倒置原則!

相關焦點

  • 軟體項目實訓及課程設計指導——如何實現面向對象的系統架構設計
    軟體項目實訓及課程設計指導——如何實現面向對象的系統架構設計1、什麼是面向對象的軟體應用系統的架構設計從軟體應用系統的架構設計師的角度來看,所謂的軟體應用系統的系統架構就是一套構建軟體應用系統的整體結構的各種設計準則
  • 軟體項目實訓及課程設計指導——系統設計中的系統架構設計示例
    軟體項目實訓及課程設計指導——軟體系統設計中的系統架構設計示例1、軟體系統概要設計中所涉及的主要設計內容和工作過程(1)在軟體應用系統項目的系統概要設計工作中,首先是要完成軟體系統的總體架構設計及系統的分層設計,然後再利用UML包視圖體現出軟體系統架構設計的最終結果
  • 軟體項目實訓及課程設計指導——軟體系統設計中的系統架構設計示例
    UML包視圖體現出軟體系統架構設計的最終結果。: (1)系統的安全性高——J2EE提供了從平臺到應用級的安全規範 (2)系統的穩定性和可用性好——J2EE是基於Java的健壯性和虛擬機實現的一致性基礎上的 (3)系統的可擴展性和可伸縮性好——J2EE能夠滿足企業對應用系統逐步升級的需要和能夠實現快速開發部署。
  • 如何在系統架構設計中應用面向切面的設計思想分離橫切關注點
    作者在此更多地是從軟體系統架構設計的角度介紹如何應用面向切面的主要思想完成系統的架構設計,而不再在代碼實現層次重複地介紹面向切面編程技術。>設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,增加程序的靈活性和可重用性。
  • 軟體項目實訓及課程設計指導——如何實現面向服務的系統架構設計
    此外,面向服務的軟體系統體系架構和其它形式的企業架構的不同之處就在於面向服務的軟體系統體系架構能夠提供業務的靈活性和可拔插性,因此能夠比較好地滿足企業異構應用環境下的企業應用系統之間的集成和整合。而面向對象的架構設計和面向切面的架構設計所倡導的「封裝」和「隔離」都是針對單一軟體應用系統本身的設計方法,而軟體應用系統之間如何能夠「封裝」、同時又能夠「協作」?
  • SWE.2軟體架構設計
    過程結果:為了成功地執行了這一過程: 1)定義了識別軟體要素的軟體架構設計; 2)軟體需求被分配到軟體的組成部分; 3)定義了各軟體要素的接口; 4)定義了軟體要素的動態行為和資源消耗目標; 5)在軟體需求和軟體架構設計之間建立一致性和雙向可追溯性
  • 軟體項目實訓及課程設計指導——如何在數據持久層中應用DAO模式
    軟體項目實訓及課程設計指導——如何在J2EE應用系統數據持久層中應用DAO模式1、為什麼要在軟體應用系統中提供數據持久層軟體應用系統中的數據持久層主要為整個軟體應用系統提供數據訪問功能服務,從而可以使軟體應用系統中的業務層組件的設計和開發人員能夠專注於系統業務邏輯的開發
  • SWE.2的軟體架構設計
    )定義了軟體要素的動態行為和資源消耗目標; 5)在軟體需求和軟體架構設計之間建立一致性和雙向可追溯性;及 6)對軟體架構設計達成一致並與所有受影響的各方進行溝通。[outcome2] SWE.2.BP3:定義軟體要素的接口。識別、開發和記錄每個軟體要素的接口。[outcome3] SWE.2.BP4:描述動態行為。評估和記錄軟體要素的時間和動態交互,以滿足系統的動態行為需求。[outcome4] 注2:動態行為由運行模式(如啟動、關機、正常模式、校準、診斷等)、過程和過程間通信、任務、線程、時間片、中斷等決定。
  • 如何應用數據訪問服務層分離系統中的業務層和持久層之間耦合關係
    軟體項目實訓及課程設計指導——如何應用數據訪問服務層分離業務層和持久層之間耦合關係作者已經在本系列文章《軟體項目實訓及課程設計指導--如何正確地設計J2EE應用系統持久層中的各個組件結構及關係》中為讀者介紹了為什麼要設計和應用數據訪問服務接口的目的及如何設計該接口以真正達到利用數據訪問服務層組件隔離業務處理邏輯和數據訪問操作邏輯的應用效果
  • 在軟體系統設計中如何降低軟體系統中程序類之間耦合關係(上篇)
    軟體項目實訓及課程設計指導——如何降低軟體系統中程序類之間耦合關係(上篇)1、分離軟體應用系統中各個模塊類的接口定義和對應接口的具體功能實現面向對象程序類設計的五大原則中的「開放-封閉原則」 ( OCP,Open-Close Principle)倡導分離接口的定義和接口的具體功能實現的設計原則
  • 全面解析 Netflix 的微服務架構設計
    儘管 Netflix 必須重建整個技術體系,以使其能在 AWS 雲上平穩運行,但作為回報,系統的可擴展性和服務可用性得到顯著提高。Netflix 還是微服務架構背後的首批主要推動者之一。微服務鼓勵關注點分離來解決單體軟體設計存在的問題。在這種架構中,大型程序通過模塊化和獨立的數據封裝被分解為許多較小的軟體組件。
  • 五大常用軟體架構分析方案
    軟體升級時,可能需要整個服務暫停 擴展性差。,可以合為一體,整個軟體就分成事件代理和事件處理器兩部分。,缺點是會出現單點失敗,消息代理可能要做成集群 優點 擴展性好,各個服務之間低耦合 容易部署,軟體從單一可部署單元,被拆成了多個服務,每個服務都是可部署單元 容易開發,每個組件都可以進行持續集成式的開發,可以做到實時部署,不間斷地升級
  • 項目實訓及課程設計——如何合理地設計軟體應用系統的Web表示層
    軟體項目實訓及課程設計指導——如何合理地設計軟體應用系統的Web表示層1、用戶界面是軟體應用系統的門面,在設計和開發實現時必須高度重視軟體應用系統表示層內的各個組件是軟體應用系統的前端界面組件,它們直接與應用該軟體應用系統的最終操作者發生各種人機互動行為。
  • 軟體項目實訓及課程設計指導——如何在項目中實現日誌、事務功能
    軟體項目實訓及課程設計指導——如何在J2EE平臺項目中實現交易日誌、事務控制等功能1.1 基於面向切面AOP設計思想的系統架構設計實現交易日誌的應用示例1、面向對象OOP設計中的「開-閉」(OCP,Open-Close Principle)設計原則
  • 如何正確地應用Web MVC架構模式分離表示層和模型處理層耦合關係
    軟體項目實訓及課程設計指導——如何正確地應用Web MVC架構模式分離表示層和模型處理層耦合關係1、MVC體系架構設計模式是用來幫助系統設計人員控制「變化」的一種設計模式MVC體系架構設計模式是上世紀80年代在Smalltalk-80中出現的一種軟體設計模式
  • 軟體項目實訓及課程設計指導——UML靜動態建模在詳細設計中應用
    另外,讀者在項目開發實現過程中,不應該直接根據對軟體系統的設計結果進行代碼編程實現,還必須要對軟體系統設計的結果進行重構和優化以保證對軟體系統的設計結果是合理和正確的、並滿足軟體系統需求中的各種要求的。
  • 業務變化不息,架構演進不止 第四屆領域驅動設計峰會線上開啟
    Neal Ford指出,演進式架構是在當需求出現的時候通過適應函數來把握架構演進的方向,演進式架構隨著系統和業務的增加而變化,而且能夠保證用戶得到想要的部分,追求性能上的優化,追求擴展性的不斷提升。演進式架構支持跨多個維度的引導性增量更改。演進架構從進化計算世界借鑑了適應度函數的概念,以定義所謂的架構適應性功能。
  • 業務變化不息 架構演進不止 第四屆領域驅動設計峰會線上開啟
    在峰會的主題分享上,Neal Ford討論了有關可演進架構的兩個關鍵洞察。Neal Ford指出,演進式架構是在當需求出現的時候通過適應函數來把握架構演進的方向,演進式架構隨著系統和業務的增加而變化,而且能夠保證用戶得到想要的部分,追求性能上的優化,追求擴展性的不斷提升。演進式架構支持跨多個維度的引導性增量更改。
  • 分離可組合式存儲系統架構的特點和挑戰
    因此,在設計存儲系統時需要均衡考量的因素也變得更多更複雜,不僅需要考慮異構資源條件下的存儲體系結構問題,而且還涉及異構資源的容量配比、數據遷移,以及如何根據訪問特徵與應用需求實現自適應調整,以期望在性能、可靠性、成本等多方面實現最優權衡。 除了資源異構性之外,資源的彈性分配與擴容也是存儲與計算分離框架下的關鍵問題。
  • 用友NC技術架構!
    一、概述 用友NC是為集團與行業企業提供的全線管理軟體產品,用友NC率先採用J2EE架構和先進開放的集團級開發平臺UAP,按照「全球化集團管控、行業化解決方案、平臺化應用集成」的設計理念而設計