經過需求分析階段的工作,系統必須做什麼已經清楚了,總體設計階段就是決定怎麼做的時候了。
總體設計的基本目的:
就是回答“概括的話,系統該如何??”這個問題。這個階段主要是:
1、劃分出組成系統的物理元素——程式、檔案、資料庫、人工過程和文檔等。
2、設計系統的結構,也就是要確定系統中每個程式是由哪些模組組成的,以及這些模組相互間的關係。
總體設計階段的工作步驟:
1、尋找實現系統的各種不同的解決方案,參照需求分析階段得到的資料流程圖來做。
2、分析員從這些供選擇的方案中選出若干個合理的方案進行分析,為每個方案都準備一份系統流程圖,列出組成系統的所有物理元素,進行成本\效益分析,並且制定這個方案的進度計劃。
3、分析員綜合分析比較這些合理的方案,從中選擇一個最佳方案向使用者和使用部門負責人推薦。
4、對最終確定的解決方案進行最佳化和改進,從而得到更合理的結構,進行必要的資料庫設計,確定測試要求並且制定測試計劃。
從上面的敘述中不難看出,在詳細設計之前先進行總體設計的必要性:可以站在全域的高度,花較少成本,從較抽象的層次上分析對比多種可能的實現方案和軟體結構,從中選擇最佳方案和最合理的軟體結構,從而用較低成本開發出較高品質的軟體系統。
總體設計時必修遵守原理:
1、模組化
模組的定義:模組是由邊界元素限定的相鄰程式元素的序列。模組是構成程式的基本構件。
模組化的理論基礎:把複雜的問題分解成許多容易解決的小問題,原來的問題也就容易解決了。
模組化好處:
(1)使軟體結構清晰,不僅容易設計也容易閱讀和理解。
(2)容易測試和調試,提高軟體的可靠性。
(3)提高軟體的可修改性。
(4)有助於軟體開發工程的組織管理。
2、抽象
抽象的定義:人類在認識複雜現象的過程中一個最強有力的思維工具就是抽象。人們在實踐中認識到,在現實世界中一定事物、狀態和過程之間從存在某些相似的方面(共性)。把這些相似的方面集中和概括起來,暫時忽略它們之間的差異,這就是抽象。或者說抽象就是考慮事物間被關注的特性而不考慮它們其他的細節。
抽象的理論基礎:由於人類思維能力的限制,如果每次面臨的因素太多,是不可能做出精確思維的。處理複雜系統的唯一有效方法是用層次的方法構造和分析它。軟體工程的每一步都是對軟體解法的抽象層次的一次精化。
3、逐步求精
逐步求精的定義:逐步求精是人類解決複雜問題時採用的基本用法,也是許多軟體工程技術的基礎。可以把逐步求精理解為:“為了能集中精力解決主要問題而盡量延遲對問題細節的考慮”。
逐步求精的理論基礎:“Miller法則”一個人在任何時候都只能把注意力集中在5到9個知識塊上。
逐步求精的好處:它能協助軟體工程師把精力集中在與當前開發階段最相關的那些方面上,而忽略那些對整體解決方案來說雖然必要的,然而目前還不需要的細節,這些細節將留到以後考慮。“Miller法則”是人類智力的基本局限,我們不可能戰勝自己的本性,只能接受這個事實,承認自身的局限性,並在這個前提下近我們最大的努力。
4、資訊隱藏和局部化
資訊隱藏原理是指:應該這樣設計模組,使得一個模組內包含的資訊對於不需要這些資訊的模組來說,是不能訪問的。
局部化的概念和資訊隱藏概念是密切相關的,所謂局部化是指把一些關係密切的軟體元素物理地放得彼此靠近。
如果在測試期間和以後的軟體維護期間需要修改軟體,那麼資訊隱藏原理作為模組化系統設計的標準就會帶來極大好處。它不會把影響擴散到別的模組。
5、模組獨立
模組獨立的概念是模組化,抽象、資訊隱藏和局部化概念的直接結果。模組獨立有兩個明顯的好處:第一,有效模組化的軟體比較容易開發出來,而且適於團隊進行分工開發。第二,獨立的模組比較容易測試和維護。
模組的獨立程度可以由兩個定性標準度量:內聚和耦合。耦合是指不同模組彼此間互相依賴的緊密程度;內聚是指在模組內部各個元素彼此結合的緊密程度。
在軟體設計中應該追求儘可能鬆散的系統。這樣的系統中可以研究、測試和維護任何個模組,不需要對系統的其他模組有很多瞭解。模組間的偶合程度強烈影響系統的可理解性、可測試性、可靠性和可維護性。
耦合的分類:
(1)資料耦合,如果兩個模組通過參數交換資訊,而且交換的資訊僅僅是資料,那麼這種耦合就是資料耦合。
(2)控制耦合,如果兩個模組通過參數交換資訊,交換的資訊有控制資訊,那麼這種耦合就是控制耦合。
(3)特徵耦合,如果被調用的模組需要使用作為參數傳遞進來的資料結構中的所有資料時,那麼把這個資料結構作為參數整體傳送是完全正確的。但是,當把整個資料結構作為參數傳遞而使用其中一部分資料元素時,就出現了特徵耦合。在這種情況下,被調用的模組可以使用的資料多於它確實需要的資料,這將導致對資料的訪問失去控制,從而給電腦犯錯誤提供機會。
(4)公用環境耦合,當兩個或多個模組通過公用資料環境相互作用時,他們之間的耦合稱為公用環境耦合。
(5)內容耦合,有下列情形之一,兩個模組就發生了內容耦合:
*一個模組訪問另一個模組的內部資料
*一個模組不通過正常入口而轉到另一個模組的內部
*一個模組有多個入口
在進行軟體結構設計時,應該採用下述設計原則:盡量使用資料耦合,少用控制耦合和特徵耦合,限制公用環境耦合的範圍,完全不用內用耦合。
內聚的分類:
低內聚
(1)偶然內聚:如果一個模組完成一組任務,這些任務彼此間即使有關係,關係也比較鬆散,就叫做偶然內聚。
(2)邏輯內聚:如果一個模組完成的任務在邏輯上屬於相同或相似的一類,則稱為邏輯內聚。
(3)時間內聚:如果一個模組包含的任務必修在同一段時間內執行,就叫時間內聚。
中內聚
(4)過程內聚:如果一個模組內的處理元素是相關的,而且必須以特定次序執行,則稱為過程內聚。
(5)通訊內聚:如果模組中所有元素都使用同一個輸入資料和產生一個輸出資料,則成為通訊內聚。
高內聚
(6)順序內聚:如果一個模組內的處理元素同一個功能密切相關,而且這些處理必須順序執行,則稱為順序內聚。
(7)功能內聚:如果模組內所有處理元素屬於一個整體,完成一個單一的功能,則稱為功能內聚。
事實上,沒有必要精確定義模組的內聚層級。重要的是設計時力爭做到高內聚,並且能夠辨認出低內聚的模組,有能力通過修改設計提高模組的內聚程度降低模組間的耦合程度,從而獲得較高的模組獨立性。
軟體結構設計的啟發學習法規則:
1、改進軟體結構提高模組獨立性。
2、模組規模應該適中。
3、深度,寬度,扇出和扇入都應適當。
深度表示軟體結構中控制的層數,它往往能夠粗略的標誌一個系統的大小和複雜程度。
寬度是軟體結構在同一層次上的模組總數的最大值。一般來說,寬度越大系統就越複雜。
扇出是指一個模組直接調用的模組的數目,經驗表明,一個設計的好的典型系統的平均扇出通常是3或4個,太多或太少都不好。
扇入是指一個模組被別的多少個模組直接調用。扇入越大越好。
4、模組的範圍應該在控制域之內
5、力爭降低模組介面的複雜程度
6、設計單入口單出口的模組
7、模組功能應該可以預測
如果一個模組可以當作一個黑盒子,也就是說,只要輸入相同的資料就能產生同樣的的輸出,這個模組的功能就是可以預測的。帶有內部“儲存空間”的模組的功能可能是不可預測的,因為它的輸出取決於內部儲存空間的狀態。由於內部儲存空間對於上級模組是不可見的,所以這樣的模組既不易理解又難於測試和維護。
以上的啟發學習法規則多數是經驗規律,對改進設計,提高軟體品質,往往有重要的參考價值;但是,他們既不是設計的目標也不是設計時應該普遍遵循的原理。
設計最佳化:
1、考慮設計最佳化問題時應該記住“一個不能工作的‘最佳設計’的價值是值得懷疑的”。
2、應該在設計的早期階段盡量對軟體結構進行精化。可以匯出不同的軟體結構,然後對他們進行評價和比較,力求得到“最好”的結果。這種最佳化的可能是把軟體結構設計和過程設計分開的真正優點之一。
3、結構簡單通常即表示設計風格優雅,又表明效率高。設計最佳化應該力求做到在有效模組化的前提下使用最少量的模組,以及在能夠滿足資訊要求的前提下使用最簡單資料結構。
4、最佳化時遵守一句格言:“先使它能工作,然後再使它快起來。”