軟件設計
在軟件生命周期中:
分析 —— 設計 —— 編碼 —— 測試 —— 維護
軟件設計的定義
-
軟件系統或組件的架構、構件、接口和其他特性的定義過程及該過程的結果。
-
是連接用戶需求和軟件技術的橋梁
-
即:用戶需求——>軟件設計——>軟件技術
-
設計工程活動分類,描述軟件的概貌與細節
軟件架構設計(有時稱為頂層設計)
- 描述軟件的頂層架構和組織,划分不同的組件
軟件詳細設計
- 詳細描述各組件以便能夠編碼實現
設計過程分類:
-
軟件設計主要為分解設計D-design(Decomposition design),也就是將軟件映射為各組件;
-
可以少部分包括系列模式設計FP-design(Family Pattern design),可以幫助我們提高相似組件的可復用性
設計模型
•模型輸入
之前在軟件需求階段監理的數據模型、功能模型和行為模型
•此階段要建立的設計模型分類
數據設計 、架構設計 、接口設計 、組件設計
分析模型到設計模型的轉化
部分分析模型所得到的結果與設計模型四部分的對應關系如圖所示。
一種分析模型的結果可能會對多個設計模型產生影響,比如類圖中類的屬性和類間關系對數據的設計、類的操作對構件級的設計都會產生非常大的影響。
反過來,一個設計模型也有可能受到多個分析模型的影響,比如接口的設計會參考順序圖對象之間的消息交互,也會參考用例之間的關系類型。
軟件設計質量
好的設計應該具有如下三個特點:
- 第一,正確的承上,也就是說正確傳遞分析模型的結果;
- 第二,正確的啟下,即是說對軟件開發后續過程的進行是有幫助的,對編碼人員、測試人員及后續的維護人員是可讀可理解的;
- 第三,從實現的角度給軟件一個完整的說明,通過設計方案能夠准確的預期未來的產品形態。
設計質量屬性
從以下方面衡量:
- 功能性,指的是軟件的功能要完整,符合用戶的預期。
- 易用性,指的是軟件要好用,界面對用戶友好。
- 可靠性,是指軟件不易出錯,運行穩定。
- 性能,主要是指軟件的吞吐率和響應時間等等,能運行而且運行流暢。
- 可支持性,又包含三個屬性:擴展性、適應性和可維護性。擴展性是指軟件添加新的功能或升級已有功能是否方便;適應性是指軟件適應新的環境、新的變化是否容易;
- 可維護性,是指程序代碼是否易懂、軟件維護期間的成本是否更小等等。
設計指導原則
- 設計應該先制作架構,先勾勒全貌,不能一開始就跳入細節。
- 設計應該是模塊化的,把大問題分解為小問題
- 設計應該包含四個方面:數據、體系結構、接口和組件
- 注意導出的設計模塊的可復用性
- 設計結果要簡單易懂,切忌追求復雜的畫圖技巧。
設計相關的八大概念
- 抽象
- 體系結構
- 設計模式
- 模塊化
- 信息隱藏
- 功能獨立
- 精化
- 重構
其中:“信息隱藏”,它同時也是一個信息安全領域的概念,與信息的保密性和完整性有關,而在軟件工程里的信息隱藏,主要是指把細節信息隱藏在接口之后,切勿混淆。
1·抽象
抽象是指從不同的東西里找相同點,也就是透過現象看本質。
分類:數據抽象、過程抽象。例如“開”、“門”
2·體系結構
•定義:軟件的整體結構
•體系結構設計可以使用大量的一種或多種模型來表達
•結構模型
•框架模型
•動態模型
•過程模型
•功能模型
3·設計模式
在給定上下文環境中一類共同問題的共同解決方案
•實體模式
•結構模式
•行為模式
設計模式舉例——抽象工廠
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
這里我僅以抽象工廠作為一個設計模式來舉例說明其作用。工廠1和工廠2都可以生產產品A和產品B,但生產的工藝流程是不同的。作為顧客來說,我想得到產品A或B,但我並不關心是由工廠1還是工廠2來生產這個產品,我只關心最終結果而不是過程。所以我們就可以采取如圖所示的方案,用工廠接口和產品接口去屏蔽實現的細節。
4· 模塊化
•軟件被划分為命名和功能相對獨立的多個組件(通常稱為模塊),通過這些組件的集成來滿足問題的需求
模塊化,指的是將軟件划分成為多個不同的組件來實現和管理。聽起來很簡單,可是這些模塊也不能隨意的切分,要考慮讓他們盡量的相對獨立;而且也不能夠無限度的划分下去,並不是模塊分的越細越好。關於模塊化的理論依據是基於人類解決問題的觀測數據。
模塊化和軟件成本
問題:如何確定最小代價區間M ??
如圖所示,隨着模塊個數的增多,模塊的成本在不斷的降低,而模塊之間的集成成本則在不斷的升高。你可以理解為,模塊划分的越細,單個模塊所需要的代碼行數就越少,但調度這些模塊所需的代碼就越來越多。在模塊個數較少時,模塊成本的降低對總成本的影響較大,而當模塊個數足夠多時,模塊集成的成本對總成本的影響較大,所以,模塊的個數會存在一個最合理的最小代價區間。
模塊化設計標准
- 模塊化的分解性:可分解為子問題
- 模塊化的組合性:組裝可重用的組件
- 模塊化的可理解性:可作為獨立單元理解
- 模塊化的連續性:需求小變化只影響單個模塊
- 模塊化的保護:模塊內異常只影響自身
5·信息隱藏
信息隱藏的原則是指,模塊定義和設計時應該保證模塊內的信息不可以被不需要這些信息的其他模塊訪問。模塊與模塊之間就像黑盒。
•模塊化基本問題 如何分解軟件系統以達最佳的模塊划分
•信息隱藏原則
模塊應該具有彼此相互隱藏的特性
•即:模塊定義和設計時應當保證模塊內的信息(過程和數據)不可以被不需要這些信息的其他模塊訪問
•特點
•抽象有助於定義構成軟件的過程(或信息)實體。
•信息隱藏原則定義和隱藏了模塊內的過程細節和模塊內的本地數據結構。
6·功能獨立
每個模塊只負責需求中特定的子功能,並且從程序結構的其他部分看,該模塊具有簡單的接
好處
- 易於開發:功能被划分,接口被簡化
- 易於維護(和測試)︰次生影響有限,錯誤傳遞減少,模塊重用定性衡量標准
- 內聚性:模塊的功能相對強度·耦合性:模塊之間的相互依賴程度·模塊獨立性強=高內聚低耦合
7·精化
精化就是逐步求精的過程,它與抽象的概念相反。抽象是不拘泥於底層的細節,提煉出相同的過程和數據;而精化是讓設計者在設計過程中逐步揭示底層的細節。
與抽象的關系
-
抽象使設計師確定過程和數據,但不局限於底層細節
-
精化有助於設計者在設計過程中揭示底層細節
8·重構
不改變組件功能和行為條件下,簡化組件設計(或代碼)的一種重組技術
方法
檢查現有設計的冗余情況、未使用的設計元素、無效或不必要的算法、較差的構建方式或不恰當的數據結構,或任何其他可被更改從而優化設計的問題。它與功能性無關,但能夠提高程序后期的可維護性。
設計技術概要
- 數據設計,數據是軟件要操縱和維護的信息對象,沒有了數據,軟件的運行將沒有意義。
- 架構設計,就像房子的框架結構設計一樣,表明軟件的總體結構。
- 接口設計,不同的組件之間一定要有適配的插頭和插座,而且接口連接了系統不同的組成部分。
- 組件設計,它也是最重要的,因為功能的實現主要在組件內部完成。
1、數據設計
•含義
數據設計(數據架構)用來構建高層抽象(客戶/用戶的數據視圖)的數據模型、信息模型
•相關概念
•數據建模 (數據字典、E-R圖、類圖)
•數據結構 (計算機存儲和組織數據的方式)
•數據庫 (基於數據結構來組織存儲和管理數據的方式)
•數據倉庫 (數據倉庫是更大規模的特殊組織的數據庫)
概念數據模型
數據模型的設計也是從粗到精,從抽象到具體的。比如,概念數據模型屬於高層的抽象模型,它可以由ER圖來表示,這里只是對實體以及實體之間的關系進行了說明。
物理數據模型
而低層的具體的物理數據模型,則需要結合具體的數據庫與數據結構來定義。
2、軟件體系結構
程序或計算系統的軟件體系結構是指系統的一個或多個結構,它包括軟件構件、構件的外部可見屬性以及它們之間的相互關系
注意:體系結構並非可運行的軟件
•體系結構和設計
設計是體系結構的一個實例
例:客戶機服務器體系結構,可對應Java EE或.NET設計框架
功能
體系結構並非可運行的軟件,使你能夠
- 對設計在滿足既定需求方面的有效性進行分析;
- 在設計變更相對容易的階段,考慮體系結構可能的選擇方案;
- 降低與軟件構建相關的風險
體系結構類型
•人工智能、通信、設備、金融、游戲、工業、法律、醫療、軍事、操作系統、運輸、實用程序以及許多其他類型
體系結構風格
•建築師使用體系結構風格作為描述手段,將不同風格(框架、磚瓦、鱈魚角式)的房子區分開來
•軟件體系結構風格就是施加在整個系統設計上的一種變換,目的是為系統的所有構件建立一個結構。例:Client/Server模式
體系結構設計
- 系統需要執行的函數功能組件集(比如數據庫有哪些表、程序有哪些類
- 組件之間通信、協同和合作的連接器(比如如何讓一個類從數據庫里獲取數據
- 組件集成構成系統的約束(比如集成之后不同層次的類能否隨意訪問)
- 整體特性的語義模型分析。我們經常會基於一些成熟的體系結構框架來搭建自己的體系結構。
風格和模式分類
1· 數據中心架構
含義:
以數據為中心的架構,在這個架構里,數據存儲是整個應用程序的中心,所有的客戶端軟件相互之間沒有交互,只能通過與數據存儲交互來實現信息的共享。如:數據庫系統;超文本系統;
2·數據流體系架構
分類
- 過濾器:過濾器通過管道相互連接,管道的輸入是前一個過濾器的輸出,管道的輸出是后一個過濾器的輸入,通過過濾器對數據的加工實現程序的功能。如:圖像處理;音視頻處理
- 批處理序列:過濾器嚴格按照預定的時間順序從前往后執行。如:程序編譯
3·調用和返回架構
含義:
調用和返回架構是類似於樹形的結構。整個程序從根模塊開始,通過調用其子模塊,而子模塊再去調用其下級模塊,並分別向上返回結果,來實現程序功能。如:“主程序/子程序”模式(這是我們學語言最早遇到的結構)。
4·層次架構
含義:
層次架構,將軟件從外到內,分為了很多層。如:操作系統。
5· 面向對象架構
含義:MVC架構
- 由模型(MODEL)、視圖(VIEW)和控制器(CONTROLLER)組成
- 模型用於管理數據對象,視圖用於界面表示,控制器用於響應視圖請求並更新模型與視圖。
- 系統組件封裝數據和處理該數據的操作。
- 組件之間的通信和協作通過消息傳遞實現 。
體系結構組織與細化
兩個基本問題
•控制結構
•在架構內部如何實現管理控制?是否有不同的控制架構存在?
•數據傳遞
•組件之間如何進行數據傳遞?數據流是否連續,或者傳遞給系統的數據對象是否零散?
3、接口設計(含界面設計)
接口設計其實包含內部接口的設計與外部接口的設計兩個方面。
•高效用戶界面設計有三條重要原則
-
允許用戶操作控制(用戶為中心)
-
減少用戶記憶負擔
-
保持界面一致
4、組件設計
•構件
系統中模塊化的、可部署的和可替換的部件,該部件封裝了實現並對外提供一組接口
•組件
組件(Component)是對數據和方法的簡單封裝
•分類
•面向過程的組件設計——函數與模塊的設計
•面向對象的組件設計——類與操作的設計
部署設計
•以部署環境創建開始,在整個生命周期階段中處於邏輯設計和技術需求階段