軟體項目實訓及課程設計指導——可擴展和可重用是架構設計的目標

2020-12-16 楊教授工作室

軟體項目實訓及課程設計指導——可擴展性和可重用性是面向對象架構設計的主要目標

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基類,從而實現對系統框架的重用,同時也允許根據應用系統的特定應用需求修改和擴充——通過新增、覆蓋或者重載等形式。

相關焦點

  • 軟體項目實訓及課程設計指導——如何實現面向服務的系統架構設計
    軟體項目實訓及課程設計指導——如何實現面向服務的系統架構設計1、什麼是基於SOA的軟體系統架構(1)什麼是面向服務的軟體系統體系架構所謂的SOA(Service-Oriented Architecture,面向服務的軟體系統體系架構
  • 如何保證軟體應用系統架構設計結果的可擴展性和可重用性(上篇)
    軟體項目實訓及課程設計指導——如何保證軟體應用系統架構設計結果的可擴展性和可重用性(上篇)1、良好的可重用性軟體系統架構設計結果的主要體現可重用性的軟體應用系統的系統架構設計結果主要體現在如下兩個方面——本項目的系統架構設計的結果是可重用的和在本項目的系統架構設計中重用成熟的系統架構設計方案
  • 軟體項目實訓及課程設計指導——系統概要設計中的組件設計示例
    軟體項目實訓及課程設計指導——軟體系統概要設計中的組件設計示例1、UML技術規範中的UML組件及UML組件圖UML技術規範中的組件是軟體應用系統的一個物理單元,它代表軟體應用系統中的一個物理實現的功能模塊——在Java技術平臺中一般為一個*.jar包文件。
  • 軟體項目實訓及課程設計指導——明確教學環節及了解學生的現狀
    軟體項目實訓及課程設計指導——明確課程設計的教學環節的意義及了解學生能力的現狀1、引言「課程設計」、「項目實訓」和「畢業設計」是目前高校計算機類、軟體工程類專業的學生的學生在校期間接觸企業實際軟體項目開發的主要教學環節
  • 項目實訓及課程設計——如何合理地設計軟體應用系統的Web表示層
    軟體項目實訓及課程設計指導——如何合理地設計軟體應用系統的Web表示層1、用戶界面是軟體應用系統的門面,在設計和開發實現時必須高度重視軟體應用系統表示層內的各個組件是軟體應用系統的前端界面組件,它們直接與應用該軟體應用系統的最終操作者發生各種人機互動行為。
  • 軟體項目實訓及課程設計指導——實體類結構和類關係的設計示例
    軟體項目實訓及課程設計指導——系統概要設計中的實體類結構和關係的設計示例1、軟體應用系統中的實體類及主要的作用軟體應用系統中的實體類主要是指軟體系統中代表人、地點、事物或概念等方面的數據對象。採用實體關係圖描述軟體應用系統中的數據模型,能夠幫助軟體應用系統的設計人員預先精確定義出軟體應用系統中的各種數據需求,使軟體應用系統的設計人員能夠對以後的系統改進和軟體應用系統可能的需求變化做出有效的設計規劃——能夠隨著軟體應用系統的開發實現的進展,不斷地改進和完善軟體應用系統的規劃、設計和重構。
  • 課程設計指導——如何應用XML+XSLT技術分離Web表示層數據和樣式
    軟體項目實訓及課程設計指導——如何應用XML+XSLT技術分離Web表示層數據和樣式1、「XML+XSLT」技術在J2EE技術平臺中的應用Java語言及相關的應用技術的產生解決了跨平臺的軟體應用系統的開發,但沒有解決如何實現跨平臺的數據交換問題。
  • 課程設計指導——如何應用Java反射技術靈活地創建程序類對象實例
    軟體項目實訓及課程設計指導——如何應用Java反射技術靈活地創建程序類的對象實例1、如何應用屬性配置文件實現對系統中的配置信息進行讀寫操作Java中的屬性配置文件主要可以作為軟體應用系統及項目的配置文件,比如許多J2EE的開源框架系統中都提供了屬性配置文件作為該應用框架的對外配置文件
  • 軟體架構設計:軟體質量屬性、架構風格的案例
    【案例描述】某軟體公司為某品牌手機廠商開發一套手機應用程式集成開發環境,以提高開發手機應用程式的質量和效率。在項目之初,公司的系統分析師對該集成開發環境的需求進行了調研和分析,具體描述如下:a.需要同時支持該廠商自行定義的應用程式語言的編輯、界面可視化設計、編譯、調試等模塊,這些模塊產生的模型或數據格式差異較大,集成環境應提供數據集成能力。集成開發環境還要支持以適配方式集成公司現有的應用模擬器工具。
  • 業務變化不息,架構演進不止 第四屆領域驅動設計峰會線上開啟
    業務的劇變對架構平臺帶來了巨大的衝擊,如何客觀地評估分析架構現狀、該從哪些維度設定架構演進的目標,又如何引導架構增量地向目標演進,成為當下企業持續探索的命題之一。演進式架構最初目的是研究適應度函數的可演進性,在此過程中,我們希望能夠衡量特定架構風格的演進程度,雖然產生了許多代碼級量度,但是這還不夠。受到DDD的啟發,Neal Ford提出了軟體架構的量子概念。架構量子是一種以軟體架構表示的領域驅動設計中的有限上下文的想法。架構量子具有高功能凝聚力和同步通信的獨立可部署組件。
  • 「漫談」軟體設計的目標和途徑是什麼?
    記錄一下筆者關於軟體設計的一些相關認知。在開始之前,先引入兩個概念目標和途徑(這裡可能會有些咬文嚼字,不過主要是為了區分主觀和客觀的一些細微差異)。1 目標和途徑我們在做某一件事情的時候,總是會帶有一定的目的性的:比如說一日三餐,是為了給身體補充所需的能量。
  • 課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能
    軟體項目實訓及課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能1、緩存應用技術是提高軟體應用系統性能的最簡單和最有效的方式之一在計算機的軟硬體系統中大量地應用緩存(Cache)技術,所謂「緩存」是指位於「目標」(可以為軟體類的應用系統,也可以為硬體設備或者部件
  • Netflix 微服務架構設計解析
    儘管 Netflix 需要重構整個技術體系,以使其能在 AWS 雲上平穩運行,但作為回報,系統的可擴展性和服務可用性得到明顯地提高。Netflix 還是微服務架構背後的首批主要推動者之一。微服務鼓勵關注點分離來解決單體軟體設計存在的問題。在這種架構中,大型程序通過模塊化和獨立的數據封裝被分解為許多較小的軟體組件。微服務還通過水平擴展和工作負載分區來提升可擴展性。
  • 電子工程師的頂級PCB設計軟體工具:46種PCB設計的必備工具
    這就是為什麼我們匯集了46個用於電子工程師的頂級PCB設計軟體工具–節省了您在設計項目時所花費的時間。我們還意識到,一種軟體工具可能適合一個PCB項目,而另一種軟體工具可以更好地適用於其他類型的項目。結果,我們在清單中包括了簡單工具,免費工具和專有工具。
  • (全文收藏)電能路由器設計自動化綜述:設計流程架構和遺傳算法
    一般地,提升變換器設計效果、提高設計效率可以從四個方面入手:改進設計流程架構、改進正向模型與特性分析過程、改進尋優算法和高效設計工具的軟體實現。在設計流程架構上,電力電子設計自動化將傳統單步順序優化改進為多學科設計優化。
  • 課程目標設計的基本方式
    課程目標設計不僅僅是課程專家應考慮的問題,也是學校管理者和教師在課程實施過程中必須考慮的問題。不管哪一門課程,課程目標的陳述方式應該是一致的。一般說來,完整的課程目標體系包括三類:結果性目標、體驗性目標與表現性目標,因此,目標的陳述也有相應的三種基本的方式。1.結果性目標的陳述方式所謂結果性目標,即明確告訴人們學生的學習結果是什麼。
  • 如何設計可穿戴產品?可穿戴產品設計的幾大要素分析
    製造商和服務提供商競相爭奪同樣的可穿戴「市場大餅」。成功設計可穿戴式產品是一項複雜的工程。成功的產品需要成本、性能、功能、電池使用壽命的完美組合,必須具備引人注目的外觀、感受和表現以吸引消費者。我們需要通過關注最終用戶體驗和探索使用情形,以便在可穿戴產品中集成各種不同元素並完成複雜的權衡。   典型的嵌入式系統通常開始於功能和能力定義,它們可說是項目的首要驅動關鍵。
  • 微信、陌陌等著名IM軟體設計架構詳解
    為了保證穩定,微信用了長連結和短連結相結合,例如:1 、兩個域名微信劃分了 http 模式(short連結)和 tcp 模式(long 連結),分別應對狀態協議和數據傳輸協議。 陌陌設計陌陌發展剛開始由於規模小,30-40W的連接數(包括Android後臺長連接用戶),也使用XMPP;由於XMPP的缺點:流量大(基於XML),不可靠(為傳統固定網絡設計,沒有考慮 WIFI/2G/3G/地鐵/電梯等複雜網絡場景),交互複雜(登陸需5-6次,尤其是TLS握手);XMPP丟消息的根本原因:服務端和客戶端處於
  • 從分而治之的思想到架構的設計
    而之所以兼容性這麼好,主板和各個零部件都能各自獨立演化,這與固定的接口標準有莫大的關係。我們軟體也一樣,如果可以的話,儘量保持接口不變,邏輯儘量歸納到接口支持範圍內,而不是去突破接口。(左中右三類部件只要契約/接口不變,其就能各自獨立的演化)架構的設計什麼是架構呢?架構是一種設計,一種指導設計的設計,一種為了達到某種目的、效果而對子設計進行限制和規範的設計。
  • 如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息
    軟體項目實訓及課程設計指導——如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息1、什麼是策略(Strategy)設計模式策略設計模式把「算法」(也就是軟體應用系統中的業務規則或者待實現的功能等)和「環境」(封裝軟體應用系統在實際應用時的場景)相互分離