數據流圖(Data Flow Diagram):簡稱DFD,它從數據傳遞和加工角度,以圖形方式來表達系統的邏輯功能、數據在系統內部的邏輯流向和邏輯變換過程,是結構化系統分析方法的主要表達工具及用於表示軟件模型的一種圖示方法。
1、DFD
數據流圖是結構化分析方法中使用的工具,它以圖形的方式描繪數據在系統中流動和處理的過程,由於它只反映系統必須完成的邏輯功能,所以它是一種功能模型。在結構化開發方法中,數據流圖是需求分析階段產生的結果。它是描繪信息流和數據從輸入移動到輸出的過程中所經受的變換。
數據流圖從數據傳遞和加工的角度,以圖形的方式刻畫數據流從輸入到輸出的移動變換過程。
數據流程圖包括:
a.指明數據存在的數據符號,這些數據符號也可指明該數據所使用的媒體;
b.指明對數據執行的處理的處理符號,這些符號也可指明該處理所用到的機器功能;
c.指明幾個處理和(或)數據媒體之間的數據流的流線符號;
d.便於讀、寫數據流程圖的特殊符號。
在處理符號的前后都應是數據符號。數據流程圖以數據符號開始和結束(除9.4規定的特殊符號外)。
數據流圖有兩種典型結構,一是變換型結構,它所描述的工作可表示為輸入、主處理和輸出,呈線性狀態。另一種是事務型結構,這種數據流圖呈束狀,即一束數據流平行流入或流出,可能同時有幾個事務要求處理。
2、數據流
數據流是一組數據。在數據流圖中數據流用帶箭頭的線表示,在其線旁標注數據流名。在數據流圖中應該描繪所有可能的數據流向,而不應該描繪出現某個數據流的條件。
加工(處理):在數據流圖中加工用圓圈表示,在圓圈內寫上加工名。一個處理框可以代表一系列程序、單個程序或者程序的一個模塊。
3、組成元素

數據流圖中有以下幾種主要元素:
(1)→:數據流。數據流是數據在系統內傳播的路徑,因此由一組成分固定的數據組成。如訂票單由旅客姓名、年齡、單位等數據項組成。由於數據流是流動中的數據,所以必須有流向,除了與數據存儲之間的數據流不用命名外,數據流應該用名詞或名詞短語命名。
(2)□:數據源(終點)。代表系統之外的實體,可以是人、物或其他軟件系統。
(3)○:對數據的加工(處理)。加工是對數據進行處理的單元,它接收一定的數據輸入,對其進行處理,並產生輸出。
(4)〓:數據存儲。表示信息的靜態存儲,可以代表文件、文件的一部分、數據庫的元素等。
4、分層DFD

根據層級數據流圖分為頂層數據流圖、中層數據流圖和底層數據流圖。除頂層數據流圖外,其他數據流圖從零開始編號。
(1)頂層數據流圖:只含有一個加工表示整個系統;輸出數據流和輸入數據流為系統的輸入數據和輸出數據,表明系統的范圍,以及與外部環境的數據交換關系。
(2)中層數據流圖:是對父層數據流圖中某個加工進行細化,而它的某個加工也可以再次細化,形成子圖;中間層次的多少,一般視系統的復雜程度而定。
(3)底層數據流圖:是指其加工不能再分解的數據流圖,其加工稱為“原子加工”。
5、原則

在單張數據流圖時,必須注意以下原則:
(1)一個加工的輸出數據流不應與輸入數據流同名,即使它們的組成成分相同。
(2)保持數據守恆。也就是說,一個加工所有輸出數據流中的數據必須能從該加工的輸入數據流中直接獲得,或者說是通過該加工能產生的數據。
(3)每個加工必須既有輸入數據流,又有輸出數據流。
(4)所有的數據流必須以一個外部實體開始,並以一個外部實體結束。
(5)外部實體之間不應該存在數據流,因為數據流的起點和終點中必須有一個是加工 (處理)。
6、DFD畫法
(1)確定系統的輸入輸出
由於系統究竟包括哪些功能可能一時難於弄清楚,可使范圍盡量大一些,把可能有的內容全部都包括進去。此時,應該向用戶了解“系統從外界接受什么數據”、“系統向外界送出什么數據”等信息,然后,根據用戶的答復畫出數據流圖的外圍。
(2)由外向里畫系統的頂層數據流圖
首先,將系統的輸入數據和輸出數據用一連串的加工連接起來。在數據流的值發生變化的地方就是一個加工。接着,給各個加工命名。然后,給加工之間的數據命名。最后,給文件命名。
(3)自頂向下逐層分解,繪出分層數據流圖
對於大型的系統,為了控制復雜性,便於理解,需要采用自頂向下逐層分解的方法進行,即用分層的方法將一個數據流圖分解成幾個數據流圖來分別表示。
7、舉例說明

(1)首先畫系統的輸入輸出,即先畫頂層數據流圖。頂層流圖只包含一個加工,用以表示被開發的系統,然后考慮該系統有哪些輸入數據、輸出數據流。頂層圖的作用在於表明被開發系統的范圍以及它和周圍環境的數據交換關系。下圖為飛機機票預訂系統的頂層圖。
(2)畫系統內部,即畫下層數據流圖。不再分解的加工稱為基本加工。一般將層號從0開始編號,采用自頂向下,由外向內的原則。畫0層數據流圖時,分解頂層流圖的系統為若干子系統,決定每個子系統間的數據接口和活動關系。例如,在上面的機票預訂系統按功能可分成兩部分,一部分為旅行社預訂機票,另一部分為旅客取票,兩部分通過機票文件的數據存儲聯系起來,0層數據流圖如圖3-4。
(3)注意事項。
①命名。不論數據流、數據存儲還是加工,合適的命名使人們易於理解其含義。
②畫數據流而不是控制流。數據流反映系統“做什么”,不反映“如何做”,因此箭頭上的數據流名稱只能是名詞或名詞短語,整個圖中不反映加工的執行順序。
③一般不畫物質流。數據流反映能用計算機處理的數據,並不是實物,因此對目標系統的數據流圖一般不要畫物質流。
④每個加工至少有一個輸入數據流和一個輸出數據流,反映出此加工數據的來源與加工的結果。
⑤編號。如果一張數據流圖中的某個加工分解成另一張數據流圖時,則上層圖為父圖,直接下層圖為子圖。子圖及其所有的加工都應編號。
⑥父圖與子圖的平衡。子圖的輸入輸出數據流同父圖相應加工的輸入輸出數據流必須一致,此即父圖與子圖的平衡。
在分層DFD中,需要保持父圖與子圖的平衡。即父圖中某加工的輸入輸出數據流必須與其子圖的輸入輸出數據流在數量和名字上相同,或者父圖的一個輸入(或輸出)數據流對應於子圖中幾個輸入(或輸出)數據流,而子圖中組成這些數據流的數據項全體正好是父圖中的這一個數據流。
⑦局部數據存儲。當某層數據流圖中的數據存儲不是父圖中相應加工的外部接口,而只是本圖中某些加工之間的數據接口,則稱這些數據存儲為局部數據存儲。
⑧提高數據流圖的易懂性。注意合理分解,要把一個加工分解成幾個功能相對獨立的子加工,這樣可以減少加工之間輸入、輸出數據流的數目,增加數據流圖的可理解性。
