軟件評測師筆記_軟件結構化設計方法20161018

結構化設計程序員

軟件設計是軟件生存週期的重要組成部分,主要包括體系結構設計、接口設計、數據設計和過程設計。算法

結構化設計(structured design,SD)方法是一種面向數據流的設計方法,它是以結構化分析階段所產生的文檔(包括數據流圖、數據字典和軟件需求說明書)爲基礎,自頂向下,逐步求精和模塊化的過程。結構化設計一般可分爲概要設計和詳細設計。概要設計的任務是肯定軟件系統的結構,進行模塊劃分,肯定每一個模塊的功能、接口,以及模塊間的調用關係。詳細設計的任務是爲每一個模塊設計實現的細節。數據結構

1)軟件設計的重要概念和基本原則ide

在具體結構化設計方法以前,先介紹與軟件設計有關的幾個重要概念和基本原則。模塊化

①模塊化函數

模塊是指執行某一特定任務的數據和可執行語句等程序元素的集合,一般是指可經過名字來訪問的過程、函數、子程序或宏調用等。工具

模塊化就是將一個待開發的軟件劃分紅若干個可完成某一子功能的模塊,每一個模塊可獨立地開發、測試,最後組裝成完整的程序。模塊化的依據是,若是一個問題由多個問題組合而成,那麼這個組合問題的複雜程度將大於分別考慮每一個問題時的複雜程度之和。測試

一個模塊有它的外部特徵和內部特徵。外部特徵包括模塊的接口和功能,內部特徵包括模塊的局部數據和程序代碼。調用一個模塊只需知道它的外部特徵,而沒必要了解其內部特徵。優化

模塊的這一特徵有助於實現Parnas提出的「信息隱蔽」原則。信息隱藏是提升軟件可維護性的重要措施,在分解模塊時,就應採起措施,將一些未來可能發生變化的因素隱含在某模塊內,使未來因修改形成的影響儘量地侷限在一個或少數幾個模塊中,對於提升軟件的可理解性、可修改性、可測試性和可移植性都有重要的做用。但Parnas只提供了重要的設計準則,而沒有規定具體的工做步驟。翻譯

至於如何定義模塊大小,Meyer定義了5條標準。

(1)模塊的可分解性:若是一種設計方法提供了將問題分解成子問題的系統化機制,它就能下降整個系統的複雜性,從而實現一種有效的模塊化解決方案。

(2)模塊的可組裝性:若是一種設計方法使現存的(可複用的)設計構件能被組裝成新系統,它就能提供一種不須要一切從頭開始的模塊化解決方案。

(3)模塊的可理解性:若是一個模塊能夠做爲一個獨立的單位(不用參考其餘模塊)被理解,那麼它就易於構造和修改。

(4)模塊的連續性:若是對系統需求的微小修改只致使對單個模塊,而不是整個系統的修改,則修改引發的反作用就會被最小化。

(5)模塊的保護性:若是模塊內部出現異常狀況,而且它的影響限制在模塊內部,則錯誤引發的反作用就會被最小化。

②內聚

內聚是指一個模塊內各個元素彼此結合的緊密程度,它是信息隱蔽和局部化概念的天然擴展。設計時應該力求高內聚,理想內聚的模塊應當剛好作一件事情。

內聚有以下的種類,它們之間的內聚度由弱到強排列。

(1)偶然內聚:若是一個模塊完成一組任務,這組任務彼此間即便有關係,其關係也是鬆散的,這個模塊屬於偶然內聚。

(2)邏輯內聚:這種模塊把幾種邏輯上相關的功能組合在一塊兒,每次被調用時,由傳送給的模塊參數來肯定該模塊應完成哪種功能。

(3)瞬時內聚:若是一個模塊所包含的任務必須在同一時間間隔內執行,這個模塊屬於瞬時內聚,例如初始化模塊。

(4)過程內聚:若是一個模塊的處理元素是相關的,並且必須按特定的次序執行,這個模塊屬於過程內聚。

(5)通訊內聚:若是一個模塊的全部功能都經過使用公用數據而發生關係,這個模塊屬於通訊內聚。

(6)順序內聚:若是一個模塊的處理元素是相關的,並且必須順序執行,一般一個處理元素的輸出數據做爲下一個處理元素的輸入數據,則稱爲順序內聚。

(7)功能內聚:若是一個模塊包括且僅包括爲完成某一具體任務所必須的全部成份,或者說模塊中全部成份結合起來是爲了完成一個具體的任務,那麼這個模塊是功能內聚的。

③耦合

耦合是對一個軟件結構內不一樣模塊之間互聯程度的度量。耦合強弱取決於模塊間接口的複雜程度,進入或訪問一個模塊的點,以及經過接口的數據。

模塊間的耦合程度強烈影響系統的可理解性、可修改性、可測試性和可靠性,在軟件設計中應該追求儘量鬆散耦合的系統。這樣的系統中模塊間聯繫簡單,發生在某一模塊的錯誤傳播到整個系統的可能性就很小,研究、測試或維護任何一個模塊不須要對系統的其餘模塊有不少了解。

耦合能夠分紅下列幾種,它們之間的耦合度由高到低排列。

(1)內容耦合:指兩個模塊之間出現了下列狀況之一。一個模塊訪問另外一模塊的內部數據;一個模塊不經過正常入口轉到另外一模塊的內部;兩個模塊有一部分程序代碼重疊;一個模塊有多個入口。軟件設計時應堅定禁止內容耦合,應設計成單入口、單出口的模塊,避免病態鏈接。

(2)公共耦合:多個模塊引用一全局數據區的模式稱爲公共耦合。例如,C語言中的外部數據類型、磁盤文件等都是全局數據區。

(3)外部耦合:當模塊與軟件之外的環境有關時就發生外部耦合。例如,輸入/輸出把一個模塊與特定的設備、格式、通訊協議耦合在一塊兒。

(4)控制耦合:若是一模塊明顯地把開關量、名字等信息送入另外一模塊,控制另外一模塊的功能,則稱爲控制耦合。

(5)標記耦合:若是兩個以上的模塊都須要其他某一數據結構子結構時,不使用全局變量的方式而是用記錄傳遞的方式,則稱爲標記耦合。

(6)數據耦合:若是兩個模塊藉助於參數表傳遞簡單數據,則稱爲數據耦合。

(7)非直接耦合:若是兩個模塊沒有直接關係,它們之間的聯繫徹底是經過主程序的控制和調用來實現的,則稱爲非直接耦合。

原則上講,模塊化設計老是但願模塊之間的耦合表現爲非直接耦合方式。可是,因爲問題所固有的複雜性,有時則要根據實際狀況全面權衡,選用其餘類型的耦合。

模塊的高內聚、低耦和原則稱爲模塊獨立原則。

④深度、寬度、扇出與扇入

深度表示軟件結構中控制的層數。若是層數過多,則應考慮是否有許多管理模塊過於簡單,可否適當合併。

寬度是軟件結構中同一個層次上的模塊總數的最大值。通常說來,寬度越大,系統越複雜。對寬度影響最大的因素是模塊的扇出。

一個模塊的扇出是指該模塊直接調用的下級模塊的個數。扇出大表示模塊的複雜度高,須要控制和協調過多的下級模塊;但扇出太小(例如老是1)也很差。扇出過大通常是由於缺少中間層次,應該適當增長中間層次的控制模塊。扇出過小時能夠把下級模塊進一步分解成若干個子功能模塊,或者合併到它的上級模塊中去。

一個模塊的扇入是指直接調用該模塊的上級模塊的個數。扇入大表示模塊的複用程度高。

設計良好的軟件結構一般頂層扇出比較大,中間扇出較少,底層模塊則有大扇入。

但咱們也應當注意,不該爲了單純追求深度、寬度、扇出與扇入的理想化而違背模塊獨立原則,分解或合併模塊必須符合問題結構。

⑤做用域和控制域

模塊的做用域是指受該模塊內一個斷定影響的全部模塊的集合。模塊的控制域是指該模塊自己,以及被該模塊直接或間接調用的全部模塊的集合。軟件設計時,模塊的做用域應在控制域以內,做用域最好是作出斷定的模塊自己,以及它的直屬下級模塊。

⑥功能的可預測性

功能可預測是指對相同的輸入數據能產生相同的輸出。軟件設計時應保證模塊的功能是能夠預測的。

2)概要設計

通過需求分析階段的工做,系統必須已經清楚了「作什麼」,概要設計的基本目的就是回答「歸納地說,系統應該如何實現?」這個問題。概要設計的重要任務就是設計軟件的結構,也就是要肯定系統是由哪些模塊組成的,以及這些模塊相互間的關係。

SD方法採用結構圖(Structure Chart)來描述程序的結構。構成程序結構圖的主要成分有模塊、調用和數據,結構圖中的模塊用矩形表示,在矩形框內可標上模塊的名字。模塊間若有箭頭或直線相連,代表它們之間有調用關係。SD方法有時也使用層次圖和HIPO圖(層次圖加輸入/處理/輸出圖)。

整個概要設計過程主要包括。

第1步:複查基本系統模型。複查的目的是確保系統的輸入數據和輸出數據符合實際。

第2步:複查並精化數據流圖。應該對需求分析階段獲得的數據流圖認真複查,而且在必要時進行精簡。不只要確保數據流圖給出了目標系統的正確的邏輯模型,並且應該使數據流圖中每一個處理都表明一個規模適中、相對獨立的子功能。

第3步:肯定數據流圖的信息流類型。數據流圖中從系統的輸入數據流到系統的輸出數據流的一連串連續變換造成了一條信息流。信息流大致可分爲兩種類型:變換流和事務流。

(1)變換流:信息沿着輸入通道進入系統,而後經過變換中心(也稱主加工)處理,再沿着輸出通道離開系統。具備這一特性的信息流稱爲變換流。具備變換流型的數據流圖可明顯地分紅輸入、變換(主加工)、輸出三大部分。

(2)事務流:信息沿着輸入通道到達一個事務中心,事務中心根據輸入信息(即事務)的類型在若干個動做序列(稱爲活動流)中選擇一個執行,這種信息流稱爲事務流。事務流有明顯的事務中心,各活動以事務中心爲起點呈輻射狀流出。

第4步:根據流類型分別實施變換分析或事務分析。變換分析是從變換流型的數據流圖導出程序結構圖。具體過程以下。

(1)肯定輸入流和輸出流的邊界,從而孤立出變換中心。

(2)完成第一級分解,設計模塊結構的頂層和第一層。

(3)完成第二級分解,也就是輸入控制模塊、變換控制模塊和輸出控制模塊的分解,設計中、下層模塊。

事務分析是從事務流型的數據流圖導出程序結構圖,具體過程以下。

(1)肯定事務中心和每條活動流的流特性。

(2)將事務流型數據流圖映射成高層的程序結構,分解出接收模塊、發送模塊(調度模塊),以及發送模塊所控制的下層全部的活動流模塊。

(3)進一步完成接受模塊和每個活動流模塊的分解。

第5步:根據軟件設計原則對獲得的軟件結構圖進一步優化。

3)詳細設計

概要設計已經肯定了每一個模塊的功能和接口,詳細設計的任務就是爲每一個模塊設計實現的細節。詳細設計階段的根本目標是肯定應該怎樣具體地實現所要求的系統,得出對目標系統的精確描述。

結構化程序設計(Structured Programming,SP)採用自頂向下逐步求精的設計方法和單入口、單出口的控制結構。在設計一個模塊的實現算法時先考慮總體後考慮局部,先抽象後具體,經過逐步細化,最後獲得詳細的實現算法。單入口、單出口的控制結構使程序的靜態結構和動態執行過程一致,具備良好的結構,加強了程序的可讀性。

 

應用於詳細設計的工具主要包括如下幾種。

(1)程序流程圖:程序流程圖又稱爲程序框圖,它是歷史最悠久的描述過程設計的方法,然而它也是用得最混亂的一種方法。程序流程圖的主要優勢是對控制流程的描繪很直觀,便於初學者掌握。但因爲程序流程圖中用箭頭表明控制流,常常誘使程序員不顧結構化程序設計的精神而隨意轉移控制。程序流程圖儘管有種種缺點,許多人建議中止使用它,但至今仍在普遍使用着。不過總的趨勢是愈來愈多的人再也不使用程序流程圖了。

(2)盒圖(N–S圖):盒圖是由Nassi和Shneiderman提出的一種符合結構化設計原則的圖形描述工具,它僅含五種基本的控制結構:順序結構、IF-THEN-ELSE型分支結構、CASE型多分支結構、DO-WHILE和DO-UNTIL型循環結構、子程序結構。盒圖具備如下特色。

功能域(即一個特定控制結構的做用域)明確,能夠從盒圖上一眼就看出來。

因爲沒有箭頭,不可能任意轉移控制。

容易肯定局部和全程數據的做用域。

容易表示嵌套關係,也能夠表示模塊的層次結構。

堅持使用盒圖做爲詳細設計的工具,可使程序員逐步養成用結構化的方式思考問題和解決問題的習慣。

(3)PAD圖:PAD圖是問題分析圖(Problem Analysis Diagram)的英文縮寫,它用二維樹型結構的圖表示程序的控制流,比較容易翻譯成機器代碼。PAD圖具備如下特色。

使用表示結構化控制結構的PAD符號所設計出來的程序必然是結構化程序。

PAD圖所描繪的程序結構十分清晰。

用PAD圖表現程序邏輯,易讀、易懂、易記。

容易將PAD圖轉換成高級語言源程序,這種轉換可用軟件工具自動完成。

PAD圖既可表示程序邏輯,也可用於描繪數據結構。

PAD圖的符號支持自頂向下、逐步求精方法的使用。

(4)PDL:PDL是程序設計語言(Program Design Language)的英文縮寫,也稱爲僞碼,是一種以文本方式表示數據和處理過程的設計工具。PDL是一種非形式化語言,它對控制結構的描述是肯定的,但控制結構內部的描述語法是不肯定的,它可根據不一樣的應用領域和不一樣的設計層次靈活選用其描述方式,甚至可用天然語言描述。與程序語言(Programming Language)不一樣,PDL程序是不可執行的,但它能夠經過轉換程序自動轉換成某種高級程序語言的源程序。

常見的詳細設計工具還包括斷定樹、斷定表等

相關文章
相關標籤/搜索