數據流圖(DFD)畫法要求
一、數據流圖(DFD)
1.數據流圖的基本符號
數據流圖由四種基本符號組成,見圖5-4-1所示。
圖5-4-1 數據流圖的基本符號
例:圖5-4-2是一個簡單的數據流圖,它表示數據X從源S流出,經P1加工轉換成Y,接着經P2加工轉換為Z,在加工過程中從F中讀取數據。
圖5-4-2 數據流圖舉例
下面來詳細討論各基本符號的使用方法。
2.數據流
數據流由一組確定的數據組成。例如“發票”為一個數據流,它由品名、規格、單位、單價、數量等數據組成。數據流用帶有名字的具有箭頭的線段表示,名字稱為數據流名,表示流經的數據,箭頭表示流向。數據流可以從加工流向加工,也可以從加工流進、流出文件,還可以從源點流向加工或從加工流向終點。
對數據流的表示有以下約定:
對流進或流出文件的數據流不需標注名字,因為文件本身就足以說明數據流。而別的數據流則必須標出名字,名字應能反映數據流的含義。
數據流不允許同名。
兩個數據流在結構上相同是允許的,但必須體現人們對數據流的不同理解。例如圖5-4-3(a)中的合理領料單與領料單兩個數據流,它們的結構相同,但前者增加了合理性這一信息。
兩個加工之間可以有幾股不同的數據流,這是由於它們的用途不同,或它們之間沒有聯系,或它們的流動時間不同,如圖5-4-3(b)所示。
(a) (b) (c)
圖5-4-3 簡單數據流圖舉例
數據流圖描述的是數據流而不是控制流。如圖5-4-3 (c)中,“月末”只是為了激發加工“計算工資”,是一個控制流而不是數據流,所以應從圖中刪去。
3.加工處理
加工處理是對數據進行的操作,它把流入的數據流轉換為流出的數據流。每個加工處理都應取一個名字表示它的含義,並規定一個編號用來標識該加工在層次分解中的位置。名字中必須包含一個動詞,例如“計算”、“打印”等。
對數據加工轉換的方式有兩種:
改變數據的結構,例如將數組中各數據重新排序;
產生新的數據,例如對原來的數據總計、求平均等值。
4.文件
文件是存貯數據的工具。文件名應與它的內容一致,寫在開口長條內。從文件流入或流出數據流時,數據流方向是很重要的。如果是讀文件,則數據流的方向應從文件流出,寫文件時則相反;如果是又讀又寫,則數據流是雙向的。在修改文件時,雖然必須首先讀文件,但其本質是寫文件,因此數據流應流向文件,而不是雙向。
例如,在圖5-4-3 (a)中,檢查合理性加工時,只從庫存帳目文件中讀出庫存信息與領料單核對,所以數據流從文件流出,箭頭指向加工。
5.數據源或終點
數據源和終點表示數據的外部來源和去處。它通常是系統之外的人員或組織,不受系統控制。
為了避免在數據流圖上出現線條交叉,同一個源點、終點或文件均可在不同位置多次出現,這時要在源(終)點符號的右下方畫小斜線,或在文件符號左邊畫豎線,以示重復,如圖5-4-4所示。
圖5-4-4 重復的源點、終點或文件
由上圖可見,數據流圖可通過基本符號直觀地表示系統的數據流程、加工、存貯等過程。但它不能表達每個數據和加工的具體、詳細的含義,這些信息需要在“數據字典”和“加工說明”中表達。
6.DFD的畫法
一般遵循“由外向里”的原則,即先確定系統的邊界或范圍,再考慮系統的內部,先畫加工的輸入和輸出,再畫加工的內部。即:
(1)識別系統的輸入和輸出。
(2)從輸入端至輸出端畫數據流和加工,並同時加上文件。
(3)加工的分解“ 由外向里”進行分解。
(4)數據流的命名,名字要確切,能反映整體。
(5)各種符號布置要合理,分布均勻,盡量避免交叉線。
(6)先考慮穩定態,后考慮瞬間態。如系統啟動后在正常工作狀態,稍后再考慮系統的啟動和終止狀態。
對於不同的問題,數據流圖可以有不同的畫法。一般情況下,應該遵守“由外向里”的原則。即先確定系統的邊界或范圍,再考慮系統的內部,先畫加工的輸入和輸出,再畫加工內部。具體實行時可按下述步驟進行:
(1)識別系統的輸入和輸出,畫出頂層圖
即確定系統的邊界。在系統分析初期,系統的功能需求等還不很明確,為了防止遺漏,不妨先將范圍定得大一些。系統邊界確定后,那么越過邊界的數據流就是系統的輸入或輸出,將輸入與輸出用加工符號連接起來,並加上輸入數據來源和輸出數據去向就形成了頂層圖。
(2)畫系統內部的數據流、加工與文件,畫出一級細化圖
從系統輸入端到輸出端(也可反之),逐步用數據流和加工連接起來,當數據流的組成或值發生變化時,就在該處畫一個“加工”符號。
畫數據流圖時還應同時畫上文件,以反映各種數據的存貯處,並表明數據流是流入還是流出文件。
最后,再回過頭來檢查系統的邊界,補上遺漏但有用的輸入輸出數據流,刪去那些沒被系統使用的數據流。
(3)加工的進一步分解,畫出二級細化圖
同樣運用“由外向里”方式對每個加工進行分析,如果在該加工內部還有數據流,則可將該加工分成若干個子加工,並用一些數據流把子加工聯接起來,即可畫出二級細化圖。二級細化圖可在一級細化圖的基礎上畫出,也可單獨畫出該加工的二級細化圖,二級細化圖也稱為該加工的子圖。
(4)其它注意事項
一般應先給數據流命名,再根據輸入/輸出數據流名的含義為加工命名。名字含義要確切,要能反映相應的整體。若碰到難以命名的情況,則很可能是分解不恰當造成的。應考慮重新分解。
從左至右畫數據流圖。通常左側、右側分別是數據源和終點,中間是一系列加工和文件。正式的數據流圖應盡量避免線條交叉,必要時可用重復的數據源、終點和文件符號。此外,數據流圖中各種符號布置要合理,分布應均勻。
畫數據流圖是一項艱巨的工作,要做好重畫的思想准備,重畫是為了消除隱患,有必要不斷改進。
因為作為頂層加工處理的改變域是確定的,所以改變域的分解是嚴格的自頂向下分解的。由於目標系統目前還不存在,應此分解時開發人員還需憑經驗進行,這是一項創造性的勞動。同時,在建立目標系統數據流圖時,還應充分利用本章講過的各種方法和技術,例如:分解時盡量減少各加工之間的數據流;數據流圖中各個成分的命名要恰當;父圖與子圖間要注意平衡等等。
當畫出分層數據流圖,並為數據流圖中各個成分編寫詞典條目或加工說明后,就獲得了目標系統的初步邏輯模型。
二、畫分層數據流圖時應注意的問題
下面從四個方面討論畫分層數據流圖時應注意的問題。
1.合理編號
分層數據流圖的頂層稱為0層,稱它是第1層的父圖,而第1層既是0層圖的子圖,又是第2層圖的父圖,依此類推。由於父圖中有的加工可能就是功能單元,不能再分解,因此父圖擁有的子圖數少於或等於父圖中的加工個數。
為了便於管理,應按下列規則為數據流圖中的加工編號:
l 子圖中的編號為父圖號和子加工的編號組成。
l 子圖的父圖號就是父圖中相應加工的編號。
為簡單起見,約定第1層圖的父圖號為0,編號只寫加工編號1、2、3...,下面各層由父圖號1、1.1等加上子加工的編號1、2、3...組成。按上述規則,圖的編號即能反映出它所屬的層次以及它的父圖編號的信息,還能反映子加工的處理信息。例如1表示第1層圖的1號加工處理,1.1、1.2、1.3...表示父圖為1號加工的子加工,1.3.1、1.3.2、1.3.3...表示父圖號為1.3加工的子加工。
為了方便,對數據流圖中的每個加工,可以只標出局部號,但在加工說明中,必須使用完整的編號。例如圖5-4-5可表示第1層圖的1號加工的子圖,編號可以簡化成圖中的形式。

圖5-4-5 簡化子圖編號示例
2.注意子圖與父圖的平衡
子圖與父圖的數據流必須平衡,這是分層數據流的重要性質。這里的平衡指的是子圖的輸入、輸出數據流必須與父圖中對應加工的輸入、輸出數據流相同。但下列兩種情況是允許的,一是子圖的輸入/輸出流比父圖中相應加工的輸入/輸出流表達得更細。例如,在圖5-4-6中,若父圖的“訂貨單”數據流是由客戶、品種、帳號、數量四部分組成,則圖中的子圖和父圖是平衡的。在實際中,檢查該類情況的平衡,需借助於數據詞典進行。二是考慮平衡時,可以忽略枝節性的數據流。例如圖5-4-6,在4號加工的子圖中4.3號子加工中增加了一個輸出,表示出錯的數據流(由虛線所示),則子圖和父圖仍可看作是平衡的。
圖5-4-6 子圖和父圖的平衡圖片 子圖和父圖的平衡動畫
3.局部文件
圖5-4-7中的父圖和子圖是平衡的,但子圖中的文件W並沒在父圖中出現。這是由於對文件W的讀、寫完全局限在加工3.3之內,在父圖中各個加工之間的界面上不出現,該文件是子圖的局部文件或為臨時文件。
圖5-4-7 數據流圖中的局部文件
應當指出的是,如果一個臨時文件在某層數據流圖中的某些加工之間出現,則在該層數據流圖中就必須畫出這個文件。一旦文件被單獨畫出,那么也需畫出這個文件同其它成分之間的聯系。
4.分解的程度
對於規模較大的系統的分層數據流圖,如果一下子把加工直接分解成基本加工單元,一張圖上畫出過多的加工將使人難以理解,也增加了分解的復雜度。然而,如果每次分解產生的子加工太少,會使分解層次過多而增加作圖的工作量,閱讀也不方便。經驗表明,一般說來一個加工每次分解量最多不要超過七個為宜。同時,分解時應遵循以下原則:
l 分解應自然,概念上要合理、清晰。
l 上層可分解的快些(即分解成的子加工個數多些),這是因為上層是綜合性描述,對可讀性的影響小。而下層應分解得慢些。
l 在不影響可讀性的前提下,應適當地多分解成幾部分,以減少分解層數。
l 一般說來,當加工可用一頁紙明確地表述時,或加工只有單一輸入/輸出數據流時(出錯處理不包括在內),就應停止對該加工的分解。另外,對數據流圖中不再作分解的加工(即功能單元),必須作出詳細的加工說明,並且每個加工說明的編號必須與功能單元的編號一致。
三、數據流圖的修改
前面介紹了畫數據流圖的基本方法。對於一個大型系統來說,由於在系統分析初期人們對於問題理解的深度不夠,在數據流圖上也不可避免地會存在某些缺陷或錯誤。因此還需要進行修改,才能得到完善的數據流圖。這里介紹如何從正確性和可讀性方面對數據流圖進行改進。
1.正確性
數據流圖的正確性,可以從以下幾個方面來檢查:
(1)數據守恆
(2)文件使用
在數據流圖中,文件與加工之間數據流的方向應按規定認真標注,這樣也有利於對文件使用正確性的檢查。例如,在圖5-4-8中,因為文件1和文件2是子圖的局部文件,所以在子圖中應畫出對文件的全部引用。但子圖中文件2好象一個“滲井”,數據只流進不流出,顯然是一個錯誤。
圖5-4-8 局部文件使用錯誤
(3) 子、父圖平衡
造成子圖與父圖不平衡的一個常見原因是在增加或刪除一個加工時,忽視了對相應父圖或子圖的修改。在檢查數據流圖時應注意這一點。
(4) 加工與數據流的命名
加工和數據流的名字必須體現被命名對象的全部內容而不是一部分。對於加工的名字,應檢查它的含義與被加工的輸入/輸出數據流是否匹配。
一個加工的輸出數據流僅由它的輸入數據流確定,這個規則絕不能違背。數據不守恆的錯誤有兩種,一是漏掉某些輸入數據流,二是某些輸入數據流在加工內部沒有被使用。雖然有時后者並不一定是個錯誤,但也要認真考慮,對於確實無用的數據就應該刪去,以簡化加工之間的聯系。
在檢查數據流圖時,應注意消除控制流。
2.可讀性
數據流圖的可讀性,可以從以下幾個方面來提高:
(1)簡化加工之間的聯系
各加工之間的數據流越少,各加工的獨立性就越高。因此應當盡量減少加工之間數據流的數目,有必要時可采用后面要介紹的步驟對數據流圖重新分解。
(2)分解應當均勻
在同一張數據流圖上,應避免出現某些加工已是功能單元,而另一些加工卻還應繼續分解好幾層的情況出現。否則應考慮重新分解。
(3)命名應當恰當
理想的加工名由一個具體的動詞和一個具體的賓語(名詞)組成。數據流和文件的名字也應具體、明確。
3. 數據流圖重新分解的步驟
有時需要對作出的部分或全部數據流圖作重新分解,可按以下步驟進行:
(1)把需要重新分解的所有子圖連成一張;
(2)根據各部分之間聯系最少的原則,把圖划分成幾部分;
(3)重建父圖,即把第二步所得的每一部分畫成一個圓圈,各部分之間的聯系就是加工之間的界面;
(4)重建各張子圖,只需把第二步所得的圖,按各自的邊界剪開即可;
(5)為所有加工重新命名、編號。
例如,圖5-4-9中加工2和其它加工的聯系太復雜以致很難獨立理解,所以其結構不太合理。因為圖5-4-9的子圖是由不相連的兩部分組成的,所以將它們的父圖加工分成兩個更為合適。
圖5-4-9 結構不合理的數據流圖
