结构化分析

**結構化分析**（**Structured Analysis**，簡稱 **SA**）是軟體工程中的一種方法，結構化分析和結構化設計可以分析商業的需求，再轉換為規格檔案，最後再產生電腦軟體、硬體組態及相關的手冊及程式。

結構化分析及設計技術是系統分析的基礎，是由 1960 到 70 年代的系統分析技術發展而成。

## 目的

結構化分析在 1980 年代起開始廣為使用。結構化分析包括將系統概念轉換為用資料及控制的來表示，也就是轉換為資料流程圖。資料流程圖中的程式以泡泡來表示，因此也稱為「泡泡圖」。不過完整的資料流程圖中可能有許多的「泡泡」，使得很難去追蹤資料流動的情形。此時可以先定義外界需要系統回應的事件，每一個事件指定一個泡泡，當系統定義完成後，再將事件的泡泡和回應的程式的泡泡相連接。也可以將程式對應泡泡加以分組，組合成較高階的程式。資料字典用來描述資料和指令的流動，而用程式規格來描述交易或資料轉換的相關資訊。

許多著名的分析方式都和結構化分析（SA）及結構化設計（SD）有關，包括結構圖、資料流程圖及資料模型圖等。許多程式設計方法學也結合了結構化分析及結構化設計，包括結構化系統分析及設計方法（SSADM）及結構化分析及設計技術（SADT）等。

## 歷史

結構化分析是許多結構化方法中的一部份。「結構化分析是系統分析、設計及編程技術的組合，其目的是為了處理 1960 至 1980 年代軟體開發所遇到的問題，這段期間多半是用 COBOL 和 Fortran 語言開發，後來也使用 C 語言及 BASIC，也沒有將需求及設計檔案化的技術。隨著系統越來越大也更加複雜，資訊系統的發展也變得越來越困難。」為了方便管理大而複雜的系統，演進出下列的結構化方法。

自 1967 年起出現了許多的結構化方法：

* 結構化編程：由艾茲格・迪傑斯特拉在 1967 年提出－《GOTO 陳述有害論》。
* 逐步設計（Stepwise design）：由尼克勞斯・維爾特在 1971 年提出。
* 1972 年出現的 Nassi-Shneiderman 圖。
* 1974 年提出的 Warnier/Orr 圖－「Logical Construction of Programs」。
* 1974 年提出的 HIPO－IBM 的層次化輸入 - 處理 - 輸出圖。
* 結構化設計：由賴瑞・康斯坦丁、愛德華・尤登及韋恩・史帝文斯在 1975 年提出。
* 傑克遜結構化程式設計：由邁克爾・安東尼・傑克遜在 1975 年提出。
* 結構化分析：約在 1978 年由湯姆・狄馬克及尤登等人提出。
* 結構化分析及設計技術（SADT）：由道格拉斯・T・羅斯發展。
* 尤登結構化方法：由愛德華・尤登提出。
* 結構化分析及系統規格（Structured Analysis and System Specification）：由湯姆・狄馬克在 1979 年提出。
* 結構化系統分析及設計方法 (SSADM)：最早是由英國商務辦公室在 1983 年提出。
* 以結構化分析及設計技術為基礎的 IDEF0，由道格拉斯・T・羅斯在 1985 年提出。
* Hatley-Pirbhai 模型：在 Derek J. Hatley 及 Imtiaz A. Pirbhai 於 1988 年所著的《Strategies for Real-Time System Specification》中定義。
* 資訊工程：約在 1990 年代由克萊夫・芬克爾斯坦提出，後來因詹姆斯・馬丁的推廣而廣為人知。

依照 Hay 在 1999 年提出的定義：「資訊工程是 1970 年代提出許多結構化技術的延伸。先由結構化編程進展到結構化設計，然後進展到結構化系統分析。這些技術使用的圖也所不同：結構化設計中使用結構圖，而結構化系統分析使用資料流程圖。二者都可以幫助程式開發者及使用者的溝通，並且提昇程式分析者及設計者的紀律。1980 年起開始有工具可以自動繪製這類的圖面，並追蹤資料字典中的內容。」在電腦輔助設計及電腦輔助製造（CAD/CAM）名詞廣為使用之後，上述工具的使用也稱為電腦輔助軟體工程（CASE）。

## 結構化分析主題

### 抽象化機制

結構化分析一般會建立一個使用單一抽象化機制（single abstraction mechanism）的階層系統。結構化分析方法可以使用 IDEF（如圖），IDEF 是一個程式驅動的分析方法，是由目的及觀點開始進行。此方法一開始會先確認整體機能，再反覆地將機能分割為更小的機能，保留程式最佳化需要的輸入、輸出、控制及機制。IDEF 也被視為是一種功能分解的分析方法，著重在函式的內聚力及函式之間的耦合力。

功能分解的結構化方法單純描述程式，而不去劃定系統的行為，也不決定需要機能的系統架構。此方法只確認和活動有關的輸入及輸出。結構化分析受歡迎的一個原因是其本質適合描述一個高階的程式及概念，即使企業層次的程式也相當適合。不過對於商業常用的物件導向過程中，物件需要有哪些機能，IDEF 提供的資訊很有限。統一建模語言（UML）和 IDEF 相反，統一建模語言是介面驅動，並且有多重抽象化機制，適用於描述面向服務的架構（SOA）。

### 分析方法

結構化分析以資料在不同模組中流動的觀點來看待一個系統，系統的功能可以用轉換資料流的程式來表示。結構化分析善用了功能拆解（或由上到下設計）的資訊隱藏特性，因此可以關注在重要的細節，而不會被無關的細節干擾。當細節的層級提高時，資訊的廣度也隨之減少。結構化分析的結果是一組相關的圖，程式描述以及資料定義，這些資料描述一個程式為符合機能性需求所需要的資料以及需進行的轉換。

湯姆・狄馬克的分析方法包括以下幾項 :

* 系統關係圖
* 資料流程圖
* 程式規格
* 資料字典

資料流程圖是一個有向圖，弧線表示資料，節點（用圓圈或泡泡表示）表示轉換資料的程式。程式還可以再細分為更細的資料流程圖，描述程式中的子程式，一直到清楚說明及了解程式機能為止。機能元（functional primitive）是指一些不需再細分的程式，一般會用程式規格（或微規格）來說明。程式規格可以包括虛擬碼、流程圖或結構化英文。資料流程圖將系統的架構表示為一個由許多互連的程式形成的網路，而各程式是由機能元所組合而成。資料字典是一組資料流、資料元素、檔案及資料庫的定義。資料流程圖或其他資料字典可以參考資料字典中的內容。

### 系統關係圖

系統關係圖（System Context Diagram）是表示系統和外界環境之間的作用，系統關係圖可以表示一個系統和外界相關系統的輸入及輸出。

Kossiakoff 將系統關係圖定義為「系統關係圖將系統放在整個圖的中心，不描述其內部結構，周圍則是和其有關的系統、活動及環境，環境圖的目的是專注在哪些會影響系統需求及限制的外部因素及事件。」系統關係圖和資料流程圖有關，有助於了解系統和其他相關系統或事件之間的關係。

### 資料字典

資料字典或是資料庫字典是定義資料庫基本組織的檔案。資料字典包括資料庫中所有的檔案、每一個檔案的欄位個數、欄位名稱及型態。為了保護資料字典的內容不被破壞，大部份的資料庫管理系統不允許使用者更改資料字典。資料字典沒有資料庫中的資料內容，只有一些存取資料庫需要的資訊。資料庫管理系統一定要配合資料字典才能存取資料庫的內容。

### 資料流程圖

資料流程圖（DFD）是用圖像方式表示資訊系統中資料的流動方式。資料流程圖和系統流程圖不同，主要是表示資料在不同程式之間的流動，而不是程式的控制流程。資料流程圖是由賴瑞・康斯坦丁所提出，是以 Martin 及 Estrin 的「資料流圖」（data flow graph）為基礎。

一般在繪製資料流程圖前，會先繪製環境圖，描述系統和外界環境的互動作用。資料流程圖可以將系統分割為幾個較小的部份，並且強調各部份之間的資料流動。資料流程圖是結構化系統分析及設計方法（SSADM）的三個重要圖表中的一個。

### 結構圖

結構圖（SC）是一個將系統拆解為最小可管理程式單位的圖。在結構化編程中，結構圖可以將程式模組整理為樹狀結構，每一個模組以一個其中有模組名稱的方框表示，樹狀結構可以清楚表示各模組之間的關係。

結構化分析中常用結構圖表示程式的頂層架構。結構圖有助於程式設計者用個個擊破的方式處理軟體問題，也就是將一直將問題拆解為更小的問題，直到最後問題小到可以被人類理解為止。此程式稱為由上到下設計或是功能分解。結構圖的作用類似建築房屋中使用的藍圖。在設計階段，結構圖是客戶和不同軟體工程師溝通的方式。在代碼實現的階段，由結構圖可以得知系統的完整架構。

### 結構化設計

結構化設計（SD）是有關軟體模組的開發，及分析模組之間的「模組層次」（module hierarchy）。在結構化設計中，有以下二個主要的概念：

* 內聚力是指機能相關的程式組合成一模組的程度。
* 耦合力是指模組及模組之間資訊或參數流動的程度。

當耦合力調整到最佳情形時，會簡化模組之間的介面，也會簡化程式的複雜度。

Page-Jones 在 1980 年提出的研究中有三個主題：結構圖、模組規格及資料字典。「結構圖的目的是表示模組層次，模組規格可以用虛擬碼或程式設計語言來組成，資料字典類似結構化分析中的資料字典，在軟體開發生命週期中，在已經進行了分析及設計後，就可以自動產生資料型態的宣告，以及程式或副程式的模版。」

### 結構化查詢語言

結構化查詢語言（SQL）是一種查詢資料庫的標準語言。結構化查詢語言一開始是用在一個商用資料庫系統中，後來成為在迷你電腦及大型電腦運作的資料庫管理系統中，最受歡迎的資料庫查詢語言。結構化查詢語言也可在一般個人電腦中的資料庫管理系統中使用，並且可配合分散式資料庫使用，因此允許許多使用者在網路上同時存取同一個資料庫的內容。

## 相關條目

* 事件分割
* HIPO
* 傑克遜結構化程式設計
* 軟體系統方法論
* 尤登結構化方法
* 基於流編程

## 參考資料

## 延伸閱讀

* Larry Constantine and Ed Yourdon (1975). _Structured Design_. Yourdon Press.
* Tom DeMarco (1979). _Structured Analysis and System Specification_. Prentice Hall. ISBN 0-13-854380-1
* Keith Edwards (1993). _Real-Time Structured Methods, System Analysis_. Wiley. ISBN 0-471-93415-1
* Derek J. Hatley, Imtiaz A. Pirbhai (1988). _Strategies for Real Time System Specification_. John Wiley and Sons Ltd. ISBN 0-932633-04-8
* Stephen J. Mellor and Paul T. Ward (1986). _Structured Development for Real-Time Systems: Implementation Modeling Techniques: 003_. Prentice Hall. ISBN 0-13-854803-X
* Edward Yourdon (1989). _Modern Structured Analysis_, Yourdon Press Computing Series, 1989, ISBN 0-13-598624-9

## 外部連結

* Structured Analysis Wiki
* Three views of structured analysis CRaG Systems, 2004.