彭立
摘 要:數(shù)據(jù)流圖是軟件工程實(shí)踐中一種非常重要的建模工具。因?yàn)槿狈ψ銐虻闹匾暎又疀]有全面掌握數(shù)據(jù)流圖的畫法,學(xué)生對(duì)該知識(shí)點(diǎn)的掌握情況往往不盡如人意。本文對(duì)數(shù)據(jù)流圖的教學(xué)進(jìn)行了探討,強(qiáng)調(diào)了數(shù)據(jù)流圖對(duì)整個(gè)項(xiàng)目開發(fā)的重要性,闡明了數(shù)據(jù)流圖中各種元素的含義以及繪圖的原則。
關(guān)鍵詞:軟件工程;數(shù)據(jù)流圖;教學(xué);繪圖原則
一、引言
軟件工程是人們?yōu)榱藨?yīng)對(duì)軟件危機(jī)而提出并研究的一門學(xué)科,對(duì)于大型軟件的開發(fā)和維護(hù),它具有極其重要的指導(dǎo)作用,因而一直以來都是高校計(jì)算機(jī)專業(yè)的必修課。軟件工程提出了軟件生命周期這個(gè)概念,而需求分析是軟件生命周期中最為重要的一個(gè)階段,因?yàn)檫@個(gè)階段工作的好壞決定了開發(fā)出的系統(tǒng)是否滿足用戶的要求。在該階段,分析員需要建立系統(tǒng)的邏輯模型,其中包括系統(tǒng)的功能模型。無論是采用結(jié)構(gòu)化分析方法還是面向?qū)ο蠓治龇椒ǎ瑪?shù)據(jù)流圖都是功能建模的最好工具,原因有二:一方面,數(shù)據(jù)流圖中的符號(hào)少而簡單,且易于理解和掌握,對(duì)于用戶而言也是如此;另一方面,數(shù)據(jù)流圖描繪了數(shù)據(jù)從輸入到輸出的過程中所經(jīng)歷的變換,使系統(tǒng)的功能可從一個(gè)比較高的層面被展現(xiàn)出來,從而便于分析員和用戶之間的交流。數(shù)據(jù)流圖對(duì)需求分析的重要性決定了它是軟件工程教學(xué)中的一項(xiàng)重要內(nèi)容,教師往往會(huì)花大量的時(shí)間對(duì)該知識(shí)點(diǎn)進(jìn)行講解。盡管如此,筆者從作業(yè)、課程設(shè)計(jì)和畢業(yè)設(shè)計(jì)等方面發(fā)現(xiàn)許多學(xué)生對(duì)該知識(shí)點(diǎn)的掌握情況并不理想。究其原因主要有兩點(diǎn):一是沒有真正意識(shí)到數(shù)據(jù)流圖對(duì)整個(gè)項(xiàng)目開發(fā)的重要性;二是沒有全面掌握數(shù)據(jù)流圖的畫法。本文從這兩方面原因入手,就如何抓好數(shù)據(jù)流圖的教學(xué)進(jìn)行了探討。
二、數(shù)據(jù)流圖對(duì)整個(gè)項(xiàng)目開發(fā)的重要性
因?yàn)閿?shù)據(jù)流圖只是在一個(gè)比較抽象的層面對(duì)軟件系統(tǒng)的功能進(jìn)行描述,學(xué)生很難認(rèn)識(shí)到它對(duì)整個(gè)項(xiàng)目開發(fā)的重要性,他們往往覺得繪制數(shù)據(jù)流圖只是做做樣子而已,流圖的質(zhì)量無關(guān)緊要。為了糾正學(xué)生的錯(cuò)誤認(rèn)識(shí),教師在教學(xué)中應(yīng)跟學(xué)生講清楚并強(qiáng)調(diào)以下事實(shí)。
數(shù)據(jù)流圖的重要性主要體現(xiàn)在需求分析階段,在該階段,數(shù)據(jù)流圖被用于建立系統(tǒng)的完整邏輯模型,它明確了系統(tǒng)的邊界以及數(shù)據(jù)在系統(tǒng)內(nèi)部流動(dòng)及變換的邏輯過程。通過繪制分層數(shù)據(jù)流圖,系統(tǒng)的所有功能以一種由抽象到具體的方式被展現(xiàn)出來。數(shù)據(jù)流圖是分析員和用戶之間交流的工具。通過數(shù)據(jù)流圖,分析員表達(dá)了他們對(duì)用戶需求的理解,用戶能判斷分析員是否真正理解了他們的需求。數(shù)據(jù)流圖是需求規(guī)格說明書的重要組成部分,在描述業(yè)務(wù)流程較為復(fù)雜的功能項(xiàng)時(shí),它具有文字說明所無法比擬的優(yōu)勢,而需求規(guī)格說明書是系統(tǒng)設(shè)計(jì)和測試的主要依據(jù)。
除了在需求分析階段,數(shù)據(jù)流圖在軟件生命周期的其它階段也能發(fā)揮作用??尚行匝芯渴且粋€(gè)簡化和壓縮了的分析和設(shè)計(jì)過程,在該階段,數(shù)據(jù)流圖能被用于建立系統(tǒng)的高層邏輯模型。在總體設(shè)計(jì)階段,基于自動(dòng)化邊界劃分,數(shù)據(jù)流圖能幫助設(shè)計(jì)人員確定系統(tǒng)的物理實(shí)現(xiàn)方案,此外,若采用結(jié)構(gòu)化設(shè)計(jì)方法,從數(shù)據(jù)流圖能直接導(dǎo)出系統(tǒng)的體系結(jié)構(gòu)。在系統(tǒng)測試中,數(shù)據(jù)流圖能指導(dǎo)測試人員設(shè)計(jì)測試用例。
三、數(shù)據(jù)流圖的畫法
1.數(shù)據(jù)流圖中的元素
在講授數(shù)據(jù)流圖的畫法之前,首先要讓學(xué)生弄清楚圖中各種元素的含義。流圖中的元素有5種:源點(diǎn)、終點(diǎn)、數(shù)據(jù)流、加工、數(shù)據(jù)存儲(chǔ)。
(1)源點(diǎn)和終點(diǎn)。源點(diǎn)和終點(diǎn)是與系統(tǒng)存在數(shù)據(jù)交換的外部實(shí)體,它們可以是人,也可以是其它系統(tǒng)。其中,源點(diǎn)為系統(tǒng)提供輸入,終點(diǎn)接收系統(tǒng)的輸出。
(2)數(shù)據(jù)流。數(shù)據(jù)流代表了流圖中不同元素之間傳遞的數(shù)據(jù),它具有一定的數(shù)據(jù)結(jié)構(gòu),更具體地說,它是由若干個(gè)數(shù)據(jù)項(xiàng)按一定的方式(例如順序、選擇和循環(huán)或這三種方式的組合)組織而成。
(3)加工。將接收到的輸入流變換成輸出流,這種變換主要體現(xiàn)在以下幾個(gè)方面:
*數(shù)據(jù)的轉(zhuǎn)移。例如將數(shù)據(jù)從一個(gè)文件取出來,存入另一個(gè)文件。
*執(zhí)行計(jì)算。例如根據(jù)所采購的商品的數(shù)量和單價(jià)計(jì)算總價(jià)。
*做出判斷。例如根據(jù)用戶名和密碼判斷當(dāng)前登陸的用戶是否合法。
*基于內(nèi)容和業(yè)務(wù)規(guī)則劃分?jǐn)?shù)據(jù)流。例如將某個(gè)訂單劃分為可供貨的訂單或不可供貨的訂單。
*過濾或匯總數(shù)據(jù)記錄以產(chǎn)生新的數(shù)據(jù)流。例如過濾掉班級(jí)學(xué)生記錄中女生的記錄,只保留男生的記錄;或者將不同班級(jí)的學(xué)生記錄組合在一起構(gòu)成全年級(jí)的學(xué)生記錄。
(4)數(shù)據(jù)存儲(chǔ)。數(shù)據(jù)存儲(chǔ)是為加工存放數(shù)據(jù)的地方。例如文件和表都可看成是數(shù)據(jù)存儲(chǔ)。加工可對(duì)數(shù)據(jù)存儲(chǔ)進(jìn)行讀寫刪改操作。數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)流的不同之處在于,前者存放的是靜態(tài)數(shù)據(jù),而后者中的數(shù)據(jù)是動(dòng)態(tài)數(shù)據(jù)。
2.繪制數(shù)據(jù)流圖的原則
為了繪制有效的數(shù)據(jù)流圖,必須掌握繪圖的原則。在軟考中,有關(guān)數(shù)據(jù)流圖的試題很多都涉及到繪圖原則,因此在教學(xué)中,教師應(yīng)通過案例教學(xué)法跟學(xué)生講清楚每一條原則。通過查找資料,筆者總結(jié)了一套完整的繪圖原則,現(xiàn)分兩部分說明如下。
(1)總的原則
①為流圖中的每一個(gè)元素采用合適的命名。數(shù)據(jù)流或數(shù)據(jù)存儲(chǔ)的名字應(yīng)反映其全部內(nèi)容,而不僅僅是它的某些成分,一般采用名詞或名詞短語。加工的名字應(yīng)反映它全部的功能,而不僅僅是它的部分功能,最好是由一個(gè)及物動(dòng)詞加上一個(gè)賓語組成。絕不要用“如果,則”這樣的聲明作為加工的名字。源點(diǎn)和終點(diǎn)的名字可采用它們?cè)趩栴}域中習(xí)慣使用的名字。
②流圖中每個(gè)元素都必須有名字,與數(shù)據(jù)存儲(chǔ)相連的數(shù)據(jù)流除外。
③加工的輸入數(shù)據(jù)流和輸出數(shù)據(jù)流不能同名,即使它們有相同的結(jié)構(gòu)。
④每一個(gè)加工至少有一個(gè)輸入數(shù)據(jù)流和一個(gè)輸出數(shù)據(jù)流。
⑤所有的數(shù)據(jù)流必須以一個(gè)加工開始或者結(jié)束。
根據(jù)以上原則,可發(fā)現(xiàn)圖1中有5處錯(cuò)誤:數(shù)據(jù)流X不應(yīng)出現(xiàn)在流圖中;數(shù)據(jù)流H不應(yīng)出現(xiàn)在流圖中;加工2的的輸入數(shù)據(jù)流和輸出數(shù)據(jù)流同名,都為Z;加工4只有輸入數(shù)據(jù)流;加工5只有輸出數(shù)據(jù)流。
■
圖1 數(shù)據(jù)流圖繪圖原則例1
⑥流圖中不可夾帶控制流。這條原則指出數(shù)據(jù)流圖不能和程序流程圖混為一談。數(shù)據(jù)流圖中的加工代表的都是對(duì)數(shù)據(jù)的處理,數(shù)據(jù)流的方向反映的是數(shù)據(jù)流動(dòng)的方向,而不是加工執(zhí)行的順序。程序流程圖中所包含的步驟既可以是對(duì)數(shù)據(jù)的處理,也可以是控制轉(zhuǎn)移,圖中的箭頭線指明了步驟執(zhí)行的順序。圖2中的兩張流圖違背了該原則。(a)中的“取下一張卡片”并不代表數(shù)據(jù)流動(dòng),而是表明“檢查卡片合理性”結(jié)束后,應(yīng)由“操作員”取出下一張卡片,所以它是控制流。類似地,(b)中的“每月第一天”也不代表數(shù)據(jù)流動(dòng),它只是“計(jì)算工資”的激發(fā)條件。
■
圖2 數(shù)據(jù)流圖繪圖原則例2
⑦為了避免流圖中出現(xiàn)線條交叉,同一個(gè)源點(diǎn)、終點(diǎn)或數(shù)據(jù)存儲(chǔ)均可在不同位置多次出現(xiàn),對(duì)于相同的源點(diǎn)或終點(diǎn),要在其符號(hào)的右下方畫小斜線,對(duì)于相同的數(shù)據(jù)存儲(chǔ),要在其符號(hào)左邊畫豎線。
⑧若某個(gè)數(shù)據(jù)存儲(chǔ)只被一個(gè)加工訪問,它應(yīng)隱含在該加工內(nèi)部,而不應(yīng)出現(xiàn)在流圖中。
⑨保持?jǐn)?shù)據(jù)守恒。一個(gè)加工的輸出流中的數(shù)據(jù)項(xiàng)要么來自該加工的輸入流,要么是該加工所產(chǎn)生的數(shù)據(jù)。例如:某個(gè)加工有兩個(gè)輸入流“學(xué)生信息”和“教材”,其輸出流為“訂書單”,其中,學(xué)生信息=學(xué)號(hào)+姓名,教材=教材ISBN+教材價(jià)格,訂書單=教材ISBN+教材價(jià)格+教材數(shù)量;若該加工能根據(jù)“學(xué)生信息”計(jì)算出“教材數(shù)量”,則對(duì)其而言數(shù)據(jù)是守恒的。
⑩自頂向下逐層分解,繪出分層數(shù)據(jù)流圖。對(duì)于一個(gè)大型的軟件系統(tǒng),若在一張流圖中畫出其所有的數(shù)據(jù)流和加工,則該圖將極其龐大復(fù)雜且難以理解。而繪制分層數(shù)據(jù)流圖是控制畫圖復(fù)雜性的最好方法。一套分層數(shù)據(jù)流圖可分為頂層、中間層和底層三個(gè)層次。頂層中的流圖只有一張,它明確了系統(tǒng)的邊界。該圖中只有一個(gè)加工,它代表整個(gè)系統(tǒng),它的輸入流代表了系統(tǒng)的輸入數(shù)據(jù),它的輸出流代表了系統(tǒng)的輸出數(shù)據(jù)。底層中的每一張流圖由一些無需分解的加工組成,這些加工都已足夠簡單,稱為基本加工。中間層位于底層和頂層之間。中間層的每一張流圖是對(duì)其上層父圖中某個(gè)加工的細(xì)化,它包含的每一加工可能還會(huì)繼續(xù)分解,從而形成子圖。
(2)繪制分層數(shù)據(jù)流圖的原則
①保持父圖與子圖的平衡。對(duì)于父圖中任意一個(gè)加工,其輸入數(shù)據(jù)流(或輸出數(shù)據(jù)流)必須與其分解后產(chǎn)生的子圖的輸入數(shù)據(jù)流(或輸出數(shù)據(jù)流)保持“一致”。這并不意味著兩者在數(shù)量上和名稱上必須完全相同,而意味著兩者所包含的數(shù)據(jù)項(xiàng)在數(shù)量上和名稱上必須完全相同。在圖3中,(b)為(a)中的加工“開領(lǐng)書單”細(xì)化后得到的子圖,若“發(fā)票”包含的數(shù)據(jù)項(xiàng)=“學(xué)生”包含的數(shù)據(jù)項(xiàng)+“教材”包含的數(shù)據(jù)項(xiàng),則(a)和(b)是平衡的。
■
圖3 數(shù)據(jù)流圖繪圖原則例3
②注意分解的速度。一般來說,一個(gè)加工最好分解為2~4個(gè)子加工,最多不得超過7個(gè)。
③遵守圖和加工的編號(hào)規(guī)則。頂層圖只有一張,圖中的加工也只有一個(gè),該圖和圖中的加工都無需編號(hào)。0層圖(位于頂層圖下方)只有一張,該圖無需編號(hào),圖中的加工編號(hào)分別是1,2,……,n。對(duì)于其余層次中的每一張流圖,其編號(hào)就是父圖中相應(yīng)加工的編號(hào),圖中加工的編號(hào)由圖號(hào)、圓點(diǎn)和序號(hào)組成,例如1.1,1.2,……,1.n。
四、結(jié)語
除了讓學(xué)生掌握數(shù)據(jù)流圖的畫法外,教師還應(yīng)設(shè)法為學(xué)生提供更多的練習(xí)素材。考慮到教材上的習(xí)題太少且與實(shí)際脫節(jié),教師應(yīng)從網(wǎng)絡(luò)或其它途徑搜集習(xí)題和資料,并從中挑選難度適中的題目作為學(xué)生的練習(xí)素材。我們相信,學(xué)生只要樹立了對(duì)數(shù)據(jù)流圖重要性的正確認(rèn)識(shí),全面掌握了其畫法并勤于練習(xí),他們就能在軟件項(xiàng)目開發(fā)中真正用好這個(gè)工具。
參考文獻(xiàn):
[1]Donald S Le Vie,Jr.Understanding Data Flow Diagrams[EB/OL].http://ratandon.mysite.syr.edu/cis453/notes/DFD_over_Flowcharts.pdf.
[2]張海藩.軟件工程導(dǎo)論[M].北京:清華大學(xué)出版社,2008.
[3]Data flows:Note on Data-Driven Process Modeling[EB/OL].http://faculty.babson.edu/dewire/Readings/dfdintro.htm.
[4]張雅軍.淺析軟件工程中的數(shù)據(jù)流圖的畫法[J].天津職業(yè)院校聯(lián)合學(xué)報(bào),2008,10(2):70-73.