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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論