設計階段
1、概要設計,主要包括:
1)結構設計
2)接口設計
3)全局數據結構設計
4)過程設計
2、詳細設計。
特徵
1、抽象
2、模組化
3、信息隱蔽
4、模組獨立性:
1)內聚性:偶然內聚、邏輯內聚、時間內聚、過程內聚、通信內聚、順序內聚、功能內聚。
2)耦合性:內容耦合、公共耦合、外部耦合、控制耦合、標記耦合、數據耦合、非直接耦合
設計要素
計和過程設計。
接口設計:
軟體內部,軟體和
作業系統間以及軟體和人之間如何通信。
設計原則
1、設計對於分析
模型應該是可跟蹤的:
軟體的模組可能被映射到多個
需求上。
2、設計結構應該儘可能的模擬實際問題。
3、設計應該表現出一致性。
5、在創建設計時就應該能夠評估質量。
6、評審設計以減少語義性的錯誤。
設計過程
軟體的設計是一個將
需求轉變為軟體陳述(表達)的過程。這種陳述給了
一個對
軟體的全局
觀點。系統通過
逐步求精使得設計陳述逐漸接近
原始碼。這裡有兩個基本
步驟,第一步是初步設計(Preliminary design) ,關注於如何將
需求轉換成
數據和
軟體框架。
第二步是
詳細設計(Detail design),關注於將框架逐步求精細化為具體的
數據結構和
軟體的算法表達。發生中的設計行為、
數據、算法和
程式設計都需要由現代程式所需的
界面設計這一清晰的行為來結合起來。
界面設計(Interface design) 建立
程式布局和人機互動機制。貫穿設計過程的質量由一系列的正式
技術評定(formal technical reviews)或設計排演(design walkthroughs)來評價。
指導方針
1、設計應該展現層次結構使得
軟體各部分之間的控制更明智。
2、設計應當模組化;這就是說,
軟體應在邏輯上分割為實現特定的
功能和子功能的部分。
3、設計應當由清晰且可分離的
數據和過程表達來構成。
5、設計應使得界面能降低模組之間及其與外部環境的連線複雜性。
6、設計應源自於
軟體需求分析期間獲得的信息所定的可重複方法的使用。要擁有良好的設計特徵不是靠碰運氣,在設計過程中通過綜合運用基礎設計
原理、系統方法論、徹底的評定回顧可以有助於完成良好的設計。軟體設計方法每天都在進化,作為已經經過測試和細化的方法,良好的設計應具有以下的四種
特性,並在所有這些特性之間保持一致:
4)質量評估的指導方針。
7、設計應該導出降低模組和外部環境間複雜連線的接口。
設計基礎
軟體設計方法論的這套基本
原理已經經過了多年的進化,在
軟體開發的生命周期中,軟體設計是在軟體
描述提供的的基礎上,對
軟體需求進行分析以形成軟體內部結構的描述說明的活動之一。耦合和
內聚是兩個用來評估
軟體設計質量的方法。每種概念的影響程度不盡相同,但它們都經歷了時間的洗禮。基於這些基本
原理設計者可以採用更多更成熟的設計方法。這些基本
原理有助於設計者回答以下的問題:
M.A. Jackson 曾經說過:“對一個
計算機程式設計師來說,分辨讓程式運行和讓程式正確之間的差異是一個良好的開端。”為了“ 使
程式正確 ” ,基本設計
原理提供了必須的框架。
抽象(Abstraction)在最高層次上指的是使用待解決的問題領域內的術語
描述的解決
方案。相對較低層次的抽象則更多的面向
程式語言,最低層的抽象則是解決方案的可直接實現的方式
描述。
軟體設計的每一個
步驟都是對相應層次解決方案的抽象的
逐步求精。
求精(Refinement)又叫做
逐步求精指的是通過
程式細節連續細化來開發
程式體系的策略。分
步驟的對程式抽象進行分解直至成為編程
語言的過程同時造就了程式的層次結構。在這一點上要對細節多做考慮,這也展示了求精實際上是個苦心經營的過程。
模組化(Modularity)指的是
軟體可被分割為分別命名並可定址的組件(也叫做模組),將模組綜合起來又可以滿足問題的
需求的性質。" 軟體的模組化是允許智慧型化
管理程式的唯一屬性。" 換句話說,當您將一個複雜問題分解為一些小問題時會更容易解決。需要重點解釋的是即使一個系統必須象“單片機”一樣來實現,它也可以採用
模組化設計。
軟體體系(架構,Software Architecture)涉及到
程式的兩個重要
特性:1) 模組的
層次結構。2)
數據結構。這源自於
需求分析時將真實世界問題的含蓄定義與
軟體解決方案的要素關聯起來的分割過程。當問題的每個部分通過一個或多個
軟體要素得到解決後,與問題的
定義和解決相一致
軟體和
數據結構的進化就開始了。這個過程代表了
軟體的
需求分析和設計之間的位置。控制層級(Control Hierarchy)也稱作
程式結構,
描述程式組件的組織並意味著控制層級。它並不
描述軟體的程式方面,比如進程順序、決定的事件 / 命令、或工作循環。如下的層級圖表展示了模組之間的通信流,並顯示哪些模組是重複的。這個圖表
描述了一個能夠讀檔案,計算每個記錄的值並書寫報表來顯示記錄的信息和所完成的計算。
數據結構(Data structure)
描述了單個數據間的
邏輯關係。
數據結構規定了數據的組織、訪問方法、關聯程度、和信息的選擇處理。
數據結構的組織和複雜性只受限於設計者的靈活性。唯一的限制就是經典
數據結構的數量阻礙了更多的久經考驗的結構出現。
軟體程式(Software Procedure)著重於處理每個模組的細節並必須提供一個精確的處理規範,包括事件順序、準確的判定點、重複操作、甚至
數據結構。
軟體的
程式表現是分層的,處理方法應該包括其所有子模組的參考。
信息隱藏(Information Hiding)的法則建議 由設計決定所刻劃的模組
特性應該對其餘的模組不可見。換句話說,模組應被設計和指定為包含在模組內部且其他模組不可訪問的內容對其他模組來說是無需的。隱藏意味著有效的模組性能夠通過定義一套獨立的模組來實現,這些模組相互之間的通信僅僅包括實現
軟體功能的所必須的信息。將使用
信息隱藏作為設計
標準在測試或今後的維護期間需要修改系統時帶來了最大的好處。
設計方法論
設計過程中用以促成模組化設計的四個
區域:模組(Module)、
數據(Data)、體系(Architectural)和
程式(Procedural)設計。
模組設計(Modular design) 降低了複雜性、便於修改、且使得支持
系統不同部分的並行開發實現起來更容易。模組類型提供的操作
特性通過結合時間歷史、激活機制、和控制模式來表現。在
程式結構內部,模組可以被分類為:
1. 順序(sequential)模組,由套用
程式引用和執行,但不能從表觀上中斷。
2. 增量(incremental)模組,可被套用
程式先行中斷,而後再從中
斷點重新開始。
3. 並行(parallel)模組,在多處理器環境下可以與其他模組同時執行。單獨的模組更容易開發,因為
功能可以被劃分出來,而界面只是用來確保功能的獨立。
功能的獨立性可以使用兩個定性的
標準來衡量:凝聚性 (cohesion)-衡量模組的功能強度的相關性,和耦合性(coupling)-衡量模組間的相互依賴的相關性。
數據設計(Data design)首先並且有些人也堅信,是最重要的設計行為。
數據結構的影響和
程式上的複雜性導致數據設計對
軟體質量有著深遠的影響。這種
質量由以下的
原理來實施:
2、所有的
數據結構,以及各自所完成的操作都應該被確定。
5、
數據結構的陳述(具體說明)應該只被那些直接使用包含在此結構內的數據的模組所知道。
體系設計(Architectural Design)的主要目標是開發模組化的
程式結
構並表達出模組間的控制相關性。另外,體系設計融合了
程式結構與
數據結構,以及使得數據得以在程式中流動的界面定義。這種方法鼓勵設計者關注系統的整體設計而不是系統中單獨的組件。選用不同的方法會採用不同的途徑來接近體系的原點,但所有這些方法都應該認識到具有
軟體全局觀念的重要性。
程式設計(Procedural Design)在
數據、程式結構、和陳述詳細算法的說明都已使用類似英語的自然語言來呈現後,再確定程式設計。使用自然語言來陳述的原因是當開發小組的絕大多數成員使用自然語言來交流的話,那么小組外的一個新手在不經學習的情況下會更容易理解這些說明。這裡有個問題:
程式設計必須毫無歧義的來詳細說明程式,但我們都知道不含糊的自然語言也就不自然了。
設計文檔
在任何系統中,開發文檔都是有價值的東西。當下已經有許多不同的經過發展的
文檔計畫可供您在創建系統時候進行選擇。
軟體設計的輸出文檔包括
架構設計文檔、
詳細設計文檔、
單元測試文檔和
集成測試文。其中相當不錯的一種
模型就是所謂的設計規範。第一部分展示了源自於系統說明和其他定義文檔的設計成果的總體範圍。第二部分展示的是涉及支持文檔的詳細說明。第三部分的內容又稱作設計
描述,在初步設計階段完成。第四、五部分的內容將初步設計階段的內容發展至
詳細設計階段。第六部分展示了確保以下兩條原則的交叉參考
矩陣:
第七部分在開發
測試程式(
步驟)的第一步對系統的
功能性和正確性進行測試是必要的。如果在開發設計規範的同時已經並行開發了詳細的測試
程式規範的話,本部分可以刪除。第八部分詳細說明了將系統打包傳送至用戶站點的考慮和要求。在文檔剩下的第九、十部分中包括了算法
描述、選擇程式、列表
數據、
流程圖、
偽代碼、
數據流圖表、以及所有在設計規範開發時所用到的相關信息都可以放在此處。
面向對象
面向
對象的設計(OOD)通過模組化信息及其加工方法而不單單是加工方法來讓
數據對象和加工操作得以互相連線。這個過程依賴於三個極其重要的設計概念:抽象、
信息隱藏、和模組化。所有的設計方法都力爭展現這些
特性;但只有 OOD 的機制才能使設計者能夠無需增加複雜性或加以折衷就獲得所有三種特性。在 OOD 中,我們有 objects (對象),operations (操作),和 messages (
訊息)。Objects (對象),又稱作類,可以是人、機器、命令、檔案、
汽車、
房子,等等。operations (操作),包含了私有的
數據結構和用於變換數據結構的加工方法。messages (訊息) 用於激活調用操作控制和對象的
程式構造。這就是說對象的共享部分是其的接口而訊息在接口之間移動並指定希望使用對象的何種操作,但並不知道操作是怎樣具體實現的。對象在收到訊息之後決定如何來執行訊息。以下是面向對象的系統中的某些工具的使用方法:
1. 偽代碼 - 接近
計算機程式語言的
指令,但使用的是近似英語的語言而不是真正的程式語言以便於查看
程式邏輯。下面是一個加工檔案中的記錄的範例 :
Start (開始)
Initialize program (初始化
程式)
Read a record (讀一個記錄)
Process record (加工記錄)
Move record to print area (將記錄移至列印區)
Write a line (寫一行)
End job (結束任務)
Stop run. (停止運行)
2. 原型 - 在開發
軟體包的第一個版本或
模型,或者計算機硬體準備好作生產前測試時的
步驟。通常可以使用您所喜愛的 RAD 工具來創建。
3. TOE 圖表 - (Task 任務,Object 對象,Event 事件 圖表) 用來展示需要完成的任務或工作、執行工作的對象、以及完成此過程的事件或動作。請看下面將兩個數相加的 TOE 圖表:
任務、對象、事件
輸入第一個數 EdtFirstNumber User types in
輸入第二個數 EdtSecondNumber User types in
求和 EdtResult OnClick
正如您在上例中所見,這正確說明了要執行什麼、誰來執行、以及什麼時候來執行。
發展方向
軟體開發過程是隨著開發
技術的演化而隨之改進的。從早期的瀑布式(Waterfall)的開發
模型到後來出現的螺旋式的疊代(Spiral)開發,以後來開始興起的敏捷開發方法(Agile),他們展示出了在不同的時代
軟體產業對於開發過程的不同的認識,以及對於不同類型項目的理解方法。
注意區分軟體開發過程和
軟體過程改進之間的重要區別。諸如像ISO15504,ISO9000,CMM,CMMI這樣的名詞闡述的是一些
軟體過程改進框架,他們提供了一系列的
標準和
策略來指導軟體組織如何提升
軟體開發過程的質量、軟體組織的能力,而不是給出具體的開發過程的定義。
敏捷開發被認為是一種“輕量級”的方法。在
輕量級方法中最負盛名的應該是“
極限編程”(ExtremeProgramming),簡稱為XP)。而與輕量級方法相對應的是“重量級方法”的存在。重量級方法強調以開發過程為中心,而不是以人為中心。
重量級方法的例子比如CMM、PSP、TSP。
面向側面的
程式設計(AspectOrientedProgramming),簡稱(AOP)被認為是
軟體工程的另外一個重要發展。這裡的方面指的是完成一個
功能的對象和
函式的
集合。在這一方面相關的內容有
泛型編程(GenericProgramming)和模板。