軟件工程教案3_第1頁(yè)
軟件工程教案3_第2頁(yè)
軟件工程教案3_第3頁(yè)
軟件工程教案3_第4頁(yè)
軟件工程教案3_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第三章 軟件設(shè)計(jì)一、復(fù)習(xí)要求1. 了解軟件概要設(shè)計(jì)的原則和過(guò)程。2. 掌握模塊劃分的評(píng)價(jià)準(zhǔn)則模塊獨(dú)立性的判別。3. 掌握結(jié)構(gòu)化設(shè)計(jì)方法。4. 了解Jackson系統(tǒng)開(kāi)發(fā)方法和Jackson程序設(shè)計(jì)方法。5. 了解數(shù)據(jù)設(shè)計(jì)和文件設(shè)計(jì)的原則。6. 掌握常用的詳細(xì)設(shè)計(jì)的表達(dá)方法。6. 了解軟件設(shè)計(jì)規(guī)格說(shuō)明和設(shè)計(jì)評(píng)審的主要內(nèi)容。二、內(nèi)容提要1. 軟件設(shè)計(jì)的過(guò)程一旦軟件需求確定之后,就進(jìn)入開(kāi)發(fā)階段。開(kāi)發(fā)階段由三個(gè)互相關(guān)聯(lián)的的步驟組成:設(shè)計(jì)、實(shí)現(xiàn)(編碼)和測(cè)試。每個(gè)步驟都按某種方式進(jìn)行信息變換,最后得到有效的計(jì)算機(jī)軟件。(1) 軟件設(shè)計(jì)在開(kāi)發(fā)階段中的重要性在軟件需求分析階段已經(jīng)完全弄清楚了軟件的各種需求,較好地解決了要讓所開(kāi)發(fā)的軟件“做什么”的問(wèn)題,并已在軟件需求規(guī)格說(shuō)明和數(shù)據(jù)要求規(guī)格說(shuō)明中詳盡和充分地闡明了這些需求。下一步就要著手實(shí)現(xiàn)軟件的需求,即要著手解決“怎么做”的問(wèn)題。分析模型中的每一個(gè)成份都提供了建立設(shè)計(jì)模型所需的信息。軟件設(shè)計(jì)的信息流如圖4.1所示。根據(jù)用數(shù)據(jù)、功能和行為模型表示的軟件需求,采用某種設(shè)計(jì)方法進(jìn)行數(shù)據(jù)設(shè)計(jì)、體系結(jié)構(gòu)設(shè)計(jì)、接口設(shè)計(jì)和過(guò)程設(shè)計(jì)。圖4.1 將分析模型轉(zhuǎn)換為軟件設(shè)計(jì)數(shù)據(jù)設(shè)計(jì)將實(shí)體關(guān)系圖中描述的對(duì)象和關(guān)系,以及數(shù)據(jù)詞典中描述的詳細(xì)數(shù)據(jù)內(nèi)容轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)的定義。體系結(jié)構(gòu)設(shè)計(jì)定義軟件系統(tǒng)各主要成份之間的關(guān)系。接口設(shè)計(jì)根據(jù)數(shù)據(jù)流圖定義軟件內(nèi)部各成份之間、軟件與其它協(xié)同系統(tǒng)之間及軟件與用戶(hù)之間的交互機(jī)制。過(guò)程設(shè)計(jì)則是把結(jié)構(gòu)成份轉(zhuǎn)換成軟件的過(guò)程性描述。在編碼步驟,根據(jù)這種過(guò)程性描述,生成源程序代碼,然后通過(guò)測(cè)試最終得到完整有效的軟件。軟件設(shè)計(jì)是開(kāi)發(fā)階段中最重要的步驟,它是軟件開(kāi)發(fā)過(guò)程中質(zhì)量得以保證的關(guān)鍵步驟。設(shè)計(jì)提供了軟件的表示,使得軟件的質(zhì)量評(píng)價(jià)成為可能。同時(shí),軟件設(shè)計(jì)又是將用戶(hù)要求準(zhǔn)確地轉(zhuǎn)化成為最終的軟件產(chǎn)品的唯一途徑。另一方面,軟件設(shè)計(jì)是后續(xù)開(kāi)發(fā)步驟及軟件維護(hù)工作的基礎(chǔ)。如果沒(méi)有設(shè)計(jì),只能建立一個(gè)不穩(wěn)定的系統(tǒng),如圖4.2所示。只要出現(xiàn)一些小小的變動(dòng),就會(huì)使得軟件垮掉,而且難于測(cè)試。圖4.2 軟件設(shè)計(jì)的重要性(2) 軟件設(shè)計(jì)的過(guò)程軟件設(shè)計(jì)是一個(gè)把軟件需求變換成軟件表示的過(guò)程。最初這種表示只是描繪出可直接反映功能、數(shù)據(jù)、行為需求的軟件的總的框架,然后進(jìn)一步細(xì)化,在此框架中填入細(xì)節(jié),把它加工成在程序細(xì)節(jié)上非常接近于源程序的軟件表示。從工程管理的角度來(lái)看,軟件設(shè)計(jì)分兩步完成。首先做概要設(shè)計(jì),將軟件需求轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)和軟件的系統(tǒng)結(jié)構(gòu),并建立接口。然后是詳細(xì)設(shè)計(jì),即過(guò)程設(shè)計(jì)。通過(guò)對(duì)結(jié)構(gòu)表示進(jìn)行細(xì)化,得到軟件的詳細(xì)的數(shù)據(jù)結(jié)構(gòu)和算法。McGlanghlin給出在將需求轉(zhuǎn)換為設(shè)計(jì)時(shí)判斷設(shè)計(jì)好壞的三條特征: 設(shè)計(jì)必須實(shí)現(xiàn)分析模型中描述的所有顯式需求,必須滿(mǎn)足用戶(hù)希望的所有隱式需求。 設(shè)計(jì)必須是可讀、可理解的,使得將來(lái)易于編程、易于測(cè)試、易于維護(hù)。 設(shè)計(jì)應(yīng)從實(shí)現(xiàn)角度出發(fā),給出與數(shù)據(jù)、功能、行為相關(guān)的軟件全貌。以上三點(diǎn)就是軟件設(shè)計(jì)過(guò)程的目標(biāo)。為達(dá)到這些目標(biāo),必須建立衡量設(shè)計(jì)的技術(shù)標(biāo)準(zhǔn)。 設(shè)計(jì)出來(lái)的結(jié)構(gòu)應(yīng)是分層結(jié)構(gòu),從而建立軟件成份之間的控制。 設(shè)計(jì)應(yīng)當(dāng)模塊化,從邏輯上將軟件劃分為完成特定功能或子功能的構(gòu)件。 設(shè)計(jì)應(yīng)當(dāng)既包含數(shù)據(jù)抽象,也包含過(guò)程抽象。 設(shè)計(jì)應(yīng)當(dāng)建立具有具有獨(dú)立功能特征的模塊。 設(shè)計(jì)應(yīng)當(dāng)建立能夠降低模塊與外部環(huán)境之間復(fù)雜連接的接口。 設(shè)計(jì)應(yīng)能根據(jù)軟件需求分析獲取的信息,建立可驅(qū)動(dòng)可重復(fù)的方法。 軟件設(shè)計(jì)過(guò)程根據(jù)基本的設(shè)計(jì)原則,使用系統(tǒng)化的方法和完全的的設(shè)計(jì)評(píng)審來(lái)建立良好的設(shè)計(jì)。2. 軟件設(shè)計(jì)的原則(1) 抽象化對(duì)軟件進(jìn)行模塊設(shè)計(jì)的時(shí)候,可以有不同的抽象層次。在最高的抽象層次上,可以使用問(wèn)題所處環(huán)境的語(yǔ)言描述問(wèn)題的解法。而在較低的抽象層次上,則采用過(guò)程化的方法。 過(guò)程的抽象 :在軟件工程過(guò)程中,從系統(tǒng)定義到實(shí)現(xiàn),每進(jìn)展一步都可以看做是對(duì)軟件解決方案的抽象化過(guò)程的一次細(xì)化。在軟件計(jì)劃階段,軟件被當(dāng)做整個(gè)計(jì)算機(jī)系統(tǒng)中的一個(gè)元素來(lái)看待。在軟件需求分析階段,用“問(wèn)題所處環(huán)境的為大家所熟悉的術(shù)語(yǔ)”來(lái)描述軟件的解決方法。而在從概要設(shè)計(jì)到詳細(xì)設(shè)計(jì)的過(guò)程中,抽象化的層次逐次降低。當(dāng)產(chǎn)生源程序時(shí)到達(dá)最低的抽象層次。 數(shù)據(jù)抽象 :數(shù)據(jù)抽象與過(guò)程抽象一樣,允許設(shè)計(jì)人員在不同層次上描述數(shù)據(jù)對(duì)象的細(xì)節(jié)。例如,可以定義一個(gè)draw數(shù)據(jù)對(duì)象,并將它規(guī)定為一個(gè)抽象數(shù)據(jù)類(lèi)型,用它的構(gòu)成元素來(lái)定義它的內(nèi)部細(xì)節(jié)。此時(shí),數(shù)據(jù)抽象draw本身是由另外一些數(shù)據(jù)抽象構(gòu)成。而且在定義draw的抽象數(shù)據(jù)類(lèi)型之后,就可以引用它來(lái)定義其它數(shù)據(jù)對(duì)象,而不必涉及draw的內(nèi)部細(xì)節(jié)。 控制抽象 :與過(guò)程抽象和數(shù)據(jù)抽象一樣,控制抽象可以包含一個(gè)程序控制機(jī)制而無(wú)須規(guī)定其內(nèi)部細(xì)節(jié)??刂瞥橄蟮睦泳褪窃诓僮飨到y(tǒng)中用以協(xié)調(diào)某些活動(dòng)的同步信號(hào)。(2) 自頂向下,逐步細(xì)化Niklaus Wirth提出的設(shè)計(jì)策略。將軟件的體系結(jié)構(gòu)按自頂向下方式,對(duì)各個(gè)層次的過(guò)程細(xì)節(jié)和數(shù)據(jù)細(xì)節(jié)逐層細(xì)化,直到用程序設(shè)計(jì)語(yǔ)言的語(yǔ)句能夠?qū)崿F(xiàn)為止,從而最后確立整個(gè)的體系結(jié)構(gòu)。最初的說(shuō)明只是概念性地描述了系統(tǒng)的功能或信息,但并未提供有關(guān)功能的內(nèi)部實(shí)現(xiàn)機(jī)制或有關(guān)信息的內(nèi)部結(jié)構(gòu)的任何信息。設(shè)計(jì)人員對(duì)初始說(shuō)明仔細(xì)推敲,進(jìn)行功能細(xì)化或信息細(xì)化,給出實(shí)現(xiàn)的細(xì)節(jié),劃分出若干成份。然后再對(duì)這些成份,施行同樣的細(xì)化工作。隨著細(xì)化工作的逐步展開(kāi),設(shè)計(jì)人員就能得到越來(lái)越多的細(xì)節(jié)。(3) 模塊化軟件系統(tǒng)的層次結(jié)構(gòu)正是模塊化的具體體現(xiàn)。就是說(shuō),整個(gè)軟件被劃分成若干單獨(dú)命名和可編址的部分,稱(chēng)之為模塊。這些模塊可以被組裝起來(lái)以滿(mǎn)足整個(gè)問(wèn)題的需求。一個(gè)大軟件,由于其控制路徑多、涉及范圍廣、變量多及其總體復(fù)雜性,使其相對(duì)于一個(gè)較小的軟件不容易被人們理解。在解決問(wèn)題的實(shí)踐中,如果把兩個(gè)問(wèn)題結(jié)合起來(lái)作為一個(gè)問(wèn)題來(lái)處理,其理解復(fù)雜性大于這兩個(gè)問(wèn)題被分開(kāi)考慮時(shí)的理解復(fù)雜性之和。因此,把一個(gè)大而復(fù)雜的問(wèn)題分解成一些獨(dú)立的易于處理的小問(wèn)題,解決起來(lái)就容易得多?;谏鲜隹紤],把問(wèn)題子問(wèn)題(功能子功能)的分解與軟件開(kāi)發(fā)中的系統(tǒng)子系統(tǒng)或者系統(tǒng)模塊對(duì)應(yīng)起來(lái),就能夠把一個(gè)大而復(fù)雜的軟件系統(tǒng)劃分成易于理解的比較單純的模塊結(jié)構(gòu)。所謂“比較單純”,是指模塊和其它模塊之間的接口應(yīng)盡可能獨(dú)立。實(shí)際上,如果模塊是相互獨(dú)立的,當(dāng)模塊變得越小,每個(gè)模塊花費(fèi)的工作量越低;但當(dāng)模塊數(shù)增加時(shí),模塊間的聯(lián)系也隨之增加,把這些模塊聯(lián)接起來(lái)的工作量也隨之增加。如圖4.3所示。因此,存在一個(gè)模塊個(gè)數(shù)M, 它使得總的開(kāi)發(fā)成本達(dá)到最小。 圖4.3 模塊大小、模塊數(shù)目與費(fèi)用的關(guān)系(4) 控制層次控制層次也叫做程序結(jié)構(gòu),它表明了程序構(gòu)件(模塊)的組織情況??刂茖哟瓮贸绦虻膶哟危?shù)形或網(wǎng)狀)結(jié)構(gòu)來(lái)表示。如圖4.4所示。位于最上層根部是頂層模塊,它是程序的主模塊。與其聯(lián)系的有若干下屬模塊,各下屬模塊還可以進(jìn)一步引出更下一層的下屬模塊。模塊M是頂層模塊,如果算做第0層,則其下屬模塊A、B和C為第1層,模塊D、E、K、L和N是第2層,等等。圖4.4 程序的層次結(jié)構(gòu)圖示例 程序結(jié)構(gòu)的深度:程序結(jié)構(gòu)的層次數(shù)稱(chēng)為結(jié)構(gòu)的深度。結(jié)構(gòu)的深度在一定意義上反映了程序結(jié)構(gòu)的規(guī)模和復(fù)雜程度。 程序結(jié)構(gòu)的寬度:層次結(jié)構(gòu)中同一層模塊的最大模塊個(gè)數(shù)稱(chēng)為結(jié)構(gòu)的寬度。 模塊的扇入和扇出:扇出表示一個(gè)模塊直接調(diào)用(或控制)的其它模塊數(shù)目。扇入則定義為調(diào)用(或控制)一個(gè)給定模塊的模塊個(gè)數(shù)。多扇出意味著需要控制和協(xié)調(diào)許多下屬模塊。而多扇入的模塊通常是公用模塊。要注意的是,程序結(jié)構(gòu)是軟件的過(guò)程表示,但并未表明軟件的某些過(guò)程性特征。比如,進(jìn)程序列、事件決策的順序或其它的軟件動(dòng)態(tài)特性。(5) 結(jié)構(gòu)劃分程序結(jié)構(gòu)可以按水平方向或垂直方向進(jìn)行劃分。水平劃分按主要的程序功能來(lái)定義模塊結(jié)構(gòu)的各個(gè)分支。頂層模塊是控制模塊,用來(lái)協(xié)調(diào)程序各個(gè)功能之間的通信和運(yùn)行。其下級(jí)模塊的最簡(jiǎn)單的水平劃分方法是建立三個(gè)分支:輸入、處理(數(shù)據(jù)變換)和輸出。這種劃分的優(yōu)點(diǎn)是:由于主要的功能相互分離,易于修改、易于擴(kuò)充,且沒(méi)有副作用。缺點(diǎn)是:需要通過(guò)模塊接口傳遞更多的數(shù)據(jù),使程序流的整體控制復(fù)雜化。垂直劃分也叫做因子劃分。主要用在程序的體系結(jié)構(gòu)中,且工作自頂向下逐層分布:頂層模塊執(zhí)行控制功能,少做實(shí)際處理工作,而低層模塊是實(shí)際輸入、計(jì)算和輸出的具體執(zhí)行者。這種劃分的優(yōu)點(diǎn)是:對(duì)低層模塊的修改不太可能引起副作用的傳播,而恰恰對(duì)計(jì)算機(jī)程序的修改常常發(fā)生在低層的輸入、計(jì)算或輸出模塊中。因此,程序的整體控制結(jié)構(gòu)不太可能被修改,便于將來(lái)的維護(hù)。(6) 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)的各個(gè)元素之間的邏輯關(guān)系的一種表示。數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)應(yīng)確定數(shù)據(jù)的組織、存取方式、相關(guān)程度、以及信息的不同處理方法。數(shù)據(jù)結(jié)構(gòu)的組織方法和復(fù)雜程度可以靈活多樣,但典型的數(shù)據(jù)結(jié)構(gòu)種類(lèi)是有限的,它們是構(gòu)成一些更復(fù)雜結(jié)構(gòu)的基本構(gòu)件塊。圖4.5表示了這些典型的數(shù)據(jù)結(jié)構(gòu)。圖4.5 典型的數(shù)據(jù)結(jié)構(gòu)標(biāo)量是最簡(jiǎn)單的一種數(shù)據(jù)結(jié)構(gòu)。所謂標(biāo)量項(xiàng)就是單個(gè)的數(shù)據(jù)元素,例如一個(gè)布爾量、整數(shù)、實(shí)數(shù)或一個(gè)字符串??梢酝ㄟ^(guò)名字對(duì)它們進(jìn)行存取。若把多個(gè)標(biāo)量項(xiàng)組織成一個(gè)表或者順序鄰接為一組時(shí),就形成了順序向量。順序向量又稱(chēng)為一維數(shù)組。通??梢酝ㄟ^(guò)下標(biāo)及數(shù)組名來(lái)訪(fǎng)問(wèn)數(shù)組中的某一元素。把順序向量擴(kuò)展到二維、三維,直至任意維,就形成了n維向量空間。最常見(jiàn)的n維向量空間是二維矩陣。鏈表是一種更靈活的數(shù)據(jù)結(jié)構(gòu),它把不相鄰的標(biāo)量項(xiàng)、向量或空間結(jié)構(gòu)用拉鏈指針鏈接起來(lái),使得它們可以像表一樣得到處理。組合上述基本數(shù)據(jù)結(jié)構(gòu)可以構(gòu)成其它數(shù)據(jù)結(jié)構(gòu)。例如,可以用包含標(biāo)量項(xiàng)、向量或 n維空間的多重鏈表來(lái)建立分層結(jié)構(gòu)和網(wǎng)絡(luò)結(jié)構(gòu)。而利用它們又可以實(shí)現(xiàn)多種集合的存儲(chǔ)。必須注意,數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)一樣,可以在不同的抽象層次上表示。例如,一個(gè)棧是一種線(xiàn)性結(jié)構(gòu)的邏輯模型,其特點(diǎn)是只允許在結(jié)構(gòu)的一端進(jìn)行插入或刪除運(yùn)算。它可以用向量實(shí)現(xiàn),也可以用鏈表實(shí)現(xiàn)。(7) 軟件過(guò)程圖4.6 一個(gè)模塊內(nèi)的軟件過(guò)程程序結(jié)構(gòu)描述了整個(gè)程序的控制層次關(guān)系和各個(gè)部分的接口情況,而圖4.6所示的軟件過(guò)程則著重描述各個(gè)模塊的處理細(xì)節(jié)。軟件過(guò)程必須提供精確的處理說(shuō)明,包括事件的順序、正確的判定點(diǎn)、重復(fù)的操作直至數(shù)據(jù)的組織和結(jié)構(gòu)等等。程序結(jié)構(gòu)與軟件過(guò)程是有關(guān)系的。對(duì)每個(gè)模塊的處理必須指明該模塊所在的上下級(jí)環(huán)境。軟件過(guò)程遵從程序結(jié)構(gòu)的主從關(guān)系,因此它也是層次化的。(8) 信息隱蔽如何分解一個(gè)軟件才能得到最佳的模塊組合?為了明確怎樣去做,需要了解什么是“信息隱蔽”。由parnas提倡的信息隱蔽是指,每個(gè)模塊的實(shí)現(xiàn)細(xì)節(jié)對(duì)于其它模塊來(lái)說(shuō)是隱蔽的。就是說(shuō),模塊中所包含的信息(包括數(shù)據(jù)和過(guò)程)不允許其它不需要這些信息的模塊使用。通常有效的模塊化可以通過(guò)定義一組獨(dú)立的模塊來(lái)實(shí)現(xiàn),這些模塊相互間的通信僅使用對(duì)于實(shí)現(xiàn)軟件功能來(lái)說(shuō)是必要的信息。通過(guò)抽象,幫助我們確定組成軟件的過(guò)程(或信息)實(shí)體,通過(guò)信息隱蔽,則可定義和實(shí)施對(duì)模塊的過(guò)程細(xì)節(jié)和局部數(shù)據(jù)結(jié)構(gòu)的存取限制。由于一個(gè)軟件系統(tǒng)在整個(gè)軟件生存期內(nèi)要經(jīng)過(guò)多次修改,所以在劃分模塊時(shí)要采取措施,使得大多數(shù)過(guò)程和數(shù)據(jù)對(duì)軟件的其它部分是隱蔽的。這樣,在將來(lái)修改軟件時(shí)偶然引入錯(cuò)誤所造成的影響就可以局限在一個(gè)或幾個(gè)模塊內(nèi)部,不致波及到軟件的其它部分。3. 軟件體系結(jié)構(gòu)軟件體系結(jié)構(gòu)的三要素是程序構(gòu)件(模塊)的層次結(jié)構(gòu)、構(gòu)件之間交互的方式,以及數(shù)據(jù)的結(jié)構(gòu)。軟件設(shè)計(jì)的一個(gè)目標(biāo)是建立軟件的體系結(jié)構(gòu)表示。將這個(gè)表示當(dāng)作一個(gè)框架,從事更詳細(xì)的設(shè)計(jì)活動(dòng)。Shaw和Garlan提出了在軟件體系結(jié)構(gòu)設(shè)計(jì)中應(yīng)保持的幾個(gè)性質(zhì): 結(jié)構(gòu) :體系結(jié)構(gòu)設(shè)計(jì)應(yīng)當(dāng)定義系統(tǒng)的構(gòu)件,以及這些構(gòu)件打包的方式和相互交互的方式。如將對(duì)象打包以封裝數(shù)據(jù)和操縱數(shù)據(jù)的處理,并通過(guò)相關(guān)操作的調(diào)用來(lái)進(jìn)行交互。 附屬的功能 :體系結(jié)構(gòu)設(shè)計(jì)應(yīng)當(dāng)描述設(shè)計(jì)出來(lái)的體系結(jié)構(gòu)如何實(shí)現(xiàn)對(duì)功能、性能、可靠性、安全性、適應(yīng)性,以及其它的系統(tǒng)需求。 可復(fù)用 :體系結(jié)構(gòu)設(shè)計(jì)應(yīng)當(dāng)描述為一種可復(fù)用的模式,以便在以后類(lèi)似的系統(tǒng)族的設(shè)計(jì)中使用它們。此外,設(shè)計(jì)應(yīng)能復(fù)用體系結(jié)構(gòu)中的構(gòu)造塊。表4.1列出可能的軟件構(gòu)件,表4.2列出可能的構(gòu)件間的連接方式。表4.1 軟件構(gòu)件分類(lèi) 構(gòu) 件 特 點(diǎn) 和 示 例純計(jì)算構(gòu)件具有簡(jiǎn)單的輸入輸出關(guān)系,沒(méi)有運(yùn)行狀態(tài)的變化。例如,數(shù)值計(jì)算、過(guò)濾器(Filters)、轉(zhuǎn)換器(Transformers)等。存儲(chǔ)構(gòu)件存放共享的、永久性的、結(jié)構(gòu)化的數(shù)據(jù)。例如,數(shù)據(jù)庫(kù)、文件、符號(hào)表、超文本等。管理構(gòu)件執(zhí)行的操作與運(yùn)行狀態(tài)緊密耦合。例如,抽象數(shù)據(jù)類(lèi)型(ADT)、面向?qū)ο笙到y(tǒng)中的對(duì)象、許多服務(wù)器(Servers)等。控制構(gòu)件管理其它構(gòu)件運(yùn)行的時(shí)間、時(shí)機(jī)及次序。例如,調(diào)度器、同步器等。鏈接構(gòu)件在實(shí)體之間傳遞信息。例如,通信機(jī)制、用戶(hù)界面等。表4.2 構(gòu)件之間的連接方式 連 接 特 點(diǎn) 與 示 例過(guò)程調(diào)用在某一個(gè)執(zhí)行路徑中傳遞執(zhí)行指針。例如,普通過(guò)程調(diào)用(同一個(gè)命名空間)、遠(yuǎn)程過(guò)程調(diào)用(不同的命名空間)。數(shù)據(jù)流相互獨(dú)立的處理通過(guò)數(shù)據(jù)流進(jìn)行交互,在得到數(shù)據(jù)的同時(shí)被賦予控制權(quán)限。例如,UNIX系統(tǒng)中的管道(pipes)。間接激活處理是因事件的發(fā)生而激活的,在處理之間沒(méi)有直接的交互。例如,事件驅(qū)動(dòng)系統(tǒng)、自動(dòng)垃圾回收等。消息傳遞相互獨(dú)立的處理之間有明確的交互,通過(guò)顯式的離散方式的數(shù)據(jù)傳遞。這種傳遞可以是同步的,也可以是異步的。例如,TCPIP。共享數(shù)據(jù)構(gòu)件們通過(guò)同一個(gè)數(shù)據(jù)空間進(jìn)行并發(fā)的操作。例如,多用戶(hù)數(shù)據(jù)庫(kù)、數(shù)據(jù)黑板系統(tǒng)。軟件系統(tǒng)的體系結(jié)構(gòu)經(jīng)歷了一個(gè)由低級(jí)到高級(jí)的發(fā)展過(guò)程。其間出現(xiàn)過(guò)下列體系結(jié)構(gòu)。(1) 數(shù)據(jù)流系統(tǒng) 批處理 管道及過(guò)濾器這種結(jié)構(gòu)中的每一個(gè)組成成份都有一套輸入和輸出數(shù)據(jù),都依輸入數(shù)據(jù)處理輸出結(jié)果的方式工作。進(jìn)行數(shù)據(jù)變換的構(gòu)件叫做過(guò)濾器,把數(shù)據(jù)從一個(gè)過(guò)濾器的輸出導(dǎo)入到另一個(gè)過(guò)濾器的輸入,就叫做管道。在這種系統(tǒng)中,各個(gè)過(guò)濾器必須是相互獨(dú)立的,每一個(gè)過(guò)濾器對(duì)它的上游或下游的過(guò)濾器的情況是不知道的,也不能做任何假設(shè)。如果要求最終的輸出結(jié)果與各個(gè)過(guò)濾器的執(zhí)行次序相關(guān),就是一個(gè)數(shù)據(jù)流方式的體系結(jié)構(gòu)。這種結(jié)構(gòu)的優(yōu)點(diǎn)是:數(shù)據(jù)流程設(shè)計(jì)明確,直接支持復(fù)用,系統(tǒng)容易維護(hù)和升級(jí),可以進(jìn)行某些性能分析(如流量、死鎖等),容易支持并行計(jì)算。缺點(diǎn)是:容易導(dǎo)致把系統(tǒng)變成為簡(jiǎn)單的批處理作業(yè)。每一個(gè)過(guò)濾器都要考慮相似的數(shù)據(jù)檢驗(yàn)和處理,不能很好地支持交互式操作和反饋。對(duì)數(shù)據(jù)的格式不能做過(guò)多的約定,使得每個(gè)過(guò)濾器的實(shí)現(xiàn)會(huì)更復(fù)雜。(2) 調(diào)用返回系統(tǒng) 主程序子程序 層次結(jié)構(gòu)在層次結(jié)構(gòu)中,每一層都只與上下相鄰的兩層通信。每一層在利用下層基礎(chǔ)服務(wù)的條件下,為上層提供服務(wù)。最典型的例子就是各種虛擬機(jī)、X-window以及OSI-ISO的7層網(wǎng)絡(luò)協(xié)議。這種結(jié)構(gòu)的優(yōu)點(diǎn)是:提供逐步抽象的編程支持,支持復(fù)用及系統(tǒng)升級(jí)。缺點(diǎn)是:不是所有的系統(tǒng)都適合于建成層次結(jié)構(gòu),不能提供最佳性能。 面向?qū)ο蟮南到y(tǒng)在這種系統(tǒng)中,數(shù)據(jù)和其相關(guān)的基本操作被封裝在一起。系統(tǒng)的構(gòu)件是對(duì)象。對(duì)象具有諸如封裝、隱蔽、繼承等良好的特性。對(duì)象必須自己維護(hù)其數(shù)據(jù)的一致性。這種結(jié)構(gòu)的優(yōu)點(diǎn)是:將具體的實(shí)現(xiàn)部分隱蔽在對(duì)象中,使得代碼之間的獨(dú)立性很好,有利于將復(fù)雜的系統(tǒng)分解為相互操縱的子任務(wù)。缺點(diǎn)是:對(duì)象間進(jìn)行一般的調(diào)用時(shí)必須知道對(duì)方的標(biāo)識(shí)。如果一個(gè)對(duì)象的標(biāo)識(shí)發(fā)生變化,所有顯式調(diào)用這個(gè)對(duì)象操作的地方都要修改。對(duì)象之間的同步等還缺乏現(xiàn)成的機(jī)制。(3) 獨(dú)立構(gòu)件系統(tǒng) 進(jìn)程間通信 事件驅(qū)動(dòng)這種結(jié)構(gòu)的特點(diǎn)是事件的發(fā)出者不必知道,也不應(yīng)假設(shè)對(duì)該事件的具體處理過(guò)程。它的優(yōu)點(diǎn)是:提供了強(qiáng)大的可復(fù)用性支持。系統(tǒng)的重配置也很容易。缺點(diǎn)是:軟件系統(tǒng)中的構(gòu)件在很大程度上依靠操作系統(tǒng)的調(diào)用。如果一個(gè)事件的處理需要多個(gè)進(jìn)程處理,活動(dòng)進(jìn)程的激活次序是不能保證的。經(jīng)過(guò)事件傳遞數(shù)據(jù)也較受限制。事件處理中的邏輯處理實(shí)際上帶有時(shí)態(tài)性質(zhì),與一般的邏輯處理不一樣。(4) 虛擬機(jī) 解釋器解釋器的目的是實(shí)現(xiàn)一個(gè)虛擬機(jī)。這是一類(lèi)比較復(fù)雜的體系結(jié)構(gòu),但是,如果進(jìn)行結(jié)構(gòu)分析的話(huà),就會(huì)發(fā)現(xiàn)看似不同的系統(tǒng)有著十分相似的結(jié)構(gòu)。 推理系統(tǒng) 過(guò)程控制這種結(jié)構(gòu)要比較外界變量與目標(biāo)常數(shù)的差異,經(jīng)過(guò)控制策略的計(jì)算,反饋信號(hào),控制需要監(jiān)測(cè)和控制的過(guò)程。(5) 數(shù)據(jù)為中心的系統(tǒng) 數(shù)據(jù)庫(kù) 超文本系統(tǒng) 數(shù)據(jù)黑板系統(tǒng)這種結(jié)構(gòu)的特點(diǎn)是:有兩種構(gòu)件:一是被共享的結(jié)構(gòu)化數(shù)據(jù),保存了所有的運(yùn)行狀態(tài);二是所有訪(fǎng)問(wèn)這些數(shù)據(jù)的獨(dú)立的進(jìn)程。如果是因?yàn)檩斎氲臄?shù)據(jù)而引起對(duì)共享數(shù)據(jù)的操作,那么這種控制策略下的體系結(jié)構(gòu)就叫做數(shù)據(jù)庫(kù)。如果是由共享數(shù)據(jù)的當(dāng)前狀態(tài)觸發(fā)相應(yīng)的處理進(jìn)程,那么這種體系結(jié)構(gòu)就叫做數(shù)據(jù)黑板。許多表面上看起來(lái)是其它種類(lèi)的體系結(jié)構(gòu),可以同時(shí)歸入這種體系結(jié)構(gòu)。(6) 其它 分布式處理的系統(tǒng) 特定領(lǐng)域的軟件體系結(jié)構(gòu)(7) 演進(jìn)與綜合一般來(lái)講,一個(gè)新系統(tǒng)的原型最開(kāi)始出現(xiàn)時(shí),往往以批處理方式進(jìn)行組合;在進(jìn)一步的應(yīng)用分析過(guò)程中,將逐步對(duì)交互控制方式、實(shí)時(shí)的反饋、集成化等方面提出需求,因而系統(tǒng)將逐步向以數(shù)據(jù)為中心的系統(tǒng)過(guò)渡,中間還可能會(huì)經(jīng)過(guò)一種或幾種演化形態(tài)。4. 有效的模塊設(shè)計(jì)模塊化方法帶來(lái)了許多好處。一方面,模塊化設(shè)計(jì)降低了系統(tǒng)的復(fù)雜性,使得系統(tǒng)容易修改; 另一方面,推動(dòng)了系統(tǒng)各個(gè)部分的并行開(kāi)發(fā),從而提高了軟件的生產(chǎn)效率。(1) 模塊模塊又稱(chēng)構(gòu)件,在傳統(tǒng)的方法中指用一個(gè)名字就可調(diào)用的一段程序。類(lèi)似于高級(jí)語(yǔ)言中的過(guò)程、函數(shù)等。它一般具有如下三個(gè)基本屬性: 功能:即指該模塊實(shí)現(xiàn)什么功能,做什么事情。 邏輯:即描述模塊內(nèi)部怎么做。 狀態(tài):即該模塊使用時(shí)的環(huán)境和條件。在描述一個(gè)模塊時(shí),還必須按模塊的外部特性與內(nèi)部特性分別描述。模塊的外部特性是指模塊的模塊名、參數(shù)表、以及給程序以至整個(gè)系統(tǒng)造成的影響。而模塊的內(nèi)部特性則是指完成其功能的程序代碼和僅供該模塊內(nèi)部使用的數(shù)據(jù)。對(duì)于模塊的外部環(huán)境(例如需要調(diào)用這個(gè)模塊的上級(jí)模塊)來(lái)說(shuō),只需要了解這個(gè)模塊的外部特性足夠了,不必了解它的內(nèi)部特性。而軟件設(shè)計(jì)階段,通常是先確定模塊的外部特性,然后再確定它的內(nèi)部特性。(2) 模塊獨(dú)立性所謂模塊的獨(dú)立性,是指軟件系統(tǒng)中每個(gè)模塊只涉及軟件要求的具體的子功能,而和軟件系統(tǒng)中其它的模塊的接口是簡(jiǎn)單的。例如,若一個(gè)模塊只具有單一的功能且與其它模塊沒(méi)有太多的聯(lián)系,那么,我們則稱(chēng)此模塊具有模塊獨(dú)立性。一般采用兩個(gè)準(zhǔn)則度量模塊獨(dú)立性。即模塊間的耦合和模塊的內(nèi)聚。(3) 內(nèi)聚性?xún)?nèi)聚是模塊功能強(qiáng)度(一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度)的度量。一個(gè)內(nèi)聚程度高的模塊(在理想情況下)應(yīng)當(dāng)只做一件事。一般模塊的內(nèi)聚性分為七種類(lèi)型。在上面的關(guān)系中可以看到,位于高端的幾種內(nèi)聚類(lèi)型最好,位于中段的幾種內(nèi)聚類(lèi)型是可以接受的,但位于低端的內(nèi)聚類(lèi)型很不好,一般不能使用。因此,人們總是希望一個(gè)模塊的內(nèi)聚類(lèi)型向高的方向靠。模塊的內(nèi)聚在系統(tǒng)的模塊化設(shè)計(jì)中是一個(gè)關(guān)鍵的因素。 巧合內(nèi)聚(偶然內(nèi)聚):當(dāng)幾個(gè)模塊內(nèi)湊巧有一些程序段代碼相同,又沒(méi)有明確表現(xiàn)出獨(dú)立的功能,把這些代碼獨(dú)立出來(lái)建立的模塊即為巧合內(nèi)聚模塊。它是內(nèi)聚程度最低的模塊。缺點(diǎn)是模塊的內(nèi)容不易理解,不易修改和維護(hù)。 邏輯內(nèi)聚 :這種模塊把幾種相關(guān)的功能組合在一起,每次被調(diào)用時(shí),由傳送給模塊的控制型參數(shù)來(lái)確定該模塊應(yīng)執(zhí)行哪一種功能。邏輯內(nèi)聚模塊比巧合內(nèi)聚模塊的內(nèi)聚程度要高。因?yàn)樗砻髁烁鞑糠种g在功能上的相關(guān)關(guān)系。 時(shí)間內(nèi)聚(經(jīng)典內(nèi)聚):這種模塊大多為多功能模塊,但要求模塊的各個(gè)功能必須在同一時(shí)間段內(nèi)執(zhí)行。例如初始化模塊和終止模塊。時(shí)間內(nèi)聚模塊比邏輯內(nèi)聚模塊的內(nèi)聚程度又稍高一些。在一般情形下,各部分可以以任意的順序執(zhí)行,所以它的內(nèi)部邏輯更簡(jiǎn)單。圖4.7 通信內(nèi)聚模塊 過(guò)程內(nèi)聚 :使用流程圖做為工具設(shè)計(jì)程序的時(shí)侯,常常通過(guò)流程圖來(lái)確定模塊劃分。把流程圖中的某一部分劃出組成模塊,就得到過(guò)程內(nèi)聚模塊。這類(lèi)模塊的內(nèi)聚程度比時(shí)間內(nèi)聚模塊的內(nèi)聚程度更強(qiáng)一些。 通信內(nèi)聚 :如果一個(gè)模塊內(nèi)各功能部分都使用了相同的輸入數(shù)據(jù),或產(chǎn)生了相同的輸出數(shù)據(jù),則稱(chēng)之為通信內(nèi)聚模塊。通常,通信內(nèi)聚模塊是通過(guò)數(shù)據(jù)流圖來(lái)定義的。如圖4.7所示。圖4.8 信息內(nèi)聚模塊 信息內(nèi)聚(順序內(nèi)聚):這種模塊完成多個(gè)功能,各個(gè)功能都在同一數(shù)據(jù)結(jié)構(gòu)上操作,每一項(xiàng)功能有一個(gè)唯一的入口點(diǎn)。例如,圖4.8所示的模塊具有4個(gè)功能,由于模塊的所有功能都是基于同一個(gè)數(shù)據(jù)結(jié)構(gòu)(符號(hào)表),因此,它是一個(gè)信息內(nèi)聚的模塊。信息內(nèi)聚模塊可以看成是多個(gè)功能內(nèi)聚模塊的組合,并且達(dá)到信息的隱蔽。即把某個(gè)數(shù)據(jù)結(jié)構(gòu)、資源或設(shè)備隱蔽在一個(gè)模塊內(nèi),不為別的模塊所知曉。當(dāng)把程序某些方面細(xì)節(jié)隱藏在一個(gè)模塊中時(shí),就增加了模塊的獨(dú)立性。 功能內(nèi)聚 :一個(gè)模塊中各個(gè)部分都是為完成一項(xiàng)具體功能而協(xié)同工作,緊密聯(lián)系,不可分割的。則稱(chēng)該模塊為功能內(nèi)聚模塊。功能內(nèi)聚模塊時(shí)內(nèi)聚性最強(qiáng)的模塊。(4) 耦合性耦合是模塊之間的相對(duì)獨(dú)立性(互相連接的緊密程度)的度量。它取決于各個(gè)模塊之間接口的復(fù)雜程度、調(diào)用模塊的方式以及哪些信息通過(guò)接口。一般模塊之間可能的連接方式有七種,構(gòu)成耦合性的七種類(lèi)型。 內(nèi)容耦合 :如果一個(gè)模塊直接訪(fǎng)問(wèn)另一個(gè)模塊的內(nèi)部數(shù)據(jù);或者一個(gè)模塊不通過(guò)正常入口轉(zhuǎn)到另一模塊內(nèi)部;或者兩個(gè)模塊有一部分程序代碼重迭;或者一個(gè)模塊有多個(gè)入口,則兩個(gè)模塊之間就發(fā)生了內(nèi)容耦合。在內(nèi)容耦合的情形,被訪(fǎng)問(wèn)模塊的任何變更,或者用不同的編譯器對(duì)它再編譯,都會(huì)造成程序出錯(cuò)。這種耦合是模塊獨(dú)立性最弱的耦合。 公共耦合 :若一組模塊都訪(fǎng)問(wèn)同一個(gè)公共數(shù)據(jù)環(huán)境,則它們之間的耦合就稱(chēng)為公共耦合。公共的數(shù)據(jù)環(huán)境可以是全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等。公共耦合的復(fù)雜程度隨耦合模塊的個(gè)數(shù)增加而顯著增加。如圖4.9所示,若只是兩個(gè)模塊之間有公共數(shù)據(jù)環(huán)境,則公共耦合有兩種情況:松散公共耦合和緊密公共耦合。只有在模塊之間共享的數(shù)據(jù)很多,且通過(guò)參數(shù)表傳遞不方便時(shí),才使用公共耦合。 外部耦合 :一組模塊都訪(fǎng)問(wèn)同一全局簡(jiǎn)單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過(guò)參數(shù)表傳遞該全局變量的信息,則稱(chēng)之為外部耦合。外部耦合引起的問(wèn)題類(lèi)似于公共耦合,區(qū)別在于在外部耦合中不存在依賴(lài)于一個(gè)數(shù)據(jù)結(jié)構(gòu)內(nèi)部各項(xiàng)的物理安排。圖4.10 控制耦合圖4.9 公共耦合 控制耦合 :如果一個(gè)模塊通過(guò)傳送開(kāi)關(guān)、標(biāo)志、名字等控制信息,明顯地控制選擇另一模塊的功能,就是控制耦合。如圖4.10所示。這種耦合的實(shí)質(zhì)是在單一接口上選擇多功能模塊中的某項(xiàng)功能。因此,對(duì)被控制模塊的任何修改,都會(huì)影響控制模塊。另外,控制耦合也意味著控制模塊必須知道被控制模塊內(nèi)部的一些邏輯關(guān)系,這些都會(huì)降低模塊的獨(dú)立性。 標(biāo)記耦合 :如果一組模塊通過(guò)參數(shù)表傳遞記錄信息,就是標(biāo)記耦合。事實(shí)上,這組模塊共享了某一數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),而不是簡(jiǎn)單變量。這要求這些模塊都必須清楚該記錄的結(jié)構(gòu),并按結(jié)構(gòu)要求對(duì)記錄進(jìn)行操作。 數(shù)據(jù)耦合 :如果一個(gè)模塊訪(fǎng)問(wèn)另一個(gè)模塊時(shí),彼此之間是通過(guò)數(shù)據(jù)參數(shù)(不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量)來(lái)交換輸入、輸出信息的,則稱(chēng)這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合是松散的耦合,模塊之間的獨(dú)立性比較強(qiáng)。 非直接耦合 :如果兩個(gè)模塊之間沒(méi)有直接關(guān)系,它們之間的聯(lián)系完全是通過(guò)主模塊的控制和調(diào)用來(lái)實(shí)現(xiàn)的,這就是非直接耦合。這種耦合的模塊獨(dú)立性最強(qiáng)。實(shí)際上,開(kāi)始時(shí)兩個(gè)模塊之間的耦合不只是一種類(lèi)型,而是多種類(lèi)型的混合。這就要求設(shè)計(jì)人員進(jìn)行分析、比較,逐步加以改進(jìn),以提高模塊的獨(dú)立性。模塊之間的連接越緊密,聯(lián)系越多,耦合性就越高,而其模塊獨(dú)立性就越弱。一個(gè)模塊內(nèi)部各個(gè)元素之間的聯(lián)系越緊密,則它的內(nèi)聚性就越高,相對(duì)地,它與其它模塊之間的耦合性就會(huì)減低,而模塊獨(dú)立性就越強(qiáng)。因此,模塊獨(dú)立性比較強(qiáng)的模塊應(yīng)是高內(nèi)聚低耦合的模塊。5. 結(jié)構(gòu)化設(shè)計(jì)方法(Structured Design, SD)從系統(tǒng)設(shè)計(jì)的角度出發(fā),軟件設(shè)計(jì)方法可以分為三大類(lèi)。第一類(lèi)是根據(jù)系統(tǒng)的數(shù)據(jù)流進(jìn)行設(shè)計(jì),稱(chēng)為面向數(shù)據(jù)流的設(shè)計(jì)或者過(guò)程驅(qū)動(dòng)的設(shè)計(jì),以結(jié)構(gòu)化設(shè)計(jì)方法為代表。第二類(lèi)是根據(jù)系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)進(jìn)行設(shè)計(jì),稱(chēng)為面向數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)或者數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì),以L(fǎng)CP(程序邏輯構(gòu)造)方法、Jackson系統(tǒng)開(kāi)發(fā)方法和數(shù)據(jù)結(jié)構(gòu)化系統(tǒng)開(kāi)發(fā)(DSSD)方法為代表。第三類(lèi)設(shè)計(jì)方法即面向?qū)ο蟮脑O(shè)計(jì)。結(jié)構(gòu)化設(shè)計(jì)方法是基于模塊化、自頂向下細(xì)化、結(jié)構(gòu)化程序設(shè)計(jì)等程序設(shè)計(jì)技術(shù)基礎(chǔ)上發(fā)展起來(lái)的。該方法實(shí)施的要點(diǎn)是: 建立數(shù)據(jù)流的類(lèi)型。 指明流的邊界。 將數(shù)據(jù)流圖映射到程序結(jié)構(gòu)。 用“因子化”方法定義控制的層次結(jié)構(gòu)。 用設(shè)計(jì)測(cè)量和一些啟發(fā)式規(guī)則對(duì)結(jié)構(gòu)進(jìn)行細(xì)化。(1) 在系統(tǒng)結(jié)構(gòu)圖(SC)中的模塊在系統(tǒng)結(jié)構(gòu)圖中不能再分解的底層模塊為原子模塊。如果一個(gè)軟件系統(tǒng)的全部實(shí)際加工(數(shù)據(jù)計(jì)算或處理)都由底層的原子模塊來(lái)完成,而其它所有非原子模塊僅僅執(zhí)行控制或協(xié)調(diào)功能,這樣的系統(tǒng)就是完全因子分解的系統(tǒng)。如果系統(tǒng)結(jié)構(gòu)圖是完全因子分解的,就是最好的系統(tǒng)。一般地,在系統(tǒng)結(jié)構(gòu)圖中有4種類(lèi)型的模塊: 傳入模塊 :從下屬模塊取得數(shù)據(jù),經(jīng)過(guò)某些處理,再將其傳送給上級(jí)模塊。 傳出模塊 :從上級(jí)模塊獲得數(shù)據(jù),進(jìn)行某些處理,再將其傳送給下屬模塊。 變換模塊 :即加工模塊。它從上級(jí)模塊取得數(shù)據(jù),進(jìn)行特定的處理,轉(zhuǎn)換成其它形式,再傳送回上級(jí)模塊。大多數(shù)計(jì)算模塊(原子模塊)屬于這一類(lèi)。 協(xié)調(diào)模塊 :對(duì)所有下屬模塊進(jìn)行協(xié)調(diào)和管理的模塊。 在系統(tǒng)的輸入輸出部分或數(shù)據(jù)加工部分可以找到這樣的模塊。在一個(gè)好的系統(tǒng)結(jié)構(gòu)圖中,協(xié)調(diào)模塊應(yīng)在較高層出現(xiàn)。在實(shí)際系統(tǒng)中,有些模塊屬于上述某一類(lèi)型,還有一些模塊是上述各種類(lèi)型的組合。圖4.11 系統(tǒng)結(jié)構(gòu)圖的四種模塊類(lèi)型(2) 變換流與變換型系統(tǒng)結(jié)構(gòu)變換型數(shù)據(jù)處理問(wèn)題的工作過(guò)程大致分為三步,即取得數(shù)據(jù),變換數(shù)據(jù)和給出數(shù)據(jù)。如圖4.12所示。這三步反映了變換型問(wèn)題數(shù)據(jù)流的基本思想。其中,變換數(shù)據(jù)是數(shù)據(jù)處理過(guò)程的核心工作,而取得數(shù)據(jù)只不過(guò)是為它做準(zhǔn)備,給出數(shù)據(jù)則是對(duì)變換后的數(shù)據(jù)進(jìn)行后處理工作。圖4.12 變換型數(shù)據(jù)流變換型系統(tǒng)結(jié)構(gòu)圖如圖4.13所示,相應(yīng)于取得數(shù)據(jù)、變換數(shù)據(jù)、給出數(shù)據(jù),系統(tǒng)的結(jié)構(gòu)圖由輸入、中心變換和輸出等三部分組成。圖4.13 變換型的系統(tǒng)結(jié)構(gòu)圖(3) 事務(wù)流與事務(wù)型系統(tǒng)結(jié)構(gòu)圖圖4.14 事務(wù)型數(shù)據(jù)處理問(wèn)題事務(wù)型數(shù)據(jù)處理問(wèn)題的工作機(jī)理是接受一項(xiàng)事務(wù),根據(jù)事務(wù)處理的特點(diǎn)和性質(zhì),選擇分派一個(gè)適當(dāng)?shù)奶幚韱卧?,然后給出結(jié)果。我們把完成選擇分派任務(wù)的部分叫做事務(wù)處理中心?;蚍峙刹考?。這種事務(wù)型數(shù)據(jù)處理問(wèn)題的數(shù)據(jù)流圖如圖4.14所示。其中,輸入數(shù)據(jù)流在事務(wù)中心T處做出選擇,激活某一種事務(wù)處理加工。D1D4 是并列的供選擇的事務(wù)處理加工。事務(wù)型數(shù)據(jù)流圖所對(duì)應(yīng)的系統(tǒng)結(jié)構(gòu)圖就是事務(wù)型系統(tǒng)結(jié)構(gòu)圖。如圖4.15所示。圖4.15 事務(wù)型系統(tǒng)結(jié)構(gòu)圖在事務(wù)型系統(tǒng)結(jié)構(gòu)圖中,事務(wù)中心模塊按所接受的事務(wù)的類(lèi)型,選擇某一個(gè)事務(wù)處理模塊執(zhí)行。各個(gè)事務(wù)處理模塊是并列的,依賴(lài)于一定的選擇條件,分別完成不同的事務(wù)處理工作。每個(gè)事務(wù)處理模塊可能要調(diào)用若干個(gè)操作模塊,而操作模塊又可能調(diào)用若干個(gè)細(xì)節(jié)模塊。不同的事務(wù)處理模塊可以共享一些操作模塊。同樣,不同的操作模塊又可以共享一些細(xì)節(jié)模塊。事務(wù)型系統(tǒng)結(jié)構(gòu)圖在數(shù)據(jù)處理中經(jīng)常遇到,但是更多的是變換型與事務(wù)型系統(tǒng)結(jié)構(gòu)圖的結(jié)合。例如,變換型系統(tǒng)結(jié)構(gòu)中的某個(gè)變換模塊本身又具有事務(wù)型的特點(diǎn)。(4) 變換映射變換映射是體系結(jié)構(gòu)設(shè)計(jì)的一種策略。運(yùn)用變換映射方法建立初始的變換型系統(tǒng)結(jié)構(gòu)圖,然后對(duì)它做進(jìn)一步的改進(jìn),最后得到系統(tǒng)的最終結(jié)構(gòu)圖。設(shè)計(jì)的步驟如下。步驟1:復(fù)審基本系統(tǒng)模型(0層數(shù)據(jù)流圖和支持信息)。評(píng)估系統(tǒng)規(guī)格說(shuō)明和軟件需求規(guī)格說(shuō)明。步驟2:復(fù)審和細(xì)化軟件的數(shù)據(jù)流圖。重畫(huà)數(shù)據(jù)流圖時(shí), 可以從物理輸入到物理輸出,或者相反. 還可以從頂層加工框開(kāi)始,逐層向下。步驟3:確定數(shù)據(jù)流圖中含有變換流特征還是含有事務(wù)流特征。通常,系統(tǒng)的信息流總能表示為變換型,但其中也可能遇到明顯的事務(wù)流特征,這時(shí)可采用變換型為主,在局部范圍采用事務(wù)型的設(shè)計(jì)方法。步驟4:區(qū)分輸入流、輸出流和中心變換部分,即標(biāo)明流的邊界。不同的設(shè)計(jì)人員可能選擇不同的流邊界,這將導(dǎo)致不同的系統(tǒng)結(jié)構(gòu)圖。步驟5:進(jìn)行一級(jí)“因子化”分解,設(shè)計(jì)頂層和第一層模塊。首先設(shè)計(jì)主模塊,用程序名字為它命名,將它畫(huà)在與中心變換相對(duì)應(yīng)的位置上。做為系統(tǒng)的頂層,它調(diào)用下層模塊,完成系統(tǒng)所要做的各項(xiàng)工作。系統(tǒng)結(jié)構(gòu)第一層的設(shè)計(jì)方針:為每一個(gè)邏輯輸入設(shè)計(jì)一個(gè)輸入模塊,它為主模塊提供數(shù)據(jù);為每一個(gè)邏輯輸出設(shè)計(jì)一個(gè)輸出模塊,它將主模塊提供的數(shù)據(jù)輸出;為中心變換設(shè)計(jì)一個(gè)變換模塊,它將邏輯輸入轉(zhuǎn)換成邏輯輸出。第一層模塊與主模塊之間傳送的數(shù)據(jù)應(yīng)與數(shù)據(jù)流圖相對(duì)應(yīng)。步驟6:進(jìn)行二級(jí)“因子化”分解,設(shè)計(jì)中、下層模塊。這一步工作是自頂向下,逐層細(xì)化,為每一個(gè)輸入模塊、輸出模塊、變換模塊設(shè)計(jì)它們的從屬模塊。輸入模塊要向調(diào)用它的上級(jí)模塊提供數(shù)據(jù),因而它必須有兩個(gè)下屬模塊:一個(gè)是接收數(shù)據(jù);另一個(gè)是把這些數(shù)據(jù)變換成它的上級(jí)模塊所需的數(shù)據(jù)。輸出模塊是從調(diào)用它的上級(jí)模塊接收數(shù)據(jù),用以輸出,因而也應(yīng)當(dāng)有兩個(gè)下屬模塊:一個(gè)是將上級(jí)模塊提供的數(shù)據(jù)變換成輸出的形式;另一個(gè)是將它們輸出。中心變換模塊的下層模塊沒(méi)有通用的設(shè)計(jì)方法,一般應(yīng)參照數(shù)據(jù)流圖的中心變換部分和功能分解的原則來(lái)考慮如何對(duì)中心變換模塊進(jìn)行分解。步驟7:利用一些啟發(fā)式原則來(lái)改進(jìn)系統(tǒng)的初始結(jié)構(gòu)圖,直到得到符合要求的結(jié)構(gòu)圖為止。這些啟發(fā)式原則大致有: 模塊功能的完善化。一個(gè)完整的功能模塊,不僅應(yīng)能完成指定的功能,而且還應(yīng)當(dāng)能夠告訴使用者完成任務(wù)的狀態(tài),以及不能完成的原因。 消除重復(fù)功能,改善軟件結(jié)構(gòu)。在系統(tǒng)的初始結(jié)構(gòu)圖得出之后,應(yīng)當(dāng)審查分析這個(gè)結(jié)構(gòu)圖。如果發(fā)現(xiàn)幾個(gè)模塊的功能有相似之處,可以加以改進(jìn)。 模塊的作用范圍應(yīng)在控制范圍之內(nèi)。模塊的控制范圍包括它本身及其所有的從屬模塊。模塊的作用范圍是指模塊內(nèi)一個(gè)判定的作用范圍,凡是受這個(gè)判定影響的所有模塊都屬于這個(gè)判定的作用范圍。如果一個(gè)判定的作用范圍包含在這個(gè)判定所在模塊的控制范圍之內(nèi),則這種結(jié)構(gòu)是簡(jiǎn)單的,否則,它的結(jié)構(gòu)是不簡(jiǎn)單的。 盡可能減少高扇出結(jié)構(gòu),經(jīng)驗(yàn)證明,一個(gè)設(shè)計(jì)得很好的軟件模塊結(jié)構(gòu),通常上層扇出比較高,中層扇出較少,底層扇入到有高扇入的公用模塊中。 避免或減少使用病態(tài)聯(lián)接。應(yīng)限制使用如下三種病態(tài)聯(lián)接:直接病態(tài)聯(lián)接(內(nèi)容耦合)、公共數(shù)據(jù)域病態(tài)聯(lián)接(公共耦合)和通過(guò)通信模塊聯(lián)接。 模塊的大小要適中。限制模塊的大小是減少?gòu)?fù)雜性的手段之一,因而要求把模塊的大小限制在一定的范圍之內(nèi)。通常規(guī)定其語(yǔ)句行數(shù)在50100左右,最多不超過(guò)500行。 設(shè)計(jì)功能可預(yù)測(cè)的模塊,但要避免過(guò)分受限制的模塊。一個(gè)功能可預(yù)測(cè)的模塊不論內(nèi)部處理細(xì)節(jié)如何,但對(duì)相同的輸入數(shù)據(jù),總能產(chǎn)生同樣的結(jié)果。但是,如果模塊內(nèi)部蘊(yùn)藏有一些特殊的鮮為人知的功能時(shí),這個(gè)模塊就可能是不可預(yù)測(cè)的。對(duì)于這種模塊,如果調(diào)用者不小心使用,其結(jié)果將不可預(yù)測(cè)。調(diào)用者無(wú)法控制這個(gè)模塊的執(zhí)行,或者不能預(yù)知將會(huì)引起什么后果,最終會(huì)造成混亂。為了能夠適應(yīng)將來(lái)的變更,軟件模塊中局部數(shù)據(jù)結(jié)構(gòu)的大小應(yīng)當(dāng)是可控制的,調(diào)用者可以通過(guò)模塊接口上的參數(shù)表或一些預(yù)定義外部參數(shù)來(lái)規(guī)定或改變局部數(shù)據(jù)結(jié)構(gòu)的大小。另外,控制流的選擇對(duì)于調(diào)用者來(lái)說(shuō),應(yīng)當(dāng)是可預(yù)測(cè)的。而與外界的接口應(yīng)當(dāng)是靈活的,也可以用改變某些參數(shù)的值來(lái)調(diào)整接口的信息,以適應(yīng)未來(lái)的變更。 軟件包應(yīng)滿(mǎn)足設(shè)計(jì)約束和可移植性。(5) 事務(wù)映射在很多應(yīng)用中,存在某種作業(yè)數(shù)據(jù)流,它可以引發(fā)一個(gè)或多個(gè)處理。這種數(shù)據(jù)流就叫做事務(wù)。與變換映射類(lèi)似,事務(wù)映射也是從分析數(shù)據(jù)流圖開(kāi)始,自頂向下,逐步分解,建立系統(tǒng)結(jié)構(gòu)圖。所不同的是由數(shù)據(jù)流圖映射成的系統(tǒng)結(jié)構(gòu)圖不同。步驟1:復(fù)審基本系統(tǒng)模型。步驟2:復(fù)審和細(xì)化軟件的數(shù)據(jù)流圖。步驟3:確定數(shù)據(jù)流圖中含有變換流特征還是含有事務(wù)流特征。以上三步與變換映射中的相應(yīng)工作相同。步驟4:識(shí)別事務(wù)中心和每一條操作路徑上的流特征。事務(wù)中心通常位于幾條操作路徑的起始點(diǎn)上,可以從數(shù)據(jù)流圖上直接找出來(lái)。輸入路徑必須與其它所有操作路徑區(qū)分開(kāi)來(lái)。步驟5:將數(shù)據(jù)流圖映射到事務(wù)型系統(tǒng)結(jié)構(gòu)圖上。事務(wù)流應(yīng)映射到包含一個(gè)輸入分支和一個(gè)分類(lèi)事務(wù)處理分支的程序結(jié)構(gòu)上。輸入分支結(jié)構(gòu)的開(kāi)發(fā)與變換流的方法類(lèi)似。分類(lèi)事務(wù)處理分支結(jié)構(gòu)包含一個(gè)調(diào)度模塊,它調(diào)度和控制下屬的操作模塊。步驟6:“因子化”分解和細(xì)化該事務(wù)結(jié)構(gòu)和每一條操作路徑的結(jié)構(gòu)。每一條操作路徑的數(shù)據(jù)流圖由它自己的信息流特征,可以是變換流也可以是事務(wù)流。與每一條操作路徑相關(guān)的子結(jié)構(gòu)可以依照前面介紹的設(shè)計(jì)步驟進(jìn)行開(kāi)發(fā)。步驟7:利用一些啟發(fā)式原則來(lái)改進(jìn)系統(tǒng)的初始結(jié)構(gòu)圖。(6) 注意“黑箱”技術(shù)的使用。在設(shè)計(jì)當(dāng)前模塊時(shí), 先把這個(gè)模塊的所有下層模塊定義成“黑箱”,并在系統(tǒng)設(shè)計(jì)中利用它們,暫時(shí)不考慮它們的內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)方法。在這一步定義好的“黑箱”,由于已確定了它的功能和輸入、輸出,在下一步就可以對(duì)它們進(jìn)行設(shè)計(jì)和加工。這樣,又會(huì)導(dǎo)致更多的“黑箱”。最后,全部“黑箱”的內(nèi)容和結(jié)構(gòu)應(yīng)完全被確定。這就是我們所說(shuō)的自頂向下,逐步求精的過(guò)程。使用黑箱技術(shù)的主要好處是使設(shè)計(jì)人員可以只關(guān)心當(dāng)前的有關(guān)問(wèn)題,暫時(shí)不必考慮進(jìn)一步的瑣碎的次要的細(xì)節(jié),待進(jìn)一步分解時(shí)才去關(guān)心它們的內(nèi)部細(xì)節(jié)與結(jié)構(gòu)。6. Jackson系統(tǒng)開(kāi)發(fā)方法Jackson方法是一種典型的面向數(shù)據(jù)結(jié)構(gòu)的分析與設(shè)計(jì)方法。早期的Jackson方法用于小系統(tǒng)的設(shè)計(jì),稱(chēng)之為Jackson結(jié)構(gòu)程序設(shè)計(jì)方法,簡(jiǎn)稱(chēng)JSP方法。它是按輸入、輸出和內(nèi)部信息的數(shù)據(jù)結(jié)構(gòu)進(jìn)行軟件設(shè)計(jì)的,即把數(shù)據(jù)結(jié)構(gòu)的描述映射成程序結(jié)構(gòu)描述。若數(shù)據(jù)結(jié)構(gòu)有重復(fù)性,則對(duì)應(yīng)程序一定有循環(huán)控制結(jié)構(gòu);若數(shù)據(jù)結(jié)構(gòu)具有選擇性,則對(duì)應(yīng)程序一定需要有判定控制結(jié)構(gòu),以此揭示數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)之間的內(nèi)在關(guān)系,設(shè)計(jì)出反映數(shù)據(jù)結(jié)構(gòu)的程序結(jié)構(gòu)。JSP方法的的三步曲是信息 數(shù)據(jù)結(jié)構(gòu) 程序結(jié)構(gòu),這三步曲減少了設(shè)計(jì)決策上的盲目性。但是,當(dāng)把JSP方法用于大系統(tǒng)設(shè)計(jì)時(shí),就會(huì)出現(xiàn)大量復(fù)雜的難以對(duì)付的結(jié)構(gòu)沖突。因此,促使M.J.Jackson提出了JSD方法,即Jackson系統(tǒng)開(kāi)發(fā)方法。(1) JSD方法的步驟Jackson系統(tǒng)開(kāi)發(fā)方法把分析的重點(diǎn)放在構(gòu)造與系統(tǒng)相關(guān)聯(lián)的現(xiàn)實(shí)世界,并建立現(xiàn)實(shí)世界的信息域的模型上。它實(shí)際上是支持軟件分析與設(shè)計(jì)的一組連續(xù)的技術(shù)步驟。而且,JSD方法的最終目標(biāo)是生成軟件的過(guò)程性描述,沒(méi)有特別考慮程序模塊化結(jié)構(gòu),模塊只是作為過(guò)程的副產(chǎn)品而出現(xiàn),沒(méi)有特別強(qiáng)調(diào)模塊獨(dú)立性。使用JSD方法的步驟如下: 實(shí)體動(dòng)作分析:從問(wèn)題的簡(jiǎn)單描述中,選出軟件系統(tǒng)要產(chǎn)生和運(yùn)用的實(shí)體(人、物或組織),以及現(xiàn)實(shí)世界作用于實(shí)體上的動(dòng)作(事件)。實(shí)體從名詞中選出,動(dòng)作從動(dòng)詞中選出。當(dāng)然,只有與問(wèn)題求解直接有關(guān)的實(shí)體和動(dòng)作才能被選出做進(jìn)一步的分析。 實(shí)體結(jié)構(gòu)分析:把作用于實(shí)體的動(dòng)作或由實(shí)體執(zhí)行的動(dòng)作,按時(shí)間發(fā)生的先后次序排序,并用一個(gè)層狀的Jackson結(jié)構(gòu)圖表示。 定義初始模型:把實(shí)體和動(dòng)作表示成一個(gè)過(guò)程性的模型,定義模型與現(xiàn)實(shí)世界的聯(lián)系。模型系統(tǒng)的規(guī)格說(shuō)明可用系統(tǒng)規(guī)格說(shuō)明圖SSD來(lái)表示。 功能描述:詳細(xì)說(shuō)明與已定義的動(dòng)作相對(duì)應(yīng)的功能。 決定系統(tǒng)時(shí)間特性:對(duì)進(jìn)程調(diào)度特性進(jìn)行評(píng)價(jià)和說(shuō)明。 實(shí)現(xiàn):設(shè)計(jì)組成系統(tǒng)的硬件和軟件。JSD方法的前三步屬于需求分析階段,后三步屬于軟件設(shè)計(jì)階段。(2) Jackson程序設(shè)計(jì)方法JSPJSP的本質(zhì)就是“問(wèn)題應(yīng)當(dāng)被分解為可以用三種結(jié)構(gòu)形式表示的構(gòu)件的層次結(jié)構(gòu)?!?Jackson所說(shuō)的“結(jié)構(gòu)形式”就是指順序、選擇和重復(fù),實(shí)際上,它們就是過(guò)程性構(gòu)造,并成為結(jié)構(gòu)化程序設(shè)計(jì)方法基礎(chǔ)。 數(shù)據(jù)結(jié)構(gòu)表示法圖4.17 數(shù)據(jù)結(jié)構(gòu)組合表示Jackson提出的數(shù)據(jù)結(jié)構(gòu)表示有三種基本的構(gòu)造類(lèi)型,如圖4.16所示。圖(a)是順序結(jié)構(gòu),即數(shù)據(jù)結(jié)構(gòu)A由B、C、D三個(gè)成分組成且按B、C、D順序排列。圖(b)是選擇結(jié)構(gòu),即數(shù)據(jù)結(jié)構(gòu)A或者由B組成,或者由C組成,二者必具其一。可選擇的數(shù)據(jù)(子結(jié)構(gòu)或數(shù)據(jù)項(xiàng))加“”表示。在圖(c)中表示的是重復(fù)結(jié)構(gòu),即數(shù)據(jù)結(jié)構(gòu)A由多個(gè)B子結(jié)構(gòu)組成,子結(jié)構(gòu)用“*”加以標(biāo)記。圖4.16 Jackson數(shù)據(jù)結(jié)構(gòu)圖三種基本結(jié)構(gòu)可以組合,形成更復(fù)雜的結(jié)構(gòu)體系。如圖4.17所示。這種數(shù)據(jù)結(jié)構(gòu)圖可以同樣方便地應(yīng)用于輸入、輸出和數(shù)據(jù)庫(kù)結(jié)構(gòu)。下面用一個(gè)信用卡記賬的例子具體說(shuō)明。信用卡記賬系統(tǒng)的輸入數(shù)據(jù)結(jié)構(gòu)是兩個(gè)實(shí)際的賬冊(cè),它們對(duì)應(yīng)的兩個(gè)輸入文件如圖4.18所示。兩個(gè)實(shí)際輸入賬冊(cè)都按顧客號(hào)碼進(jìn)行登錄,所以?xún)蓚€(gè)輸入文件也是以顧客號(hào)碼組織記錄的。在支付賬冊(cè)中,每個(gè)顧客號(hào)碼行上要登記支付金額、支付日期。則在支付文件中的每個(gè)記錄中也對(duì)應(yīng)有支付金額(AMT)和支付日期(DATE)項(xiàng),另外還有標(biāo)識(shí)這個(gè)記錄的顧客號(hào)碼(CNO)項(xiàng)。在支付賬冊(cè)中是以顧客號(hào)碼進(jìn)行排序的,顧客號(hào)碼相同的支付記錄在支付賬冊(cè)中排列在一起,構(gòu)成關(guān)于該顧客的顧客號(hào)碼組,在支付文件中也有與之對(duì)應(yīng)的顧客號(hào)碼組。在顧客主賬冊(cè)中,每一個(gè)顧客號(hào)碼行上登記了顧客號(hào)碼(CNO)和結(jié)余(BAL),給出某一位顧客的支付能力情況。與之對(duì)應(yīng)的顧客主文件每個(gè)記錄也有這兩項(xiàng)。兩個(gè)輸入文件的內(nèi)容是一致的。對(duì)應(yīng)這兩個(gè)輸入文件的輸入數(shù)據(jù)結(jié)構(gòu)畫(huà)在文件圖示的左側(cè)。圖4.18 信用卡記賬系統(tǒng)的輸入圖4.19(a) 給出了信用卡記賬系統(tǒng)的輸出記賬報(bào)告,在報(bào)告中隱含了一個(gè)“店方總計(jì)”層次。報(bào)告中其它部分是顧客信息,因此,隱含了一個(gè)與“店方總計(jì)”同一層次的“顧客數(shù)據(jù)”子結(jié)構(gòu)。圖4.19(b) 給出了根據(jù)輸入和輸出數(shù)據(jù)結(jié)構(gòu)的對(duì)應(yīng)關(guān)系建立的輸出文件。圖4.19 信用卡記賬系統(tǒng)的輸出從層次性的輸入和(或)輸出數(shù)據(jù)結(jié)構(gòu)可以直接推導(dǎo)出程序或進(jìn)程的過(guò)程性表示。例如從圖4.19(b) 所示的輸出文件的Jackson數(shù)據(jù)結(jié)構(gòu)圖所導(dǎo)出的程序結(jié)構(gòu)如圖4.20所示。圖4.20 從輸出數(shù)據(jù)結(jié)構(gòu)導(dǎo)出的程序結(jié)構(gòu) 最后,利用Jackson給出的三種圖解來(lái)表示程序或進(jìn)程的執(zhí)行邏輯。這種圖解類(lèi)似于程序設(shè)計(jì)語(yǔ)言,實(shí)際上它是一種偽碼表示。三種基本控制結(jié)構(gòu)的圖解如圖4.21所示。圖4.21 三種基本控制結(jié)構(gòu)的圖解在給出程序的過(guò)程性描述時(shí),還需要添加一些必要的可執(zhí)行操作。例如,打開(kāi)文件、讀文件結(jié)束符、讀表頭數(shù)據(jù)項(xiàng)、讀行數(shù)據(jù)項(xiàng)、打印符號(hào)行、打印數(shù)字行、關(guān)閉文件等等。把它們分配到程序或進(jìn)程結(jié)構(gòu)的適當(dāng)位置,以得到一個(gè)完整的過(guò)程性描述。對(duì)于上例中“處理顧客數(shù)據(jù)”部分,給出過(guò)程性描述如下: PROCESS_CUST_DATA seq open PAY_FILE; open CUST_M_FILE;分別打開(kāi)支付文件和顧客主文件 PROCESS_CNO_GROUP iter until eof: PAY_FILE; 處理顧客號(hào)碼組 read PAY_FILE; 讀支付文件一個(gè)記錄 PROCESS_CNO; 讀顧客主文件一個(gè)記錄,找老結(jié)余 PROCESS_PAY_RECORD iter until end: CNO_GROUP; 處理顧客號(hào)碼組中每個(gè)支付記錄 write report line; 寫(xiě)出報(bào)告行 compute total payments; 計(jì)算總支付額 read PAY_FILE; 讀支付文件下一個(gè)記錄 PROCESS_PAY_RECORD end;一位顧客數(shù)據(jù)處理完 COMPUTE_CUST_TOTAL;計(jì)算顧客總數(shù) COMPUTE_BALANCE seq計(jì)算結(jié)余 PROCESS_OLD_BALANCE;處理老結(jié)余 COMPUTE_NEW_BALANCE;計(jì)算新結(jié)余) write report line; 寫(xiě)出報(bào)告行 COMPUTE_BALANCE end; 計(jì)算結(jié)余完畢 PROCESS_CNO_GROUP end; 支付文件處理完成 PROCESS_CUST_DATA end ; Substructure PROCESS_CUST_DATA用JSP方法得到的程序或進(jìn)程結(jié)構(gòu)圖,一般都需要求精和優(yōu)化。因?yàn)檫@種方法是從輸入輸出數(shù)據(jù)結(jié)構(gòu)導(dǎo)出程序結(jié)構(gòu)圖,因此有些中間處理過(guò)程在結(jié)構(gòu)圖中反映不出來(lái)。在求精過(guò)程中,可以對(duì)結(jié)構(gòu)圖進(jìn)行改進(jìn)和細(xì)化,使之完整和易于實(shí)現(xiàn)。(3) 結(jié)構(gòu)沖突Jackson把結(jié)構(gòu)沖突定義為三種類(lèi)型。 順序沖突順序沖突是指在輸入數(shù)據(jù)結(jié)構(gòu)和輸出數(shù)據(jù)結(jié)構(gòu)中,輸入數(shù)據(jù)與輸出數(shù)據(jù)的順序沖突。例如,倉(cāng)庫(kù)存放多種零件P1,P2,每個(gè)零件的每次變動(dòng)(收或發(fā))都有一張卡片做記錄。庫(kù)存管理系統(tǒng)的輸入數(shù)據(jù)結(jié)構(gòu)是一疊卡片組成的文件。文件包括許多零件組,每個(gè)零件組又包括許多卡片(變動(dòng)記錄),每張卡片又分別可以是“收”或“發(fā)”,圖4.22(b)。輸出數(shù)據(jù)結(jié)構(gòu)是月報(bào)表,見(jiàn)圖4.22(a)。表中列出每種零件的凈變化,一種零件的凈變化占一行,見(jiàn)圖4.22(c)。月報(bào)表來(lái)自輸入文件,所以它們之間有很好的對(duì)應(yīng)性。圖4.22 順序沖突的例子月報(bào)表每一行的內(nèi)容來(lái)自輸入文件的每一個(gè)零件組,行數(shù)與零件

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論