運用RUP 4+1視圖方法進行軟件架構設計

 

級別: 初級

溫 昱 ([email protected]), 鬆耦合空間網站 技術諮詢顧問

2006 年 7 月 20 日

要開發出用戶滿意的軟件並不是件容易的事,軟件架構師必須全面把握各種各樣的需求、權衡需求之間有可能的矛盾之處,分門別類地將不同需求一一滿足。本文從理解需求種類的複雜性談起,通過具體案例的分析,展示瞭如何通過RUP的4+1視圖方法,針對不同需求進行架構設計,從而確保重要的需求一一被滿足。

呼喚架構設計的多重視圖方法

靈感一閃,就想出了把大象放進冰箱的辦法,這自然好。但希望每個架構設計策略都依靠靈感是不現實的--我們需要系統方法的指導。

需要架構設計的多重視圖方法,從根本上來說是因爲需求種類的複雜性所致。以工程領域的例子開道吧。比如設計一座跨江大橋:我們會考慮"連接南北的公路交通"這個"功能需求",從而初步設計出理想化的橋墩支撐的公路橋方案;然後還要考慮造橋要面臨的"約束條件",這個約束條件可能是"不能影響萬噸輪從橋下通過",於是細化設計方案,規定橋墩的高度和橋墩之間的間距;另外還要顧及"大橋的使用期質量屬性",比如爲了"能在湍急的江流中保持穩固",可以把大橋橋墩深深地建在岩石層之上,和大地渾然一體;其實,"建造期間的質量屬性"也很值得考慮,比如在大橋的設計過程中考慮"施工方便性"的一些措施。

和工程領域的功能需求、約束條件、使用期質量屬性、建造期間的質量屬性等類似,軟件系統的需求種類也相當複雜,具體分類如圖1所示。


圖1 軟件需求分類的複雜性
圖1  軟件需求分類的複雜性




回頁首


超市系統案例:理解需求種類的複雜性

例子是最好的老師。爲了更好地理解軟件需求種類的複雜性,我們來分析一個實際的例子。在表1中,我們列舉了一個典型的超市系統的需求子集,從這個例子中可以清晰地看到需求可以分爲兩大類:功能需求和非功能需求。


表1 超市系統案例:理解需求種類的複雜性
表1  超市系統案例:理解需求種類的複雜性

簡單而言,功能需求就是"軟件有什麼用,軟件需要做什麼"。同時,注意把握功能需求的層次性是軟件需求的最佳實踐。以該超市系統爲例:

  • 超市老闆希望通過軟件來"提高收銀效率"。
  • 那麼,你可能需要爲收銀員提供一系列功能來促成這個目的,比如供收銀員使用的"任意商品項可單獨取消"功能有利於提供收銀效率(筆者曾在超市有過被迫整單取消然後一車商品重新掃描收費的痛苦經歷)。
  • 而具體到這個超市系統,系統分析員可能會決定要提供的具體功能爲:通過收銀終端的按鍵組合,可以使收銀過程從"逐項錄入狀態"進入"選擇取消狀態",從而取消某項商品。

從上面的例子中我們還驚訝地發現,非功能需求--人們最經常忽視的一大類需求--包括的內容非常寬、並且極其重要。非功能需求又可以分爲如下三類:

  • 約束。要開發出用戶滿意的軟件並不是件容易的事,而全面理解要設計的軟件系統所面臨的約束可以使你向成功邁進一步。約束性需求既包括企業級的商業考慮(例如"項目預算有限"),也包括最終用戶級的實際情況(例如"用戶的平均電腦操作水平偏低");既可能包括具體技術的明確要求(例如"要求能在Linux上運行"),又可能需要考慮開發團隊的真實狀況(例如"開發人員分散在不同地點")。這些約束性需求當然對架構設計影響很大,比如受到"項目預算有限"的限制,架構師就不應選擇昂貴的技術或中間件等,而考慮到開發人員分散在不同地點",就更應注重軟件模塊職責劃分的合理性、鬆耦合性等等。
  • 運行期質量屬性。這類需求主要指軟件系統在運行期間表現出的質量水平。運行期質量屬性非常關鍵,因爲它們直接影響着客戶對軟件系統的滿意度,大多數客戶也不會接受運行期質量屬性拙劣的軟件系統。常見的運行期質量屬性包括軟件系統的易用性、性能、可伸縮性、持續可用性、魯棒性、安全性等。在我們的超市系統的案例中,用戶對高性能提出了具體要求(真正的性能需求應該量化,我們的表1沒體現),他們不能容忍金額合計超過2秒的延時。
  • 開發期質量屬性。這類非功能需求中的某些項人們倒是念念不忘,可惜很多人並沒有意識到"開發期質量屬性"和"運行期質量屬性"對架構設計的影響到底有何不同。開發期質量屬性是開發人員最爲關心的,要達到怎樣的目標應根據項目的具體情況而定,而過度設計(overengineering)會花費額外的代價。




回頁首


什麼是軟件架構視圖

那麼,什麼是軟件架構視圖呢?Philippe Kruchten在其著作《Rational統一過程引論》中寫道:

一個架構視圖是對於從某一視角或某一點上看到的系統所做的簡化描述,描述中涵蓋了系統的某一特定方面,而省略了於此方面無關的實體。

也就是說,架構要涵蓋的內容和決策太多了,超過了人腦"一蹴而就"的能力範圍,因此採用"分而治之"的辦法從不同視角分別設計;同時,也爲軟件架構的理解、交流和歸檔提供了方便。

值得特別說明的,大多數書籍中都強調多視圖方法是軟件架構歸檔的方法,其實不然。多視圖方法不僅僅是架構歸檔技術,更是指導我們進行架構設計的思維方法。





回頁首


Philippe Kruchten提出的4+1視圖方法

1995年,Philippe Kruchten在《IEEE Software》上發表了題爲《The 4+1 View Model of Architecture》的論文,引起了業界的極大關注,並最終被RUP採納。如圖2所示。


圖2 Philippe Kruchten提出的4+1視圖方法
圖2  Philippe Kruchten提出的4+1視圖方法

該方法的不同架構視圖承載不同的架構設計決策,支持不同的目標和用途:

  • 邏輯視圖:當採用面向對象的設計方法時,邏輯視圖即對象模型。
  • 開發視圖:描述軟件在開發環境下的靜態組織。
  • 處理視圖:描述系統的併發和同步方面的設計。
  • 物理視圖:描述軟件如何映射到硬件,反映系統在分佈方面的設計。




回頁首


運用4+1視圖方法:針對不同需求進行架構設計

如前文所述,要開發出用戶滿意的軟件並不是件容易的事,軟件架構師必須全面把握各種各樣的需求、權衡需求之間有可能的矛盾之處,分門別類地將不同需求一一滿足。

Philippe Kruchten提出的4+1視圖方法爲軟件架構師"一一征服需求"提供了良好基礎,如圖3所示。


圖3 運用4+1視圖方法針對不同需求進行架構設計
圖3  運用4+1視圖方法針對不同需求進行架構設計

邏輯視圖。邏輯視圖關注功能,不僅包括用戶可見的功能,還包括爲實現用戶功能而必須提供的"輔助功能模塊";它們可能是邏輯層、功能模塊等。

開發視圖。開發視圖關注程序包,不僅包括要編寫的源程序,還包括可以直接使用的第三方SDK和現成框架、類庫,以及開發的系統將運行於其上的系統軟件或中間件。開發視圖和邏輯視圖之間可能存在一定的映射關係:比如邏輯層一般會映射到多個程序包等。

處理視圖。處理視圖關注進程、線程、對象等運行時概念,以及相關的併發、同步、通信等問題。處理視圖和開發視圖的關係:開發視圖一般偏重程序包在編譯時期的靜態依賴關係,而這些程序運行起來之後會表現爲對象、線程、進程,處理視圖比較關注的正是這些運行時單元的交互問題。

物理視圖。物理視圖關注"目標程序及其依賴的運行庫和系統軟件"最終如何安裝或部署到物理機器,以及如何部署機器和網絡來配合軟件系統的可靠性、可伸縮性等要求。物理視圖和處理視圖的關係:處理視圖特別關注目標程序的動態執行情況,而物理視圖重視目標程序的靜態位置問題;物理視圖是綜合考慮軟件系統和整個IT系統相互影響的架構視圖。





回頁首


設備調試系統案例概述

本文的以下部分,將研究一個案例:某型號設備調試系統。

設備調試員通過使用該系統,可以察看設備狀態(設備的狀態信息由專用的數據採集器實時採集)、發送調試命令。該系統的用例圖如圖4所示。


圖4 設備調試系統的用例圖
圖4 設備調試系統的用例圖

經過研製方和委託方的緊密配合,最終確定的需求可以總括地用表2來表示。


表2 設備調試系統的需求
表2  設備調試系統的需求

下面運用RUP推薦的4+1視圖方法,從不同視圖進行架構設計,來分門別類地將不同需求一一滿足。





回頁首


邏輯視圖:設計滿足功能需求的架構

首先根據功能需求進行初步設計,進行大粒度的職責劃分。如圖5所示。

  • 應用層負責設備狀態的顯示,並提供模擬控制檯供用戶發送調試命令。
  • 應用層使用通訊層和嵌入層進行交互,但應用層不知道通訊的細節。
  • 通訊層負責在RS232協議之上實現一套專用的"應用協議"。
  • 當應用層發送來包含調試指令的協議包,由通訊層負責按RS232協議將之傳遞給嵌入層。
  • 當嵌入層發送來原始數據,由通訊層將之解釋成應用協議包發送給應用層。
  • 嵌入層負責對調試設備的具體控制,以及高頻度地從數據採集器讀取設備狀態數據。
  • 設備控制指令的物理規格被封裝在嵌入層內部,讀取數採器的具體細節也被封裝在嵌入層內部。

圖5 設備調試系統架構的邏輯視圖
圖5  設備調試系統架構的邏輯視圖




回頁首


開發視圖:設計滿足開發期質量屬性的架構

軟件架構的開發視圖應當爲開發人員提供切實的指導。任何影響全局的設計決策都應由架構設計來完成,這些決策如果"漏"到了後邊,最終到了大規模並行開發階段才發現,可能造成"程序員碰頭兒臨時決定"的情況大量出現,軟件質量必然將下降甚至導致項目失敗。

其中,採用哪些現成框架、哪些第三方SDK、乃至哪些中間件平臺,都應該考慮是否由軟件架構的開發視圖確定下來。圖6展示了設備調試系統的(一部分)軟件架構開發視圖:應用層將基於MFC設計實現,而通訊層採用了某串口通訊的第三方SDK。


圖6 設備調試系統架構的開發視圖
圖6  設備調試系統架構的開發視圖

在說說約束性需求。約束應該是每個架構視圖都應該關注和遵守的一些設計限制。例如,考慮到"一部分開發人員沒有嵌入式開發經驗"這條約束情況,架構師有必要明確說明系統的目標程序是如何編譯而來的:圖7展示了整個系統的桌面部分的目標程序pc-moduel.exe、以及嵌入式模塊rom-module.hex是如何編譯而來的。這個全局性的描述無疑對沒有經驗的開發人員提供了實感,利於更全面地理解系統的軟件架構。


圖7 設備調試系統架構的開發視圖
圖7  設備調試系統架構的開發視圖




回頁首


處理視圖:設計滿足運行期質量屬性的架構

性能是軟件系統運行期間所表現出的一種質量水平,一般用系統響應時間和系統吞吐量來衡量。爲了達到高性能的要求,軟件架構師應當針對軟件的運行時情況進行分析與設計,這就是我們所謂的軟件架構的處理視圖的目標。處理視圖關注進程、線程、對象等運行時概念,以及相關的併發、同步、通信等問題。圖8展示了設備調試系統架構的處理視圖。

可以看出,架構師爲了滿足高性能需求,採用了多線程的設計:

  • 應用層中的線程代表主程序的運行,它直接利用了MFC的主窗口線程。無論是用戶交互,還是串口的數據到達,均採取異步事件的方式處理,杜絕了任何"忙等待"無謂的耗時,也縮短了系統響應時間。
  • 通訊層有獨立的線程控制着"上上下下"的數據,並設置了數據緩衝區,使數據的接收和數據的處理相對獨立,從而數據接收不會因暫時的處理忙碌而停滯,增加了系統吞吐量。
  • 嵌入層的設計中,分別通過時鐘中斷和RS232口中斷來激發相應的處理邏輯,達到輪詢和收發數據的目的。

圖8 設備調試系統架構的處理視圖
圖8  設備調試系統架構的處理視圖




回頁首


物理視圖:和部署相關的架構決策

軟件最終要駐留、安裝或部署到硬件才能運行,而軟件架構的物理視圖關注"目標程序及其依賴的運行庫和系統軟件"最終如何安裝或部署到物理機器,以及如何部署機器和網絡來配合軟件系統的可靠性、可伸縮性等要求。圖9所示的物理架構視圖表達了設備調試系統軟件和硬件的映射關係。可以看出,嵌入部分駐留在調試機中(調試機是專用單板機),而PC機上是常見的桌面可執行程序的形式。


圖9 設備調試系統架構的物理視圖
圖9  設備調試系統架構的物理視圖

我們還可能根據具體情況的需要,通過物理架構視圖更明確地表達具體目標模塊及其通訊結構,如圖10所示。


圖10 設備調試系統架構的物理視圖
圖10  設備調試系統架構的物理視圖




回頁首


小結與說明

所謂本立道生。深入理解軟件需求分類的複雜性,明確區分功能需求、約束、運行期質量屬性、開發期質量屬性等不同種類的需求就是"本",因爲各類需求對架構設計的影響截然不同。本文通過具體案例的分析,展示瞭如何通過RUP的4+1視圖方法,針對不同需求進行架構設計,從而確保重要的需求一一被滿足。

本文重點在於方法的解說,因此省略了對架構設計中不少具體問題的說明,同時本文提供的說明架構設計方案的模型也經過了簡化。請讀者注意。



參考資料

  1. Philippe Kruchten著,周伯生等譯. Rational統一過程引論(原書第2版). 機械工業出版社,2002
  2. Karl E. Wiegers著,劉偉琴等譯. 軟件需求(第2版). 清華大學出版社,2004


關於作者

溫昱。架構設計師,技術諮詢顧問,鬆耦合空間網站創辦人。擅長面向對象、架構和框架設計,對設計模式、UML、RUP和軟件工程有深入研究。曾在金融、航空、多媒體、網絡管理、中間件平臺等領域負責和參與多個大型系統的設計和開發。發表《擁抱變化:敏捷設計從理論到實踐》、《隨需而變的RUP》等文章數十篇,目前譯著有《應用框架的設計與實現--.NET平臺》一書。可以通過[email protected]與溫昱聯繫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章