軟體設計

軟體設計

軟體設計是從軟體需求規格說明書出發,根據需求分析階段確定的功能設計軟體系統的整體結構、劃分功能模組、確定每個模組的實現算法以及編寫具體的代碼,形成軟體的具體設計方案。

軟體設計是把許多事物和問題抽象起來,並且抽象它們不同的層次和角度。將問題或事物分解並模組化使得解決問題變得容易,分解的越細模組數量也就越多,它的副作用就是使得設計者考慮更多的模組之間耦合度的情況。

基本介紹

  • 中文名:軟體設計
  • 外文名:software design
  • 要求人群程式設計師
  • 設計階段:結構設計,接口設計,過程設計等
  • 設計區域:模組 Module、數據 Data等
  • 特點:抽象,模組化等
設計階段,特徵,設計要素,設計原則,設計過程,指導方針,設計基礎,設計方法論,設計文檔,面向對象,發展方向,

設計階段

1、概要設計,主要包括:
1)結構設計
2)接口設計
3)全局數據結構設計
4)過程設計
2、詳細設計。

特徵

1、抽象
2、模組化
3、信息隱蔽
4、模組獨立性:
1)內聚性:偶然內聚、邏輯內聚、時間內聚、過程內聚、通信內聚、順序內聚、功能內聚。
2)耦合性:內容耦合、公共耦合、外部耦合、控制耦合、標記耦合、數據耦合、非直接耦合

設計要素

軟體設計包括軟體的結構設計,數據設計,接口設
計和過程設計。
軟體設計軟體設計
結構設計:定義軟體系統各主要部件之間的關係。
數據設計:將模型轉換成數據結構的定義。
接口設計:軟體內部,軟體和作業系統間以及軟體和人之間如何通信。
過程設計:系統結構部件轉換成軟體的過程描述

設計原則

1、設計對於分析模型應該是可跟蹤的:軟體的模組可能被映射到多個需求上。
2、設計結構應該儘可能的模擬實際問題。
3、設計應該表現出一致性。
4、不要把設計當成編寫代碼
5、在創建設計時就應該能夠評估質量。
6、評審設計以減少語義性的錯誤。
7、設計應該模組化,將軟體邏輯地劃分為元素或子系統,並包含數據體系結構、接口和構件的清晰表示。

設計過程

 軟體的設計是一個將需求轉變為軟體陳述(表達)的過程。這種陳述給了
一個對軟體的全局觀點。系統通過逐步求精使得設計陳述逐漸接近原始碼。這裡有兩個基本步驟,第一步是初步設計(Preliminary design) ,關注於如何將需求轉換成數據軟體框架。
軟體設計軟體設計
第二步是 詳細設計(Detail design),關注於將框架逐步求精細化為具體的數據結構軟體的算法表達。發生中的設計行為、數據、算法和程式設計都需要由現代程式所需的界面設計這一清晰的行為來結合起來。界面設計(Interface design) 建立程式布局和人機互動機制。貫穿設計過程的質量由一系列的正式技術評定(formal technical reviews)或設計排演(design walkthroughs)來評價。

指導方針

1、設計應該展現層次結構使得軟體各部分之間的控制更明智。
2、設計應當模組化;這就是說,軟體應在邏輯上分割為實現特定的功能和子功能的部分。
3、設計應當由清晰且可分離的數據和過程表達來構成。
4、設計應使得模組展現獨立的功能特性
5、設計應使得界面能降低模組之間及其與外部環境的連線複雜性。
6、設計應源自於軟體需求分析期間獲得的信息所定的可重複方法的使用。要擁有良好的設計特徵不是靠碰運氣,在設計過程中通過綜合運用基礎設計原理、系統方法論、徹底的評定回顧可以有助於完成良好的設計。軟體設計方法每天都在進化,作為已經經過測試和細化的方法,良好的設計應具有以下的四種特性,並在所有這些特性之間保持一致:
軟體設計軟體設計
1)將信息領域的表達轉換為軟體設計的表達的機制。
2)表示功能組件及其界面的符號
3)逐步求精和分割的試探。
4)質量評估的指導方針。
開發軟體的時候,不管採用何種設計方法設計者必須能夠熟練運用一套關於數據、算法和程式設計的基本原理
7、設計應該導出降低模組和外部環境間複雜連線的接口。

設計基礎

軟體設計方法論的這套基本原理已經經過了多年的進化,在軟體開發的生命周期中,軟體設計是在軟體描述提供的的基礎上,對軟體需求進行分析以形成軟體內部結構的描述說明的活動之一。耦合和內聚是兩個用來評估軟體設計質量的方法。每種概念的影響程度不盡相同,但它們都經歷了時間的洗禮。基於這些基本原理設計者可以採用更多更成熟的設計方法。這些基本原理有助於設計者回答以下的問題:
軟體設計軟體設計
1、將軟體分割成獨立的組件時會採用何種標準
2、怎樣將軟體的原則性表示詳細分割成函式或數據結構
3、有沒有定義一個軟體設計的技術質量的統一標準
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)首先並且有些人也堅信,是最重要的設計行為。數據結構的影響和程式上的複雜性導致數據設計對軟體質量有著深遠的影響。這種質量由以下的原理來實施:
1、適用於功能和行為分析的系統分析原理同樣應該適用於數據
2、所有的數據結構,以及各自所完成的操作都應該被確定。
3、創建數據詞典並用來詳細說明數據和程式的設計。
4、底層的數據設計決定應該延遲至設計過程的後期。
5、數據結構的陳述(具體說明)應該只被那些直接使用包含在此結構內的數據的模組所知道。
6、有用的數據結構和操作庫可以在適當的時候使用。
7、軟體設計和程式語言應該支持抽象數據類型的規範和實現。
體系設計(Architectural Design)的主要目標是開發模組化的程式
構並表達出模組間的控制相關性。另外,體系設計融合了程式結構與數據結構,以及使得數據得以在程式中流動的界面定義。這種方法鼓勵設計者關注系統的整體設計而不是系統中單獨的組件。選用不同的方法會採用不同的途徑來接近體系的原點,但所有這些方法都應該認識到具有軟體全局觀念的重要性。程式設計(Procedural Design)在數據、程式結構、和陳述詳細算法的說明都已使用類似英語的自然語言來呈現後,再確定程式設計。使用自然語言來陳述的原因是當開發小組的絕大多數成員使用自然語言來交流的話,那么小組外的一個新手在不經學習的情況下會更容易理解這些說明。這裡有個問題:程式設計必須毫無歧義的來詳細說明程式,但我們都知道不含糊的自然語言也就不自然了。
軟體設計軟體設計

設計文檔

在任何系統中,開發文檔都是有價值的東西。當下已經有許多不同的經過發展的文檔計畫可供您在創建系統時候進行選擇。軟體設計的輸出文檔包括架構設計文檔、詳細設計文檔、單元測試文檔和集成測試文。其中相當不錯的一種模型就是所謂的設計規範。第一部分展示了源自於系統說明和其他定義文檔的設計成果的總體範圍。第二部分展示的是涉及支持文檔的詳細說明。第三部分的內容又稱作設計描述,在初步設計階段完成。第四、五部分的內容將初步設計階段的內容發展至詳細設計階段。第六部分展示了確保以下兩條原則的交叉參考矩陣
軟體設計軟體設計
1、用軟體設計滿足所有的需求
2、指出實現特定需求的關鍵模組。
第七部分在開發測試程式步驟)的第一步對系統的功能性和正確性進行測試是必要的。如果在開發設計規範的同時已經並行開發了詳細的測試程式規範的話,本部分可以刪除。第八部分詳細說明了將系統打包傳送至用戶站點的考慮和要求。在文檔剩下的第九、十部分中包括了算法描述、選擇程式、列表數據流程圖偽代碼數據流圖表、以及所有在設計規範開發時所用到的相關信息都可以放在此處。

面向對象

面向對象的設計(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 圖表:
任務、對象、事件
啟動程式 Main Form OnStartup
輸入第一個數 EdtFirstNumber User types in
輸入第二個數 EdtSecondNumber User types in
求和 EdtResult OnClick
程式退出 BtnExit OnClick
正如您在上例中所見,這正確說明了要執行什麼、誰來執行、以及什麼時候來執行。

發展方向

軟體開發過程是隨著開發技術的演化而隨之改進的。從早期的瀑布式(Waterfall)的開發模型到後來出現的螺旋式的疊代(Spiral)開發,以後來開始興起的敏捷開發方法(Agile),他們展示出了在不同的時代軟體產業對於開發過程的不同的認識,以及對於不同類型項目的理解方法。
注意區分軟體開發過程和軟體過程改進之間的重要區別。諸如像ISO15504,ISO9000,CMM,CMMI這樣的名詞闡述的是一些軟體過程改進框架,他們提供了一系列的標準策略來指導軟體組織如何提升軟體開發過程的質量、軟體組織的能力,而不是給出具體的開發過程的定義。
“敏捷開發”(AgileDevelopment)是軟體工程的一個重要的發展。它強調軟體開發應當是能夠對未來可能出現的變化和不確定性作出全面反應的。
敏捷開發被認為是一種“輕量級”的方法。在輕量級方法中最負盛名的應該是“極限編程”(ExtremeProgramming),簡稱為XP)。而與輕量級方法相對應的是“重量級方法”的存在。重量級方法強調以開發過程為中心,而不是以人為中心。重量級方法的例子比如CMM、PSP、TSP。
面向側面的程式設計(AspectOrientedProgramming),簡稱(AOP)被認為是軟體工程的另外一個重要發展。這裡的方面指的是完成一個功能的對象和函式集合。在這一方面相關的內容有泛型編程(GenericProgramming)和模板。

相關詞條

熱門詞條

聯絡我們