第8章-結(jié)構(gòu)化系統(tǒng)設(shè)計(總體設(shè)計)_第1頁
第8章-結(jié)構(gòu)化系統(tǒng)設(shè)計(總體設(shè)計)_第2頁
第8章-結(jié)構(gòu)化系統(tǒng)設(shè)計(總體設(shè)計)_第3頁
第8章-結(jié)構(gòu)化系統(tǒng)設(shè)計(總體設(shè)計)_第4頁
第8章-結(jié)構(gòu)化系統(tǒng)設(shè)計(總體設(shè)計)_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章-結(jié)構(gòu)化系統(tǒng)設(shè)計(總體設(shè)計)第一頁,共105頁。本章主要內(nèi)容8.1軟件架構(gòu)的設(shè)計(achitecture)8.2結(jié)構(gòu)化軟件結(jié)構(gòu)設(shè)計的基本概念(structure)8.3結(jié)構(gòu)化軟件結(jié)構(gòu)設(shè)計方法(structure)第二頁,共105頁。8.1軟件架構(gòu)的設(shè)計(achitecture)8.1.1什么是軟件架構(gòu)8.1.2架構(gòu)設(shè)計第三頁,共105頁。8.1.1.軟件架構(gòu)的概念建筑、文學(xué)、音樂、機(jī)械、電子、計算機(jī)軟硬件等領(lǐng)域都會使用“架構(gòu)(architecture)”這一概念。架構(gòu)都提供了系統(tǒng)最高層的設(shè)計方案,以確保建筑、小說、樂曲、設(shè)備、計算機(jī)等系統(tǒng)滿足期望的特性。好的建筑應(yīng)該美觀、堅固、實用好的計算機(jī)應(yīng)用系統(tǒng)應(yīng)該實用、好維護(hù)、可靠、性價比高架構(gòu)師(architect)需要發(fā)現(xiàn)特定系統(tǒng)的最重要的關(guān)注點,設(shè)計某種折衷的總體方案以滿足關(guān)注點。架構(gòu)包含系統(tǒng)的一組基本結(jié)構(gòu)(structure),每種結(jié)構(gòu)都有各種類型的部件(component)及其關(guān)系構(gòu)成,架構(gòu)描述了這些部件的組合、相互調(diào)用參照、通信以及其他動態(tài)交互。第四頁,共105頁。架構(gòu)和結(jié)構(gòu)的關(guān)系架構(gòu)是抽象無形的,體現(xiàn)高層全局的決策,就像文章的中心思想和提綱。結(jié)構(gòu)是具體有形的,體現(xiàn)決策的貫徹,如同文章的每個段落及細(xì)節(jié)描述。架構(gòu)包含了結(jié)構(gòu)的初步描述和決策。相同架構(gòu)的系統(tǒng),具體結(jié)構(gòu)允許有差異。第五頁,共105頁。使用橋梁來比喻橋梁的架構(gòu)設(shè)計可以使用草圖描述,架構(gòu)決定了橋梁的基本結(jié)構(gòu)部件。橋梁有梁式橋、拱橋、斜拉橋、懸索橋等架構(gòu)斜拉橋的基本結(jié)構(gòu):索塔主梁斜拉索第六頁,共105頁。使用橋梁來比喻橋梁的結(jié)構(gòu)設(shè)計則需要考慮各種部件的數(shù)量、材料、重量、形態(tài)等方面,是可以施工的嚴(yán)謹(jǐn)?shù)慕Y(jié)構(gòu)圖。架構(gòu)是抽象的,對結(jié)構(gòu)進(jìn)行了設(shè)計和限定,每座橋的結(jié)構(gòu)是具體有形的、元素組合千變?nèi)f化第七頁,共105頁。1.軟件架構(gòu)軟件架構(gòu)(softwarearchitecture)的定義沒有統(tǒng)一的版本,一般認(rèn)為:一個應(yīng)用程序或計算系統(tǒng)的軟件架構(gòu)是一個或一組結(jié)構(gòu),它包含組成系統(tǒng)的軟件元素、這些元素對外可見的性質(zhì)以及它們之間的關(guān)系。對外可見的性質(zhì)指軟件元素能夠提供的服務(wù)、性能特征、錯誤處理、共享資源的用法等。軟件的一個結(jié)構(gòu)元素可能是一個子系統(tǒng)、構(gòu)件、進(jìn)程、庫、數(shù)據(jù)庫、計算結(jié)點、遺留系統(tǒng)等等。軟件架構(gòu)是最高層次的系統(tǒng)分解,它不會囊括所有的結(jié)構(gòu)和行為的定義,它只關(guān)注那些被認(rèn)為是重要的元素。架構(gòu)難以更改,一旦修改,意味著整個系統(tǒng)重建,而結(jié)構(gòu)修改只影響局部。第八頁,共105頁。2.軟件架構(gòu)模式大部分的架構(gòu)來源于有相似關(guān)注點的系統(tǒng)的總結(jié)和抽象,這些相似性被描述成某種特殊模式的架構(gòu)風(fēng)格,也就是架構(gòu)模式(architecturalpattern)。一種架構(gòu)模式就是一個經(jīng)驗秘籍,架構(gòu)師在設(shè)計不同系統(tǒng)時可以重復(fù)使用這些先進(jìn)經(jīng)驗。圖10.1就是橋梁的四種常用架構(gòu)模式。中國建筑有一種攢尖模式,被廣泛應(yīng)用在古典園林中,如三角、四角、五角、八角等亭子,宮殿、壇廟大量應(yīng)用。第九頁,共105頁。軟件架構(gòu)模式軟件架構(gòu)模式就是可重復(fù)使用的軟件結(jié)構(gòu)風(fēng)格。第十頁,共105頁。8.1.2

架構(gòu)設(shè)計主機(jī)-終端的集中控制結(jié)構(gòu)分布式對象結(jié)構(gòu)客戶機(jī)-服務(wù)器的分布式結(jié)構(gòu)C/S結(jié)構(gòu)B/S結(jié)構(gòu)第十一頁,共105頁。1、主機(jī)-終端式結(jié)構(gòu)軟件配置在主機(jī)上,處理能力也集中于主機(jī)終端用于輸入和輸出,無CPU主機(jī)Host終端Terminal控制臺Console第十二頁,共105頁。主機(jī)-終端的一般硬件配置主機(jī)-終端網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)..CPUCPU….....控臺控臺………...漢字用戶終端一期40臺,二期100臺,小型打印機(jī)一期5臺,二期8臺激光打印機(jī)2臺,行打1臺3臺磁帶機(jī)4000M硬盤通信控制器中心終端,一期2臺,二期10臺…第十三頁,共105頁。2、分布式對象結(jié)構(gòu)每個對象在邏輯上是平等的,它們可以互相為對方提供所需的服務(wù)。提供服務(wù)的對象就是服務(wù)器,而提出服務(wù)請求的對象就是客戶。軟件總線(ORB)O1S(O1)O2S(O2)OnS(On)…分布式對象結(jié)構(gòu)第十四頁,共105頁。分布式對象結(jié)構(gòu)的網(wǎng)絡(luò)拓?fù)淠P头植际綄ο蠼Y(jié)構(gòu)......通信控制器PC1PC2PC3點陣打印機(jī)硬盤驅(qū)動器激光打印機(jī)星形網(wǎng)絡(luò)......PC1PC2PC3點陣打印機(jī)激光打印機(jī)b.總線形網(wǎng)絡(luò)......PC1PC2PC3硬盤驅(qū)動器激光打印機(jī)c.環(huán)形網(wǎng)絡(luò)第十五頁,共105頁。3、客戶機(jī)-服務(wù)器結(jié)構(gòu)處理分布于客戶機(jī)和服務(wù)器??蛻魴C(jī)完成本地運算,可向服務(wù)器請求某種服務(wù)(如查詢數(shù)據(jù)),服務(wù)器響應(yīng)請求,完成運算后,將結(jié)果返回給客戶機(jī)數(shù)據(jù)庫服務(wù)器客戶機(jī)數(shù)據(jù)庫第十六頁,共105頁??蛻魴C(jī)-服務(wù)器的一般硬件配置客戶機(jī)/服務(wù)器結(jié)構(gòu)..微機(jī)......微機(jī)微機(jī)工作站..工作站數(shù)據(jù)庫服務(wù)器數(shù)據(jù)庫服務(wù)器應(yīng)用服務(wù)器第十七頁,共105頁??蛻魴C(jī)-服務(wù)器的軟件配置Client/Server(C/S):應(yīng)用程序配置于客戶機(jī),DBMS配置于服務(wù)器。Windows窗口程序數(shù)據(jù)庫數(shù)據(jù)庫服務(wù)器數(shù)據(jù)庫服務(wù)器Web應(yīng)用服務(wù)器數(shù)據(jù)庫瀏覽器程序(如IE)Browser/Server(B/S):應(yīng)用程序配置于Web應(yīng)用服務(wù)器,客戶端配置瀏覽器程序第十八頁,共105頁。B/S的工作機(jī)制B/S結(jié)構(gòu)(Internet架構(gòu))..用戶..用戶..用戶...WEB服務(wù)器數(shù)據(jù)庫服務(wù)器ODBC數(shù)據(jù)請求返回數(shù)據(jù)數(shù)據(jù)請求返回數(shù)據(jù)Lan連接HTTP連接第十九頁,共105頁。如何選擇架構(gòu)模式內(nèi)部管理、安全性要求高、后臺少數(shù)人使用的功能采用Windows界面的C/S結(jié)構(gòu),也稱為胖客戶端。外部用戶較多的功能采用瀏覽器界面的B/S結(jié)構(gòu),也成為瘦客戶端。胖客戶端/瘦客戶端,各有優(yōu)缺點:C/S架構(gòu)的缺點主要是部署、更新的問題。B/S架構(gòu)的缺點主要是受制于HTML的限制,無法像C/S那樣使用豐富的效果來展示數(shù)據(jù),用戶體驗比較糟糕。第二十頁,共105頁。軟件架構(gòu)的最新發(fā)展第二十一頁,共105頁。豐富客戶端RIA(RichInternetApplication)的出現(xiàn)給我們帶來重新在客戶端和服務(wù)器端進(jìn)行更好的平衡的機(jī)會。是集桌面應(yīng)用程序的最佳用戶界面功能與Web應(yīng)用程序的普遍采用和快速、低成本布署以及互動多媒體通信的實時快捷于一體的新一代網(wǎng)絡(luò)應(yīng)用程序。有以下特點:在消息確認(rèn)和格式編排方面提供互動用戶界面在無刷新頁面之下提供快捷的界面響應(yīng)時間(Ajax技術(shù)AsynchronousJavaScriptandXML)提供通用的用戶界面特性如拖放式(draganddrop)以及在線和離線操作能力結(jié)合了B/S配置的優(yōu)勢和C/S界面豐富的特點第二十二頁,共105頁。8.2結(jié)構(gòu)化軟件結(jié)構(gòu)設(shè)計的基本概念(structure)8.2.1結(jié)構(gòu)化設(shè)計內(nèi)容8.2.2結(jié)構(gòu)化設(shè)計思想8.2.3模塊8.2.4結(jié)構(gòu)圖8.2.5模塊的聯(lián)系8.2.6模塊間的耦合8.2.7模塊的內(nèi)聚8.2.8啟發(fā)規(guī)則第二十三頁,共105頁。采用強調(diào)自頂向下、逐層分解的功能模塊設(shè)計,也稱為結(jié)構(gòu)化設(shè)計。主要包括:將系統(tǒng)劃分成功能模塊(Module);決定每個模塊的功能;決定模塊的調(diào)用關(guān)系;決定模塊的界面(Interface,接口),即調(diào)用時傳入的信息(函數(shù)參數(shù)),以及返回的信息(返回值)。主要模型:模塊結(jié)構(gòu)圖(SC,StructureChart),也稱功能結(jié)構(gòu)圖。8.2.1設(shè)計內(nèi)容第二十四頁,共105頁。8.2.2設(shè)計思想結(jié)構(gòu)化:自頂向下,逐層分解求精結(jié)構(gòu)化設(shè)計:軟件模塊化,按層次劃分模塊化因為根據(jù)經(jīng)驗:對于問題1(P1)和問題2(P2) 若:C(P1)>C(P2)

則:E(P1)>E(P2)有規(guī)律顯示:

C(P1+P2)>C(P1)+C(P2)

則:E(P1+P2)>E(P1)+E(P2)C表示復(fù)雜度,E表示需要的工作量第二十五頁,共105頁。模塊化設(shè)計方法使用功能分解一定程度上能夠簡化系統(tǒng)結(jié)構(gòu),使系統(tǒng)容易修改和理解。具體做法:把整個軟件劃分為部分,其中每一部分的功能簡單明確,即程序模塊(可以是子過程或函數(shù))劃分模塊的工作按層次進(jìn)行,上層模塊調(diào)用下層模塊每一個模塊應(yīng)盡可能獨立模塊間的調(diào)用接口要闡明(模塊名稱、輸入數(shù)據(jù)、輸出數(shù)據(jù))第二十六頁,共105頁。8.2.3模塊模塊(Module)一詞使用很廣泛。通常對應(yīng)于用一個名字就可以調(diào)用的一段程序語句(子程序或函數(shù))。模塊具有輸入和輸出、邏輯功能、運行程序、內(nèi)部數(shù)據(jù)四種屬性。計算年齡模塊的圖形表示方法模塊的函數(shù)接口表示intGetAge(datebirthday)第二十七頁,共105頁。小程序練習(xí)計算5?。??。?!。代碼如下:x1=1;for(inti=1;i<=5;i++)x1=x1*i;x2=1;for(inti=1;i<=6;i++)x2=x2*i;x3=1;for(inti=1;i<=7;i++)x3=x3*i;x4=x1+x2+x3;封裝一個求階乘的模塊吧!第二十八頁,共105頁。定義和調(diào)用子過程C#定義:

PublicvoidPrintGradeReport(StringstuID) {……}調(diào)用:

PrintGradeReport(“2008012264”);模塊之子程序第二十九頁,共105頁??梢暬绦蛟O(shè)計采用事件驅(qū)動的編程技術(shù),使用事件過程,事件過程也是子程序。例如按鈕button1單擊的事件過程如下:C#.NET:事件過程的定義:privatevoidbutton1_Click(objectsender,EventArgse){……}事件過程的調(diào)用(與事件綁定后自動完成調(diào)用):this.button1.Click+=newSystem.EventHandler(this.button1_Click);模塊之事件過程第三十頁,共105頁。與子過程的區(qū)別:函數(shù)存在返回值調(diào)用函數(shù)通常要使用其返回值C#定義函數(shù)

PubliclongFactorial(intn) {……}調(diào)用函數(shù)

x1=Factorial(5);x2=Factorial(6);模塊之函數(shù)第三十一頁,共105頁。接口成本/集成成本成本/工作量模塊數(shù)量單元模塊成本軟件總成本模塊數(shù)量和軟件成本

粒度太大,單個模塊復(fù)雜度升高、維護(hù)困難粒度太小,管理與運行成本升高試想一下:每個經(jīng)理管理協(xié)調(diào)多少個下級合適?第三十二頁,共105頁。8.2.4結(jié)構(gòu)圖結(jié)構(gòu)圖(StructureChart)描述系統(tǒng)的模塊結(jié)構(gòu)及模塊間的聯(lián)系結(jié)構(gòu)圖中的主要成分有:模塊:用長方形表示調(diào)用:從一個模塊指向另一模塊的箭頭表示前一個模塊調(diào)用后一個模塊。有循環(huán)調(diào)用和條件調(diào)用數(shù)據(jù):用帶圓圈的小箭頭表示從一個模塊傳遞給另一模塊的數(shù)據(jù)(有實義)控制信息:帶涂黑圓圈的小箭頭表示一個模塊傳送給另一模塊的控制信息第三十三頁,共105頁。主調(diào)模塊被調(diào)模塊被調(diào)模塊主調(diào)模塊被調(diào)模塊被調(diào)模塊循環(huán)調(diào)用條件調(diào)用結(jié)構(gòu)圖無嚴(yán)格的模塊調(diào)用順序,但一般習(xí)慣從左至右因為約定遵從從上向下的調(diào)用,調(diào)用關(guān)系也可以不使用箭頭,而直接使用直線模塊間傳遞的信息如果出現(xiàn)在數(shù)據(jù)字典中,則視為數(shù)據(jù),否則為控制信息結(jié)構(gòu)圖的畫法第三十四頁,共105頁。計算獲得有效數(shù)據(jù)生成報表打印報表讀入數(shù)據(jù)核對數(shù)據(jù)打印表頭打印表尾顯示無效數(shù)據(jù)打印一行有效數(shù)據(jù)EOF數(shù)據(jù)EOF有效數(shù)據(jù)數(shù)據(jù)有效數(shù)據(jù)結(jié)果EOF結(jié)果日期數(shù)據(jù)行總計行總計一個完整的結(jié)構(gòu)圖第三十五頁,共105頁。簡單畫法的結(jié)構(gòu)圖(H圖)借書模塊還可分解:驗證讀者身份、修改圖書狀態(tài)、保存借閱記錄等簡化后,忽略信息傳遞的結(jié)構(gòu)圖如下:第三十六頁,共105頁。8.2.5模塊的聯(lián)系為了衡量模塊的相對獨立性,提出了模塊間的耦合(Coupling)與模塊的內(nèi)聚(Cohesion)兩個標(biāo)準(zhǔn)耦合:模塊和模塊之間的聯(lián)系程度內(nèi)聚:模塊內(nèi)部各元素之間的聯(lián)系程度設(shè)計目標(biāo):模塊內(nèi)的聯(lián)系越緊越好模塊間的聯(lián)系越少越好為什么?第三十七頁,共105頁。8.2.6模塊的耦合doubleCalculateAvg(){intn;doubletotal,average,value;scanf(“輸入個數(shù):\n”,&n); total=sum(n); average=total/n;return(average);}兩個模塊之間存在聯(lián)系第三十八頁,共105頁。影響耦合度的因素如果使用模塊A需要了解模塊B,那么A和B是耦合的。影響模塊間耦合程度有三方面的因素:聯(lián)系方式--模塊間通過什么方式聯(lián)系來往信息的作用--模塊間來往信息作什么用數(shù)量--模塊間來往信息的多少?;旌峡刂茢?shù)據(jù)

用過程直接引用語句調(diào)用少多數(shù)量方式作用0離坐標(biāo)原點越遠(yuǎn),耦合程度越高第三十九頁,共105頁。耦合的類型耦合分類如下:數(shù)據(jù)耦合:采用子程序調(diào)用,調(diào)用模塊將需要進(jìn)行處理的數(shù)據(jù)傳遞給被調(diào)模塊。數(shù)據(jù)耦合是不可避免的。標(biāo)記耦合:如果調(diào)用模塊將整個數(shù)據(jù)記錄傳遞給被調(diào)模塊,而被調(diào)模塊只使用了部分?jǐn)?shù)據(jù)項,則稱為標(biāo)記耦合或特征耦合??刂岂詈希阂粋€模塊將控制信息傳遞給另一個模塊,以控制被調(diào)模塊的內(nèi)部處理邏輯。(可以分解)公共環(huán)境耦合:如果兩個模塊共享同一全局?jǐn)?shù)據(jù),稱為公共耦合。內(nèi)容耦合:兩個模塊之間的內(nèi)部屬性有直接關(guān)聯(lián),也稱病態(tài)耦合。(某些GOTO語句)松散緊密第四十頁,共105頁。代碼舉例1編寫函數(shù)用于確定某年是否為閏年。FunctionIsLeapYear(yearAsinteger)AsBooleanIfyearMod4<>0or(yearMod100=0andyearMod400<>0)ThenisLeapYear=FalseElseisLeapYear=TrueEndIfEndFunctionSubButton1_Click()ifIsLeapYear(Convert.ToInt(Textbox1.Text))……EndSub第四十一頁,共105頁。代碼舉例2編寫函數(shù)可以實現(xiàn)溫度值從華氏轉(zhuǎn)換為攝氏和從攝氏轉(zhuǎn)換為華氏。//source:需要轉(zhuǎn)換的原始溫度值//isCtoF:設(shè)置轉(zhuǎn)換方式,True表示從攝氏到華氏,//False表示從華氏到攝氏//返回值為轉(zhuǎn)換后的溫度值intChangeTemp(intsource,boolisCtoF){if(isCtoF)return(source*9/5)+32);elsereturn((source-32)*5/9);}參數(shù)isCtoF不用于計算,僅用于控制邏輯(分解)第四十二頁,共105頁。代碼舉例3根據(jù)血常規(guī)分析感冒特征structBlood{WBC//白細(xì)胞

RBC//紅細(xì)胞

HGB//血紅蛋白

PLT//血小板

LYM//淋巴細(xì)胞百分比

……}intDiagCold(structBloodbld){//利用白細(xì)胞、中性粒子百分比、淋巴細(xì)胞百分比三項分析}DiagCold只需要傳入數(shù)據(jù)中的部分內(nèi)容第四十三頁,共105頁。代碼舉例4左邊使用參數(shù),右邊使用全局變量,哪個耦合度更高?structBox{floatlength;floatwidth;floatheight;floatvolume;……}main(){structBoxx;x=InputData();x.volume=CalcVolume(x);PrintData(x);return0;}externstructBoxxmain(){InputData();CalcVolume();PrintData();return0;}voidInputData(){//輸入數(shù)據(jù)到x}voidCalcVolumn(){//利用x計算}voidPrintData(){//打印x各項內(nèi)容}第四十四頁,共105頁。8.2.7模塊的內(nèi)聚doubleCalculateAvg(){intn;doubletotal,average,value; scanf(“inputvalue:”,&value); whilevalue<=0.0 { n=n+1; total=total+value; scanf(“\ninputvalue:”,&value); } average=total/n;return(average);}模塊內(nèi)部各元素(變量、語句)之間存在聯(lián)系第四十五頁,共105頁。內(nèi)聚的好處模塊的內(nèi)聚反映模塊內(nèi)部聯(lián)系的緊密程度。一個模塊只需要做好一件事情,不要過分關(guān)心其它任務(wù)。高內(nèi)聚性的好處是可以提高程序的可靠性。有一個調(diào)查表明,50%的強內(nèi)聚性子程序是沒有錯誤的,而只有18%的弱內(nèi)聚性子程序才是無錯的,弱內(nèi)聚性子程序的出錯機(jī)會要比強內(nèi)聚性出錯機(jī)會高6倍,而修正成本則要高19倍。摘自《代碼大全》第四十六頁,共105頁。內(nèi)聚的類型模塊的內(nèi)聚可以分以下七類:1、偶然內(nèi)聚(coincidentalcohesion)2、邏輯內(nèi)聚(Logicalcohesion)3、時間內(nèi)聚(temporalcohesion)4、步驟內(nèi)聚(proceduralcohesion)5、通信內(nèi)聚(communicationalcohesion)6、順序內(nèi)聚(Sequentialcohesion)7、功能內(nèi)聚(functional_cohesion)第四十七頁,共105頁。當(dāng)同一個子程序中的操作之間無任何聯(lián)系時,為偶然內(nèi)聚性,也叫作“無內(nèi)聚性”。比如只是為了將程序中某幾處湊巧相同的一些語句組合起來形成的一個模塊:PQRS1.偶然內(nèi)聚B=A;read(Cardfile);D=C;T第四十八頁,共105頁。將幾個邏輯上相似的功能放在一個模塊中準(zhǔn)備算平均成績算最高成績返回計算值是取平均成績嗎?否溫度轉(zhuǎn)換函數(shù)(攝氏和華氏溫度的互相轉(zhuǎn)換,if-else語句)常見的出錯處理模塊,工作模塊發(fā)現(xiàn)錯誤后,調(diào)用錯誤處理模塊,將錯誤號作為控制參數(shù)傳入,然后出錯處理模塊根據(jù)不同的錯誤號執(zhí)行相應(yīng)的操作(switch…case分支語句)2.邏輯內(nèi)聚intComputeScore(booltype)第四十九頁,共105頁。3.時間內(nèi)聚將在有限時間單元內(nèi)處理的成分組合為同一模塊比如在窗口load事件過程:

privatevoidAddBook_Load(objectsender,EventArgse){//初始化圖書類別選擇框

cboType.Items.Add("哲學(xué)");cboType.Items.Add("法律");

……//初始化出版社選擇框

Publisherp1=newPublisher();DataTabledt=p1.GetAllPublishers();cboPublisher.DataSource=dt;cboPublisher.DisplayMember="name";cboPublisher.ValueMember="publisherID";}可視化程序設(shè)計中初始化窗口中的缺省選項還比如:C++的構(gòu)造函數(shù)、析構(gòu)函數(shù)第五十頁,共105頁。4.步驟內(nèi)聚當(dāng)子程序中的操作是按某一特定過程結(jié)構(gòu)進(jìn)行的,就是步驟內(nèi)聚。例如:用戶想按一定的順序打印告,子程序設(shè)計成是用于按順序打印銷售收入、開支、雇員電話表的。步驟內(nèi)聚在時間內(nèi)聚的基礎(chǔ)上增加了次序的約束第五十一頁,共105頁。當(dāng)模塊內(nèi)的成分引用共同的數(shù)據(jù),而不存在其他聯(lián)系時,稱為通信內(nèi)聚修改庫存購貨單開發(fā)貨單庫存A、銷售模塊B、產(chǎn)生留退名單模塊期末不及格統(tǒng)計累計不及格統(tǒng)計留退名單學(xué)籍表5.通信內(nèi)聚第五十二頁,共105頁。模塊中某個成分的輸出是另一成分的輸入,順序內(nèi)聚有較強的內(nèi)聚性,是步驟內(nèi)聚和通信內(nèi)聚的結(jié)合。但仍然不是最高的內(nèi)聚類型,包含功能不單一。比如顯示期末成績通知:讀入學(xué)號讀取成績?nèi)〔患案窨颇咳】颇垦a考安排顯示數(shù)據(jù)判斷留退級6.順序內(nèi)聚第五十三頁,共105頁。7.功能內(nèi)聚一個模塊包括并且僅僅包括為完成一個具體任務(wù)所需要的所有成分,稱為功能內(nèi)聚。功能內(nèi)聚性是最強也是最好的一種內(nèi)聚例如:打印職工名單,PrintStaffList()例如:計算平均分,CalculateAvg()僅用一個動賓詞組能明確指出這個模塊的所有功能。第五十四頁,共105頁。內(nèi)聚的評分耦合和內(nèi)聚的概念是Stevens等人提出的,是測量一個模塊化系統(tǒng)好壞的標(biāo)志。按他們的觀點,給上述七種內(nèi)聚評分如下:功能內(nèi)聚10分順序內(nèi)聚9分通信內(nèi)聚7分步驟內(nèi)聚5分時間內(nèi)聚3分邏輯內(nèi)聚1分偶然內(nèi)聚0分可以給一個軟件的所有模塊打分,最后計算平均分,作為軟件結(jié)構(gòu)質(zhì)量評價的參考第五十五頁,共105頁。模塊重構(gòu)例1獲取某個數(shù)并且修改它以作其他用途,比如:voidgetTotalOutstandingAndSetReadyForSummaries()這是一個順序內(nèi)聚的模塊,重構(gòu)后:doublegetTatalOutstanding()voidsetReadyForSummaries(doublex)第五十六頁,共105頁。8.2.8

啟發(fā)規(guī)則

優(yōu)良的軟件模塊化設(shè)計往往能導(dǎo)致程序設(shè)計的高效。軟件模塊化設(shè)計常采用以下優(yōu)化策略:①改進(jìn)軟件結(jié)構(gòu),提高模塊獨立性。②在滿足模塊化要求的前提下盡量減少模塊數(shù)量。③模塊規(guī)模應(yīng)適中,模塊內(nèi)語句數(shù)一般為50~100。④軟件結(jié)構(gòu)的深度、寬度、扇入數(shù)和扇出數(shù)都要適當(dāng)。⑤模塊的作用域應(yīng)該在控制域之內(nèi)。⑥力求降低模塊接口的復(fù)雜程度,設(shè)計單入口、單出口的模塊。第五十七頁,共105頁。

軟件結(jié)構(gòu)表示軟件的系統(tǒng)結(jié)構(gòu),它是軟件模塊間關(guān)系的表示,均表示為層次關(guān)系。軟件結(jié)構(gòu)示意圖頂層1層2層ABCDEFGHIJKLMN深度寬度扇入為2扇出為3扇入為3寬度深度寬度3層4層模塊的扇入與扇出第五十八頁,共105頁。①深度:表示軟件結(jié)構(gòu)中從頂層模塊到最底層模塊的層數(shù);②寬度:表示控制的總分布;③扇出數(shù):指一個模塊直接控制下屬的模塊個數(shù);④扇入數(shù):指一個模塊的直接上屬模塊個數(shù)。平均扇出系數(shù)最好是3~5;一個模塊扇出的上限不超過7;高層模塊高扇出,最低層模塊高扇入;一個好的軟件結(jié)構(gòu)的形態(tài)準(zhǔn)則是:上面尖、中間寬、下面小,像清真寺的塔。有關(guān)指標(biāo)第五十九頁,共105頁。作用域在控制域內(nèi)MACBM的控制域為{M,A,B,C}作用域:A中的一個判定所影響的模塊。例如:A:…………if……thengotoB1……………………B:……………………B1:……………………作用域在控制域內(nèi)A:…………if……thengotoC1……………………C:……………………C1:……………………作用域超出了控制域上例中A的作用超出了控制域。改進(jìn)方法之一,可以把A中的if

移到M中;方法之二,可以把C移到A下面??刂朴颍旱诹?,共105頁。(a)TOPXYAB1B2

B(b)BXYAB1B2TOPTOP(c)XBAB1B2Y

TOP(d)XYAB1B2B作用范圍和控制范圍圖示第六十一頁,共105頁。作用域與控制域示例D計算總工資C計算職工工資B計算臨時工工資A計算工資模塊A的控制范圍是:A、B、C、D假如判定出現(xiàn)在模塊A,該判斷的作用范圍是:A、B、C,但D不受影響

思考:這個例符合結(jié)構(gòu)化設(shè)計規(guī)則嗎?第六十二頁,共105頁。8.3結(jié)構(gòu)化軟件結(jié)構(gòu)設(shè)計方法(structure)轉(zhuǎn)換分析模型(邏輯模型)設(shè)計模型(物理模型)第六十三頁,共105頁。從數(shù)據(jù)流圖導(dǎo)出結(jié)構(gòu)圖8.3.1變換分析(變換型數(shù)據(jù)流圖映射成軟件結(jié)構(gòu)的設(shè)計)8.3.2事務(wù)分析(事務(wù)型數(shù)據(jù)流圖映射成軟件結(jié)構(gòu)的設(shè)計)8.3.3綜合型數(shù)據(jù)流圖映射成軟件結(jié)構(gòu)的設(shè)計8.3.4優(yōu)化設(shè)計第六十四頁,共105頁。轉(zhuǎn)換存在鴻溝數(shù)據(jù)流圖著眼于現(xiàn)實世界,結(jié)構(gòu)圖著眼于計算機(jī)世界。數(shù)據(jù)流圖反映數(shù)據(jù)流,反映系統(tǒng)的邏輯功能,即系統(tǒng)能夠“做什么”;結(jié)構(gòu)圖反映程序控制層次,反映系統(tǒng)的物理模型,即怎樣逐步實現(xiàn)系統(tǒng)的總功能。簡單地說:數(shù)據(jù)流圖描述線性的工作流程,結(jié)構(gòu)圖描述工作的分配(誰負(fù)責(zé)做什么)第六十五頁,共105頁。轉(zhuǎn)換有規(guī)律可循嗎?數(shù)據(jù)流圖中存在兩種典型的結(jié)構(gòu):變換型(Transform)結(jié)構(gòu)事務(wù)型(Transaction)結(jié)構(gòu)。這兩種結(jié)構(gòu)可以分別通過變換分析和事務(wù)分析方法導(dǎo)出標(biāo)準(zhǔn)形式的結(jié)構(gòu)圖。變換分析:用來描述輸入、處理、輸出數(shù)據(jù)流。事務(wù)分析:用來描述多種事務(wù)類型的處理。第六十六頁,共105頁。變換流時間輸入流輸出流變換流外部表示內(nèi)部表示信息變換型數(shù)據(jù)流第六十七頁,共105頁。事務(wù)流……活動通路……………………事務(wù)中心⊕⊕⊕事務(wù)型數(shù)據(jù)流

當(dāng)信息流具有明顯的“發(fā)射中心”時,可歸結(jié)為事務(wù)流。第六十八頁,共105頁。面向數(shù)據(jù)流方法的設(shè)計過程“變換”“事物”精化數(shù)據(jù)流圖流類型區(qū)分事物中心和數(shù)據(jù)接收通路區(qū)分輸入、變換和輸出分支映射成事務(wù)結(jié)構(gòu)映射成變換結(jié)構(gòu)用啟發(fā)式設(shè)計規(guī)則精化軟件結(jié)構(gòu)導(dǎo)出接口描述和全程數(shù)據(jù)結(jié)構(gòu)復(fù)查詳細(xì)設(shè)計變換分析事物分析第六十九頁,共105頁。8.3.1變換分析確定DFD中的變換中心、邏輯輸入和邏輯輸出。系統(tǒng)的變換中心,即主加工。如幾股數(shù)據(jù)流的匯合處往往是系統(tǒng)的主加工。若一下不能確定,則要從物理輸入端開始,沿著數(shù)據(jù)流方向向系統(tǒng)中心尋找,直到有這樣的數(shù)據(jù)流,它不能再被看作是系統(tǒng)的輸入則它的前一個數(shù)據(jù)流就是系統(tǒng)的邏輯輸入。同理,從物理輸出端開始,逆數(shù)據(jù)流方向向中間移動,可以確定系統(tǒng)的邏輯輸出。介于邏輯輸入和邏輯輸出之間的加工就是變換中心,用虛線劃分出流界,DFD的三部分就確定了。第七十頁,共105頁。第1步劃分輸入、加工、輸出原始數(shù)據(jù)機(jī)內(nèi)數(shù)據(jù)正確數(shù)據(jù)解格式化解輸出解邏輯輸出邏輯輸入(物理輸入)(物理輸出)P1讀入數(shù)據(jù)P2編輯數(shù)據(jù)P3求解P4編輯格式P5打印輸出第七十一頁,共105頁。8.3.1

變換分析(續(xù))2.

設(shè)計軟件結(jié)構(gòu)的頂層和第一層——變換結(jié)構(gòu)。變換中心確定以后,就相當(dāng)于決定了主模塊的位置,這就是軟件結(jié)構(gòu)的頂層;其功能是主要完成所有模塊的控制,它的名稱是系統(tǒng)名稱,以體現(xiàn)完成整個系統(tǒng)的功能。

頂層確定之后,設(shè)計軟件結(jié)構(gòu)的第一層。第一層至少要有輸入、輸出和變換三種功能的模塊。為每個邏輯輸入設(shè)計一個輸入模塊,其功能為向頂層模塊提供相應(yīng)的數(shù)據(jù)。為每個邏輯輸出設(shè)計一個輸出模塊,其功能為輸出頂層模塊的信息。為變換中心設(shè)計一個變換模塊,它的功能是將邏輯輸入變換為邏輯輸出。第七十二頁,共105頁。

變換分析設(shè)計舉例第七十三頁,共105頁。8.3.1

變換分析(續(xù))設(shè)計中、下層模塊——對第一層的輸入、變換及輸出模塊自頂向下、逐層分解。輸入模塊的下屬模塊的設(shè)計每個輸入模塊可以設(shè)計成兩個下屬模塊:一個接收,一個轉(zhuǎn)換。用類似的方法一直分解下去,直到物理輸入端。如圖中模塊“getf3”和“getf2”的分解。模塊“getf1”為物理輸入模塊。2)輸出模塊的下屬模塊的設(shè)計每個輸出模塊可以設(shè)計成兩個下屬模塊:一個轉(zhuǎn)換,一個發(fā)送,一直到物理輸出端。如圖中模塊“putf7”,“putf8”和“putf10”的分解。模塊“putf9”和“putf11”為物理輸出模塊。第七十四頁,共105頁。8.3.1

變換分析(續(xù))變換模塊的下屬模塊的設(shè)計根據(jù)DFD變換中心的組成情況,按照模塊獨立性的原則來組織其結(jié)構(gòu),一般對DFD中每個基本加工建立一個功能模塊。如圖中模塊“C”,“D”和“E”。第七十五頁,共105頁。8.3.1

變換分析(續(xù))4.設(shè)計優(yōu)化——以上步驟設(shè)計出的軟件結(jié)構(gòu)僅僅是初始結(jié)構(gòu),還必須根據(jù)設(shè)計準(zhǔn)則對初始結(jié)構(gòu)精細(xì)和改進(jìn)。輸入部分的求精:對每個物理輸入設(shè)置專門模塊,以體現(xiàn)系統(tǒng)的外部接口;其他邏輯輸入模塊并非真正輸入,當(dāng)它與轉(zhuǎn)換數(shù)據(jù)的模塊都很簡單時,可將它們合并成一個。

(2)

輸出部分的求精:為每個物理輸出設(shè)置專門模塊,其他邏輯輸出模塊并非真正輸出,當(dāng)它與轉(zhuǎn)換數(shù)據(jù)的模塊都很簡單時,可將它們合并成一個模塊;同時注意把相同或類似的物理輸出模塊合并在一起,以降低耦合度。(3)

變換部分的求精:根據(jù)設(shè)計準(zhǔn)則,對模塊進(jìn)行合并或調(diào)整。第七十六頁,共105頁。優(yōu)化后的變換分析舉例第七十七頁,共105頁。

總之,軟件結(jié)構(gòu)的求精,帶有很大的經(jīng)驗性。往往形成DFD中的加工與結(jié)構(gòu)圖中的模塊之間是一對一的映射關(guān)系,然后再修改。但對于一個實際問題,可能把DFD中的兩個甚至多個加工組成一個模塊,也可能把DFD中的一個加工擴(kuò)展為兩個或更多個模塊,根據(jù)具體情況要靈活掌握設(shè)計方法,以求設(shè)計出由高內(nèi)聚和低耦合的模塊所組成的、具有良好特性的軟件結(jié)構(gòu)。

8.3.1變換分析(續(xù))第七十八頁,共105頁。變換分析示例例1:汽車數(shù)字儀表板的設(shè)計功能:①通過模-數(shù)轉(zhuǎn)換實現(xiàn)傳感器和微處理機(jī)接口;②在發(fā)光二極管面板上顯示數(shù)據(jù);③指示每小時英里數(shù)(mph),行駛的里程,每加侖油行駛的英里數(shù)(mpg)等等;④指示加速或減速;⑤如果車速超過55mph,則發(fā)出警告鈴聲。第七十九頁,共105頁。變換分析示例——設(shè)計步驟(1)復(fù)查基本系統(tǒng)邏輯模型。(2)確定數(shù)據(jù)流圖具有變換特性還是事務(wù)特性。(3)確定輸入流和輸出流的邊界,從而孤立出變換中心。完成“第一級分解”。完成“第二級分解”。(6)使用啟發(fā)規(guī)則對第一次分割得到的軟件結(jié)構(gòu)進(jìn)一步精化。第八十頁,共105頁。第一步:DFD的分界,先分出I、P、O三塊燃料流傳感器信號SPS旋轉(zhuǎn)信號讀旋轉(zhuǎn)信號收集和求平均確定加/減速轉(zhuǎn)換成轉(zhuǎn)/分計算里程計算mph,超速值產(chǎn)生加/減速顯示計算燃料消耗計算gph讀和校核產(chǎn)生mpg顯示產(chǎn)生mph顯示發(fā)出鈴聲產(chǎn)生里程顯示SPSSPS箭頭指示燃燒流上箭頭水平線下箭頭rpmrpmgphmphmpgmph超速值英里顯示鈴聲mph顯示mpg顯示變換分析示例(續(xù))第八十一頁,共105頁。第一級分解的方法MPIO變換分析示例(續(xù))第八十二頁,共105頁。數(shù)字儀表板系統(tǒng)的第一級分解變換分析示例(續(xù))第八十三頁,共105頁。第二級分解的方法第二步:映射ADCBMICBDA:每個處理直接對應(yīng)一個下層模塊。P:由邊界向回溯,將每個遇到的處理器映成相應(yīng)的層模塊。I:由邊界向外推,方法與類似OI變換分析示例(續(xù))第八十四頁,共105頁。未經(jīng)精化的輸入結(jié)構(gòu)讀燃料流接收傳感器信號計算gal/h轉(zhuǎn)換成r/min收集singal/s讀旋轉(zhuǎn)信號變換分析示例(續(xù))第八十五頁,共105頁。未經(jīng)精化的變換結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換控制確定加/減速計算mile/h計算mile/gal計算里程變換分析示例(續(xù))第八十六頁,共105頁。未經(jīng)精化的輸出結(jié)構(gòu)發(fā)光二極管顯示驅(qū)動儀表板加/減速顯示顯示mile/gal顯示mile/h顯示里程發(fā)出鈴聲變換分析示例(續(xù))第八十七頁,共105頁。變換分析示例(續(xù))

數(shù)字儀表板控制數(shù)據(jù)轉(zhuǎn)換控制驅(qū)動儀表板接收傳感器信號計算gph讀燃料流轉(zhuǎn)換成rpm收集sps讀旋轉(zhuǎn)信號確定加/減速計算mph計算mpg計算里程加/減速顯示顯示mpg顯示mph顯示里程發(fā)出鈴聲發(fā)光二極管顯示未經(jīng)精化的輸出結(jié)構(gòu)第八十八頁,共105頁。第三步:優(yōu)化——本著高內(nèi)聚、低耦合的原則。輸入結(jié)構(gòu)中的模塊“轉(zhuǎn)換成rpm”和“收集sps”可以合并。變換結(jié)構(gòu)中的模塊“確定加速/減速”可以放在模塊“計算mph”下面,以減少耦合。輸出結(jié)構(gòu)中的模塊“加速/減速顯示”可以相應(yīng)地放在模塊“顯示mph”的下面。變換分析示例(續(xù))第八十九頁,共105頁。精化后的數(shù)字儀表板系統(tǒng)的軟件結(jié)構(gòu)數(shù)字儀表板控制數(shù)據(jù)轉(zhuǎn)換控制驅(qū)動儀表板接收傳感器信號計算gal/h讀燃料流轉(zhuǎn)換成r/min讀旋轉(zhuǎn)信號確定加/減速計算mile/h計算mile/gal計算里程加/減速顯示顯示mile/h顯示mile/gal顯示里程發(fā)出鈴聲發(fā)光二極管顯示變換分析示例(續(xù))第九十頁,共105頁。

上述設(shè)計步驟的目的是,開發(fā)出軟件的整體表示。也就是說,一旦確定了軟件結(jié)構(gòu)就可以把它作為一個整體來復(fù)查,從而能夠評價和精化軟件結(jié)構(gòu)。在這個時期進(jìn)行修改只需要很少的附加工作,但是卻能夠?qū)浖馁|(zhì)量特別是軟件的可維護(hù)性產(chǎn)生深遠(yuǎn)的影響。變換分析示例——總結(jié)第九十一頁,共105頁。思考題試根據(jù)下面的數(shù)據(jù)流圖,畫出“工資處理”子系統(tǒng)的結(jié)構(gòu)圖。第九十二頁,共105頁。思考題(續(xù))第九十三頁,共105頁。8.3.2事務(wù)分析MIIISABC………IIISBAC………接收通路調(diào)度第九十四頁,共105頁。8.3.2

溫馨提示

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

最新文檔

評論

0/150

提交評論