結構化方法誕生于20世紀70年代,是為了應對當時日益復雜的軟件系統開發挑戰(如“軟件危機”)而提出的。它強調系統性、規范性、分解和抽象,目標是提高軟件開發的效率、質量和可維護性,降低復雜性。
核心思想:
- 自頂向下,逐步求精: 從系統最宏觀、最抽象的整體視圖開始,逐步分解成更小、更具體、更容易理解和實現的模塊或過程。
- 功能分解: 將復雜的系統視為一系列功能的集合。分析的核心是理解“系統做什么”,設計則是將這些功能分解、組織并分配到具體的模塊中。
- 數據與功能分離: 明確區分系統中的數據(是什么)和功能/過程(對數據做什么)。數據通常用數據模型(如ER圖)描述,功能用過程模型(如數據流圖)描述。
- 模塊化: 系統被分解成一組相對獨立、高內聚、低耦合的模塊。每個模塊負責一個明確定義的功能子集。
- 使用圖形化建模工具: 大量使用標準化的圖表(如數據流圖、結構圖、實體關系圖、狀態轉換圖等)來可視化地描述系統的不同方面(功能、數據、狀態),取代或補充大量的文字描述,提高溝通效率和清晰度。
- 形式化或半形式化的規范: 強調使用清晰、無歧義、相對標準的符號和規則來描述需求和設計。
- 關注邏輯模型與物理模型:
- 邏輯模型: 描述系統“做什么”,獨立于具體的技術實現(如硬件、軟件平臺、數據庫管理系統)。這是分析和需求規格說明階段的核心產出。
- 物理模型: 描述系統“如何實現”,即邏輯模型在特定技術環境下的具體實現方案。這是設計階段的核心產出。
結構化方法的核心階段與技術:
結構化方法通常貫穿整個系統開發生命周期(SDLC),尤其是在分析(SA - Structured Analysis)和設計(SD - Structured Design)階段最為突出。
-
結構化分析:
- 目標: 理解用戶需求,定義系統“做什么”,建立系統的邏輯模型。
- 主要技術與工具:
- 數據流圖: 描述數據在系統中的流動、處理、存儲。是SA的核心工具。包含:外部實體、過程、數據流、數據存儲。
- 數據字典: 定義DFD中出現的所有數據流、數據存儲和數據項(元素)的精確含義、組成、格式、取值范圍等。是系統數據的中央倉庫。
- 實體關系圖: 描述系統中的關鍵數據實體、實體屬性以及實體之間的關系。用于建立數據模型(邏輯數據庫設計的基礎)。
- 過程規格說明: 詳細描述DFD中最底層(不可再分)過程的處理邏輯。常用工具包括:結構化英語(偽碼)、判定表、判定樹。
- 狀態轉換圖: 對于具有明顯狀態變化的系統(如實時控制系統),描述系統狀態、引起狀態轉換的事件以及狀態轉換時執行的動作。
-
結構化設計:
- 目標: 將分析階段得到的邏輯模型轉化為具體的、可實現的物理模型,即系統“如何做”。重點是設計軟件結構。
- 主要技術與工具:
- 結構圖: SD的核心工具。描述程序的模塊層次結構、模塊間的調用關系以及模塊間傳遞的數據(參數)。
- 設計原則:
- 模塊化: 將大系統分解成小模塊。
- 耦合: 衡量模塊間相互依賴的程度。目標是低耦合(模塊間聯系盡可能少且簡單)。
- 內聚: 衡量一個模塊內部各元素(語句、數據)結合的緊密程度。目標是高內聚(模塊內元素共同完成一個單一、明確的功能)。
- 從DFD到結構圖的轉換: 有特定的策略(如變換分析、事務分析)將DFD映射為初步的結構圖。
- 數據設計: 基于ER圖,設計物理數據庫結構(表、字段、索引、關系)。
結構化方法的主要流派/代表:
- Yourdon/DeMarco 方法: 非常強調DFD和數據字典,是結構化分析最經典的代表。
- Gane & Sarson 方法: 另一種廣泛使用的結構化分析方法,DFD符號與Yourdon略有不同。
- Jackson 系統開發方法: 強調數據結構對程序結構的主導作用。
- 結構化分析與設計技術: 由Douglas Ross提出,使用更豐富的圖形符號集(活動圖、數據圖等)。
結構化方法的優點:
- 降低復雜性: 通過分解將大問題轉化為小問題,易于理解和處理。
- 提高清晰度與可理解性: 圖形化模型直觀、標準,便于不同角色(用戶、分析師、設計師、程序員)之間的溝通和驗證。
- 強調文檔化: 產生詳盡的、標準化的文檔,有利于知識傳遞、維護和審計。
- 支持自頂向下開發: 便于早期識別主要問題和架構。
- 設計原則明確: 耦合和內聚等原則為設計高質量軟件提供了具體指導。
- 適用于數據處理密集型系統: 在處理以數據流和轉換為主的系統(如傳統業務信息系統)方面非常有效。
結構化方法的局限性:
- 對需求變化的適應性較差: 相對剛性,需求變更可能引起文檔和設計的大量修改(瀑布模型的通病)。
- 數據和功能分離的割裂: 現實世界中的對象往往同時包含數據和操作數據的行為。結構化方法將兩者分離建模,有時不能很好地映射現實。
- 對用戶界面和交互密集型系統支持較弱: 早期結構化方法較少關注用戶體驗和人機交互設計。
- 可重用性支持有限: 主要關注特定系統的功能分解,對通用組件復用的支持不如面向對象方法。
- 可能產生“分析癱瘓”: 在大型復雜項目中,過度強調前期詳盡的文檔和建模可能導致項目進度緩慢。
- 與面向對象思維的差異: 現代軟件開發主流是面向對象,結構化方法的思維模式與之不同,學習和轉換有一定成本。
結構化方法與面向對象方法的對比:
特性 | 結構化方法 | 面向對象方法 |
---|---|---|
核心概念 | 功能、過程、數據流、模塊 | 對象、類、屬性、方法、繼承、多態 |
分解方式 | 功能分解 | 對象分解 |
數據與功能 | 分離 | 封裝在對象內部 |
關注點 | “做什么” (功能) | “誰做什么” (對象職責) |
建模工具 | DFD, ERD, 結構圖 | 用例圖, 類圖, 時序圖, 狀態圖等 |
適應性 | 對穩定需求較好,變更成本較高 | 對需求變化適應性更好 |
重用性 | 模塊級重用 | 類級、組件級、模式級重用 |
典型適用 | 數據處理系統,事務處理 | 交互復雜系統,GUI應用,分布式系統 |
總結:
結構化方法是軟件工程發展史上的重要里程碑。它提供了一套系統化、規范化的分析和設計框架,通過自頂向下分解、功能視角、數據和過程分離、圖形化建模以及強調模塊化設計原則,顯著提高了軟件開發的規范性和可控性。雖然在應對快速變化的需求和構建高度交互的系統方面不如面向對象方法靈活,但其核心思想(如分解、模塊化、低耦合高內聚)仍然是現代軟件設計的基石。理解結構化方法對于掌握軟件工程的基礎原理、閱讀遺留系統文檔以及在某些特定場景(如優化核心算法模塊、設計底層服務)下進行設計仍然具有重要價值。它是學習更現代方法(如面向對象、面向服務)的重要基礎。