




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章結(jié)構(gòu)化軟件設(shè)計(jì)6學(xué)時(shí)引言—
設(shè)計(jì)人員把分析的結(jié)果設(shè)計(jì)圖紙
程序員拿著設(shè)計(jì)圖紙編寫代碼名字:讀者信息編號(hào):DS01描述:記錄讀者的基本信息定義:讀者信息=姓名+單位+讀者類型+職稱+電話位置:數(shù)據(jù)庫(kù)的讀者信息表輸入處理說明輸出讀者輸入讀者DS102備注:需求規(guī)格說明書概要設(shè)計(jì)設(shè)計(jì)圖紙-軟件結(jié)構(gòu)圖模塊4設(shè)計(jì)詳細(xì)設(shè)計(jì)需求分析成果第4章結(jié)構(gòu)化軟件設(shè)計(jì)1)結(jié)構(gòu)化設(shè)計(jì)的基本概念2)方法和步驟2)詳細(xì)設(shè)計(jì)的方法。3)軟件設(shè)計(jì)的原則。4)影響軟件設(shè)計(jì)的主要因素。掌握掌握
掌握理解了解要求通過軟件設(shè)計(jì)將用戶的需求變?yōu)閷?shí)現(xiàn)軟件的“藍(lán)圖”。藍(lán)圖只描述軟件的整體框架,也叫做概要設(shè)計(jì)。概要設(shè)計(jì)之后,就要對(duì)軟件進(jìn)行詳細(xì)設(shè)計(jì),通過對(duì)軟件設(shè)計(jì)的不斷細(xì)化,形成一個(gè)可以實(shí)施的設(shè)計(jì)方案。軟件設(shè)計(jì)的最終目標(biāo)是要取得最佳方案?!白罴选笔侵冈谒泻蜻x方案中,能夠以最低的成本,在最短的時(shí)間內(nèi),生產(chǎn)出可靠性和可維護(hù)性俱佳軟件的方案。4.1軟件設(shè)計(jì)的概念4.1.1模塊和模塊化一般把用一個(gè)名字就可調(diào)用的一段程序稱為“模塊”。模塊具有如下三個(gè)基本屬性。功能:指該模塊要完成的任務(wù)。邏輯:模塊內(nèi)部執(zhí)行過程。狀態(tài):使用該模塊時(shí)的環(huán)境和條件。4.1.1模塊和模塊化(續(xù))把整個(gè)系統(tǒng)劃分成若干個(gè)模塊,每個(gè)模塊完成一個(gè)子功能,將多個(gè)模塊組織起來實(shí)現(xiàn)整個(gè)系統(tǒng)的功能。模塊化設(shè)計(jì)方法強(qiáng)調(diào)清楚地定義每個(gè)模塊的功能和它的輸入/輸出參數(shù),而模塊的實(shí)現(xiàn)細(xì)節(jié)隱藏在各自的模塊之中,與其它模塊之間的關(guān)系可以是調(diào)用關(guān)系,因此模塊化程序易于調(diào)試和修改。隨著模塊規(guī)模的減小,模塊的開發(fā)成本減少,但是模塊之間的接口變得復(fù)雜起來,使得模塊的集成成本增加。4.1.2內(nèi)聚和耦合在軟件設(shè)計(jì)中應(yīng)該保持模塊的獨(dú)立性原則。反映模塊獨(dú)立性的有兩個(gè)標(biāo)準(zhǔn):內(nèi)聚和耦合。內(nèi)聚衡量一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度耦合衡量模塊之間彼此依賴的程度。4.1.2內(nèi)聚和耦合(續(xù))模塊間相互關(guān)聯(lián)的程度取決于下面幾點(diǎn):一個(gè)模塊對(duì)另一個(gè)模塊的訪問,比如模塊A可能要調(diào)用模塊B來完成一個(gè)功能。模塊間傳遞的數(shù)據(jù)量。模塊間接口的復(fù)雜程度。GreatdealofdependenceIndependent
HighlycoupledLooselycoupledUncoupled7種耦合的獨(dú)立性4.1.2內(nèi)聚和耦合(續(xù))內(nèi)容耦合:如果一個(gè)模塊直接引用另一個(gè)模塊的內(nèi)容。例1:A訪問C的內(nèi)部數(shù)據(jù)或不通過正常入口而轉(zhuǎn)入C的內(nèi)部?!瑼BCDA:……………………gotoC1……………………C:……………………C1:…………公共耦合——多個(gè)模塊都訪問同一個(gè)公共數(shù)據(jù)環(huán)境,則稱它們是公共耦合。
問題:公共部分的改動(dòng)將影響所有調(diào)用它的模塊;公共部分的數(shù)據(jù)存取無法控制;復(fù)雜程度隨耦合模塊的個(gè)數(shù)增加而增加Global:V1,V2A:A1=V1+V2…………B:V1=B1…………Global:V1,V2A:V1++…………B:V2=B1+V1…………控制耦合——模塊A向模塊B傳遞一個(gè)控制信息,稱這兩個(gè)模塊是控制耦合的。B模塊的具體功能取決于控制信息FlagABFlagF2F1Fn…………Flag數(shù)據(jù)耦合——如果兩個(gè)模塊傳遞的是數(shù)據(jù)項(xiàng),則這兩個(gè)模塊是數(shù)據(jù)耦合。A模塊B模塊參數(shù)內(nèi)聚:模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度7種內(nèi)聚的獨(dú)立性功能內(nèi)聚:一個(gè)模塊中各個(gè)部分都是完成某一具體功能必不可少的組成部分,或者說該模塊中所有部分都是為了完成一項(xiàng)具體功能而協(xié)同工作,緊密聯(lián)系,不可分割的。則稱該模塊為功能內(nèi)聚模塊。內(nèi)聚和耦合(續(xù))順序內(nèi)聚——如果一個(gè)模塊中的處理元素和同一個(gè)功能密切相關(guān),并且這些處理必須是順序執(zhí)行的,那么這個(gè)模塊具有順序內(nèi)聚。內(nèi)聚和耦合(續(xù))通信內(nèi)聚:一個(gè)模塊內(nèi)各功能部分都針對(duì)相同輸入/輸出數(shù)據(jù)進(jìn)行處理。內(nèi)聚和耦合(續(xù))過程內(nèi)聚:模塊執(zhí)行的若干動(dòng)作,相互關(guān)聯(lián)并且有順序關(guān)系。例如,從錄入界面讀取數(shù)據(jù),然后更新數(shù)據(jù)庫(kù)記錄。它仍然是將多個(gè)相關(guān)的功能放在一個(gè)模塊中實(shí)現(xiàn)。內(nèi)聚和耦合(續(xù))時(shí)間內(nèi)聚:模塊的各個(gè)功能的執(zhí)行與時(shí)間有關(guān),通常要求所有功能必須在同一時(shí)間段內(nèi)執(zhí)行。例如初始化模塊和終止模塊。內(nèi)聚和耦合(續(xù))邏輯內(nèi)聚:一個(gè)模塊完成的任務(wù)在邏輯上相同/相似。A:讀磁盤讀磁帶讀光盤fromdiskfromtapefrom……內(nèi)聚和耦合(續(xù))巧合內(nèi)聚又稱為偶然內(nèi)聚。當(dāng)模塊內(nèi)各部分之間沒有聯(lián)系,或者即使有聯(lián)系,這種聯(lián)系也很松散。內(nèi)聚和耦合(續(xù))4.1.3抽象所謂抽象就是將事務(wù)的相似方面集中和概括起來,暫時(shí)忽略它們之間的差異?;蛘哒f,抽象就是抽出事務(wù)的本質(zhì)特性而暫時(shí)不考慮它們的細(xì)節(jié)。在最高的抽象層次上,用自然語(yǔ)言,配合面向問題的專業(yè)術(shù)語(yǔ),概括地描述問題的解法。在中間的抽象層次上,采用過程化的描述方法。在最底層,使用能夠直接實(shí)現(xiàn)的方式來描述問題的解。4.1.4信息隱藏核心內(nèi)容是:一個(gè)模塊中所包含的信息,不允許其他不需要這些信息的模塊訪問。模塊化可以通過定義一組相互獨(dú)立的模塊來實(shí)現(xiàn),這些獨(dú)立的模塊彼此間僅僅交換那些為完成相應(yīng)功能而必須交換的信息。信息隱蔽對(duì)模塊的過程細(xì)節(jié)和局部數(shù)據(jù)結(jié)構(gòu)進(jìn)行了屏蔽。在設(shè)計(jì)模塊時(shí)采取信息隱藏,使得大多數(shù)處理細(xì)節(jié)對(duì)軟件的其他部分是隱蔽的。在將來修改軟件時(shí)偶然引入錯(cuò)誤所造成的影響就可以局限在一個(gè)或幾個(gè)模塊內(nèi)部,不至于波及到軟件其他部分。4.1.5軟件結(jié)構(gòu)圖Yourdon提出的軟件結(jié)構(gòu)圖非常適合表示軟件的結(jié)構(gòu)。圖中的每個(gè)方框代表一個(gè)模塊,框內(nèi)注明模塊的名稱、主要功能,方框之間的箭頭線表示模塊間的調(diào)用關(guān)系。結(jié)構(gòu)圖中還可以標(biāo)注模塊之間傳遞的數(shù)據(jù)和控制信息。結(jié)構(gòu)圖說明模塊的名字應(yīng)當(dāng)能夠反映該模塊的功能,如:查詢。模塊的調(diào)用關(guān)系和接口:兩個(gè)模塊之間用單向箭頭連接。箭頭從調(diào)用模塊指向被調(diào)用模塊,當(dāng)被調(diào)用模塊執(zhí)行結(jié)束后,控制又返回到調(diào)用模塊。模塊間的信息傳遞:當(dāng)一個(gè)模塊調(diào)用另一個(gè)模塊時(shí),調(diào)用模塊把數(shù)據(jù)或控制信息傳送給被調(diào)用模塊,以使被調(diào)用模塊能夠運(yùn)行。被調(diào)用模塊執(zhí)行過程中又把它產(chǎn)生的數(shù)據(jù)或控制信息回送給調(diào)用模塊。為了區(qū)別在模塊之間傳遞的是數(shù)據(jù)還是控制信息,用表示數(shù)據(jù)信息,用表示控制信息。通常在短箭頭附近注有信息的名字。結(jié)構(gòu)圖說明(續(xù))兩個(gè)輔助符號(hào):用符號(hào)◆表示一個(gè)模塊有條件地調(diào)用另一個(gè)模塊;用符號(hào)表示模塊循環(huán)調(diào)用它的各下屬模塊。圖中模塊A下加一個(gè)菱形表示控制模塊A按條件選擇調(diào)用模塊B、模塊C、模塊D。結(jié)構(gòu)圖說明(續(xù))結(jié)構(gòu)圖的形態(tài)特征:上層模塊調(diào)用下層模塊,模塊自上而下“主宰”,自下而上“從屬”。同一層的模塊之間并沒有這種主從關(guān)系。結(jié)構(gòu)圖的深度:在多層次的結(jié)構(gòu)圖中,模塊結(jié)構(gòu)的層數(shù)稱為該結(jié)構(gòu)圖的深度。下面結(jié)構(gòu)圖的深度為7。結(jié)構(gòu)圖的深度在一定意義上反映了程序結(jié)構(gòu)的規(guī)模和復(fù)雜程度。對(duì)于中等規(guī)模的程序,結(jié)構(gòu)圖的深度約為10左右。對(duì)于一個(gè)大型程序,深度可以有幾十層。結(jié)構(gòu)圖的寬度:結(jié)構(gòu)圖中模塊數(shù)最多的那層的模塊個(gè)數(shù)稱為結(jié)構(gòu)圖的寬度,下圖的寬度為6。結(jié)構(gòu)圖說明(續(xù))模塊的扇入和扇出:扇出表示一個(gè)模塊直接調(diào)用的其他模塊數(shù)目。扇入則定義為調(diào)用一個(gè)給定模塊的模塊個(gè)數(shù)。多扇出意味著需要控制和協(xié)調(diào)許多下屬模塊。而多扇入的模塊通常是公用模塊。4.2軟件設(shè)計(jì)原則和影響設(shè)計(jì)的因素設(shè)計(jì)可回溯到需求。軟件設(shè)計(jì)中的每個(gè)元素都可以對(duì)應(yīng)到需求,保證設(shè)計(jì)使用戶需要的。充分利用已有的模塊。一個(gè)復(fù)雜的軟件通常是由一系列模塊組成,很多模塊可能在以前的系統(tǒng)中已經(jīng)開發(fā)過了,如果這些模塊設(shè)計(jì)得好,具有良好的可復(fù)用性,那么在設(shè)計(jì)新軟件時(shí)應(yīng)該盡可能使用已有的模塊。軟件模塊之間應(yīng)該遵循高內(nèi)聚、低耦合和信息隱藏的設(shè)計(jì)原則。設(shè)計(jì)應(yīng)該表現(xiàn)出一致性和規(guī)范性。在設(shè)計(jì)開始之前,設(shè)計(jì)小組應(yīng)該定義設(shè)計(jì)風(fēng)格和設(shè)計(jì)規(guī)范,保證不同的設(shè)計(jì)人員設(shè)計(jì)出風(fēng)格一致的軟件。軟件設(shè)計(jì)原則和影響設(shè)計(jì)的因素(續(xù))容錯(cuò)性設(shè)計(jì)。不管多么完善的軟件都可能有潛在的問題,所以設(shè)計(jì)人員應(yīng)該為軟件進(jìn)行容錯(cuò)性設(shè)計(jì),當(dāng)軟件遇到異常數(shù)據(jù)、事件或操作時(shí),軟件不至于徹底崩潰。設(shè)計(jì)的粒度要適當(dāng)。設(shè)計(jì)不是編碼,即使在詳細(xì)設(shè)計(jì)階段,設(shè)計(jì)模型的抽象級(jí)別也比源代碼要高,它涉及的是模塊內(nèi)部的實(shí)現(xiàn)算法和數(shù)據(jù)結(jié)構(gòu)。因此,不要用具體的程序代碼取代設(shè)計(jì)。在設(shè)計(jì)時(shí)就要開始評(píng)估軟件的質(zhì)量。軟件的質(zhì)量屬性需要在設(shè)計(jì)時(shí)考慮如何實(shí)現(xiàn),不要等全部設(shè)計(jì)結(jié)束之后再考慮軟件的質(zhì)量。軟件設(shè)計(jì)原則和影響設(shè)計(jì)的因素(續(xù))由多人共同設(shè)計(jì)一個(gè)軟件時(shí)的協(xié)調(diào)問題;設(shè)計(jì)人員的設(shè)計(jì)經(jīng)驗(yàn)、理解力和喜好的差別;一致的設(shè)計(jì)規(guī)范約束;設(shè)計(jì)者的文化背景、信仰、價(jià)值觀等其他方面的問題,這些都是影響軟件設(shè)計(jì)的因素。4.3結(jié)構(gòu)化設(shè)計(jì)方法結(jié)構(gòu)化設(shè)計(jì)方法通常也叫做面向數(shù)據(jù)流的設(shè)計(jì)或面向過程的設(shè)計(jì)。結(jié)構(gòu)化設(shè)計(jì)是基于模塊化的、自頂向下、逐步求精等技術(shù)基礎(chǔ)上的設(shè)計(jì)方法。結(jié)構(gòu)化設(shè)計(jì)與結(jié)構(gòu)化分析和結(jié)構(gòu)化編程方法前后呼應(yīng),形成了統(tǒng)一、完整的系列化方法。結(jié)構(gòu)化設(shè)計(jì)方法以需求分析階段獲得的數(shù)據(jù)流程圖為基礎(chǔ),通過一系列映射,把數(shù)據(jù)流程圖變換為軟件結(jié)構(gòu)圖。結(jié)構(gòu)化設(shè)計(jì)方法4步驟1)分析數(shù)據(jù)流的類型。數(shù)據(jù)流的類型有變換型和事務(wù)型兩種,不同類型的數(shù)據(jù)流程圖映射的軟件結(jié)構(gòu)有所不同。2)將數(shù)據(jù)流程圖映射為程序結(jié)構(gòu)圖。3)優(yōu)化設(shè)計(jì)結(jié)構(gòu)。4)評(píng)審軟件結(jié)構(gòu)。變換型數(shù)據(jù)流在變換型的數(shù)據(jù)流程圖上劃分邏輯輸入、中心變換、邏輯輸出的邊界;變換型數(shù)據(jù)流程軟件結(jié)構(gòu)圖1)重畫數(shù)據(jù)流程圖,重畫數(shù)據(jù)流程圖應(yīng)注意以下幾個(gè)要點(diǎn):從物理輸入到物理輸出。當(dāng)數(shù)據(jù)流進(jìn)入和離開一個(gè)處理時(shí),要仔細(xì)地標(biāo)記它們,不要重名。數(shù)據(jù)流程圖中的數(shù)據(jù)存儲(chǔ)先略去,造成的數(shù)據(jù)開鏈視為數(shù)據(jù)的物理輸入或輸出。2)在數(shù)據(jù)流程圖上區(qū)分系統(tǒng)的邏輯輸入、邏輯輸出和中心變換部分。從數(shù)據(jù)流程圖的物理輸入端開始,向系統(tǒng)的中間移動(dòng),一直到某個(gè)數(shù)據(jù)流不再被看作是系統(tǒng)的輸入為止,這個(gè)數(shù)據(jù)流的前一個(gè)數(shù)據(jù)流就是系統(tǒng)的邏輯輸入。從物理輸入端到邏輯輸入,構(gòu)成軟件的輸入部分。同理從物理輸出端開始,向系統(tǒng)的中間移動(dòng),就可以找到軟件的邏輯輸出。在輸入部分和輸出部分之間的就是中心變換部分。
3)設(shè)計(jì)軟件結(jié)構(gòu)的頂層和第1層。設(shè)計(jì)一個(gè)主模塊,并用系統(tǒng)的名字為它命名,做為系統(tǒng)的頂層。第1層:為每個(gè)邏輯輸入設(shè)計(jì)一個(gè)輸入模塊,它的功能是為主模塊提供數(shù)據(jù);為每一個(gè)邏輯輸出設(shè)計(jì)一個(gè)輸出模塊,它的功能是將主模塊提供的數(shù)據(jù)輸出;為中心變換設(shè)計(jì)一個(gè)變換模塊,它的功能是將邏輯輸入轉(zhuǎn)換成邏輯輸出。主模塊控制和協(xié)調(diào)第1層的輸入模塊、變換模塊和輸出模塊的工作。4)設(shè)計(jì)軟件結(jié)構(gòu)的下層結(jié)構(gòu)。每個(gè)邏輯輸入模塊有兩個(gè)下屬模塊:一個(gè)接收數(shù)據(jù);另一個(gè)把數(shù)據(jù)變換成上級(jí)模塊所需要的數(shù)據(jù)格式。而接收數(shù)據(jù)模塊又是輸入模塊,又要重復(fù)上述工作。如此循環(huán)下去,直到輸入模塊已經(jīng)涉及到物理輸入端為止。同樣,每個(gè)邏輯輸出模塊有兩個(gè)下屬模塊:一個(gè)是將上級(jí)模塊提供的數(shù)據(jù)變換成輸出的形式;另一個(gè)是將它們輸出。對(duì)于每一個(gè)邏輯輸出,在數(shù)據(jù)流程圖上向物理輸出端方向移動(dòng),遇到物理輸出為止。設(shè)計(jì)中心變換模塊的下層模塊沒有通用的方法,一般應(yīng)參照數(shù)據(jù)流程圖的中心變換部分和功能分解的原則來考慮如何對(duì)中心變換模塊進(jìn)行分解。轉(zhuǎn)換后的初始軟件結(jié)構(gòu)圖事務(wù)型數(shù)據(jù)流在事務(wù)型流程圖上劃分接收分支和發(fā)送分支的邊界,見右圖。注意:兩種類型的數(shù)據(jù)流有時(shí)會(huì)同時(shí)出現(xiàn)在一個(gè)流程圖中,例如右圖中的路徑L是變換型數(shù)據(jù)流。事務(wù)型數(shù)據(jù)流程軟件結(jié)構(gòu)圖1)重畫數(shù)據(jù)流程圖,重畫數(shù)據(jù)流程圖應(yīng)注意以下幾個(gè)要點(diǎn):從物理輸入到物理輸出。當(dāng)數(shù)據(jù)流進(jìn)入和離開一個(gè)處理時(shí),要仔細(xì)地標(biāo)記它們,不要重名。數(shù)據(jù)流程圖中的數(shù)據(jù)存儲(chǔ)先略去,造成的數(shù)據(jù)開鏈視為數(shù)據(jù)的物理輸入或輸出。2)標(biāo)識(shí)事務(wù)中心、事務(wù)接收路徑和事務(wù)處理路徑。通常事務(wù)中心位于幾條處理路徑的起點(diǎn),從數(shù)據(jù)流程圖上很容易標(biāo)識(shí)出來,因?yàn)槭聞?wù)處理中心一般會(huì)有“發(fā)射中心”的特征。例如,上圖中的“判斷命令”處理就是一個(gè)事務(wù)中心,它有三條發(fā)射路徑。事務(wù)中心前面的部分叫做接收路徑,發(fā)射中心后面各條發(fā)散路徑叫做事務(wù)處理路徑。對(duì)于每條處理路徑來講,還應(yīng)該確定它們自己的流特征。3)設(shè)計(jì)軟件結(jié)構(gòu)的頂層和第1層。軟件結(jié)構(gòu)圖的頂層是系統(tǒng)的事務(wù)控制模塊。第1層是由事務(wù)流輸入分支和事務(wù)分類處理分支映射得到的程序結(jié)構(gòu)。也就是說,第1層通常是由兩部分組成:取得事務(wù)和處理事務(wù)。4)設(shè)計(jì)軟件結(jié)構(gòu)的下層結(jié)構(gòu)。設(shè)計(jì)事務(wù)流輸入分支的方法與變換分析中輸入流的設(shè)計(jì)方法類似,從事務(wù)中心變換開始,沿輸入路徑向物理輸入端移動(dòng)。每個(gè)接收數(shù)據(jù)模塊的功能是向調(diào)用它的上級(jí)模塊提供數(shù)據(jù),它需要有兩個(gè)下屬模塊:一個(gè)接收數(shù)據(jù);另一個(gè)把這些數(shù)據(jù)變換成它的上級(jí)模塊所需要的數(shù)據(jù)格式。接收數(shù)據(jù)模塊又是輸入模塊,也要重復(fù)上述工作。如此循環(huán)下去,直到輸入模塊已經(jīng)涉及到物理輸入端為止。事務(wù)處理分支結(jié)構(gòu)映射成一個(gè)分類控制模塊,它控制下層的處理模塊。對(duì)每個(gè)事務(wù)建立一個(gè)事務(wù)處理模塊。如果發(fā)現(xiàn)在系統(tǒng)中有類似的事務(wù),就可以把這些類似的事務(wù)組織成一個(gè)公共事務(wù)處理模塊。但是,如果組合后的模塊是低內(nèi)聚的,則應(yīng)該重新考慮組合問題。轉(zhuǎn)換后的初始軟件結(jié)構(gòu)圖4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)
數(shù)據(jù)流程圖轉(zhuǎn)換為軟件結(jié)構(gòu)圖,應(yīng)該對(duì)軟件結(jié)構(gòu)圖進(jìn)行優(yōu)化。使其符合高內(nèi)聚低耦合的、模塊化、信息隱藏的原則。4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))規(guī)則一:模塊功能完善化。一個(gè)完整的功能模塊,不僅能夠完成指定的功能,而且還應(yīng)當(dāng)能夠向調(diào)用者返回完成任務(wù)的狀態(tài),以及失敗的原因。因此要求功能模塊除了應(yīng)該執(zhí)行規(guī)定的功能外,還應(yīng)該具有出錯(cuò)處理的內(nèi)容,當(dāng)模塊不能完成規(guī)定的功能時(shí),必須回送出錯(cuò)標(biāo)志,向它的調(diào)用者報(bào)告失敗的原因。如果模塊正確結(jié)束,應(yīng)該返回正確結(jié)束的標(biāo)志。上述所有內(nèi)容,都應(yīng)當(dāng)看做是一個(gè)模塊的有機(jī)組成部分,不應(yīng)分離到其他模塊中去,否則將會(huì)增大模塊間的耦合程度。4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))規(guī)則二:設(shè)計(jì)功能單一和結(jié)果可預(yù)測(cè)的模塊。一個(gè)功能單一和結(jié)果可預(yù)測(cè)的模塊可以被看成是一個(gè)“黑箱”,不論內(nèi)部處理細(xì)節(jié)如何,對(duì)于相同的輸入數(shù)據(jù),總能產(chǎn)生同樣的結(jié)果。但是,如果模塊內(nèi)部蘊(yùn)藏有一些特殊的鮮為人知的功能時(shí),其模塊的結(jié)果可能無法預(yù)測(cè)。例如,如果在模塊內(nèi)部有一個(gè)局部控制變量M,在運(yùn)行過程中模塊的處理由這個(gè)控制變量確定,由于這個(gè)局部控制變量對(duì)于調(diào)用模塊來說是隱蔽的,所以調(diào)用模塊無法控制這個(gè)模塊的執(zhí)行,也不能預(yù)知將會(huì)引起什么后果,有可能造成混亂。4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))規(guī)則三:消除重復(fù)功能,改善軟件結(jié)構(gòu)。應(yīng)當(dāng)認(rèn)真審查初始的軟件結(jié)構(gòu)圖,如果發(fā)現(xiàn)幾個(gè)模塊的功能有相似之處,應(yīng)該加以改進(jìn)。例如,當(dāng)兩個(gè)模塊的功能完全相似,而只是所處理的數(shù)據(jù)類型不一致時(shí),應(yīng)該合并模塊,同時(shí)修改模塊的數(shù)據(jù)類型和變量定義。但是,如果兩個(gè)模塊的功能只是局部相似時(shí),最好不要簡(jiǎn)單地合二為一,因?yàn)檫@種簡(jiǎn)單的并后會(huì)造成模塊內(nèi)部設(shè)置許多判斷開關(guān),模塊的接口參數(shù)勢(shì)必會(huì)傳遞一些控制信息,造成模塊內(nèi)聚降低。通常的處理辦法是分析兩個(gè)相似的模塊,找出相同的部分,然后將相同的部分從分離出去組成一個(gè)新的模塊。
4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))規(guī)則四:模塊的作用范圍應(yīng)在控制范圍之內(nèi)。首先定義一個(gè)模塊的控制范圍是:是這個(gè)模塊及其所有下屬模塊。例如圖中模塊E的控制范圍是I、H、J。一個(gè)模塊的作用范圍是:這個(gè)模塊內(nèi)判定的作用范圍,凡是受這個(gè)判定影響的模塊都屬于這個(gè)判定的作用范圍。例如圖中模塊J的一個(gè)判定傳遞給E模塊,然后再傳遞給I和H模塊,這時(shí)模塊J的作用范圍是模塊E、I、J。顯然,這種設(shè)計(jì)是不好的,因?yàn)槟KI和H不是模塊J的控制范圍,這樣就導(dǎo)致模塊之間傳遞的是控制參數(shù),使模塊之間的耦合增加。
J4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))如果在設(shè)計(jì)過程中,發(fā)現(xiàn)作用范圍不在控制范圍內(nèi),可采用如下辦法把作用范圍移到控制范圍之內(nèi):1)提高控制模塊的層次。將判定所在模塊合并到父模塊中,使判定處于較高層次。2)將受判定影響的模塊下移到控制范圍內(nèi);3)將判定上移到層次中較高的位置。但是要注意,判定所在的模塊最好不要太高,模塊之間的控制參數(shù)傳遞路徑太長(zhǎng),增加了模塊之間的耦合。比較好的方案是將判定提到模塊E中。4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))規(guī)則五:模塊的大小要適中。模塊的大小一般用模塊的源代碼數(shù)量來衡量,通常在設(shè)計(jì)過程中,將模塊的源代碼數(shù)量限制在50~100左右,即一頁(yè)紙的范圍內(nèi),這樣閱讀比較方便。實(shí)際上,規(guī)模大的模塊往往是由于分解不充分造成的,應(yīng)該對(duì)其進(jìn)一步分解,生成一些下級(jí)模塊或同層模塊。有些模塊規(guī)模非常小,這種情況下要區(qū)別對(duì)待,如果該模塊是公共模塊或者是高內(nèi)聚模塊,則一定不要把它合并到其他模塊中去;否則可以考慮將規(guī)模很小的模塊合并到其它相關(guān)的模塊中。
4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))規(guī)則六:盡可能減少高扇出和高扇入的結(jié)構(gòu)。規(guī)則七:將模塊中相對(duì)變化較大的部分剝離出去。為了加強(qiáng)模塊的可復(fù)用性,在設(shè)計(jì)時(shí)將模塊中相對(duì)穩(wěn)定的部分與可能變化的部分分離,在分離的兩個(gè)模塊之間加一個(gè)接口模塊對(duì)模塊之間傳遞的參數(shù)進(jìn)行整理,這對(duì)保持模塊的穩(wěn)定性和可重用性有很大作用。4.4優(yōu)化軟件結(jié)構(gòu)設(shè)計(jì)(續(xù))對(duì)于有時(shí)間要求的軟件結(jié)構(gòu),在整個(gè)設(shè)計(jì)階段和編碼階段都必須進(jìn)行優(yōu)化,優(yōu)化的方法如下:首先改進(jìn)軟件的結(jié)構(gòu)。在詳細(xì)設(shè)計(jì)時(shí),挑出那些有可能占用過多時(shí)間的模塊,為這些模塊精心設(shè)計(jì)時(shí)間效率更高的處理算法。檢測(cè)軟件,分離出占用大量處理機(jī)資源的模塊。如果有必要,用匯編語(yǔ)言或其它較低級(jí)的語(yǔ)言重新設(shè)計(jì)、編碼,以提高軟件的效率。4.5圖書館圖書信息管理系統(tǒng)設(shè)計(jì)案例仔細(xì)研究這些數(shù)據(jù)流程圖,發(fā)現(xiàn)一個(gè)圖書管理信息系統(tǒng)可以分為五個(gè)子系統(tǒng)設(shè)計(jì),它們是讀者信息管理子系統(tǒng)、借書子系統(tǒng)、還書子系統(tǒng)、采編子系統(tǒng)和系統(tǒng)維護(hù)子系統(tǒng)。將一個(gè)復(fù)雜的系統(tǒng)劃分為多個(gè)簡(jiǎn)單的子系統(tǒng),有利于系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)。進(jìn)入設(shè)計(jì)階段后,要從軟件設(shè)計(jì)的角度重審數(shù)據(jù)流程圖。首先應(yīng)該為流通組設(shè)計(jì)一個(gè)方便的工作環(huán)境,在這個(gè)工作環(huán)境之中包含了流通組日常要做的所有工作,應(yīng)該增加一個(gè)“還書工作環(huán)境”的處理,編號(hào)IPO320。“還書工作環(huán)境”處理之后應(yīng)該是流通組門的業(yè)務(wù)分發(fā)處理,所以增加一個(gè)“事物分發(fā)”處理,編號(hào)為IPO321。在處理完某個(gè)具體的還書業(yè)務(wù)之后,有可能導(dǎo)致“通知預(yù)約”處理的執(zhí)行,而“催還”和“通知預(yù)約”兩個(gè)處理之中都隱含了一個(gè)共同的處理“發(fā)送郵件”,因此,應(yīng)該將具有相同功能的處理獨(dú)立成為一個(gè)“發(fā)送郵件”的處理,編號(hào)為IPO324。
在重畫數(shù)據(jù)流程圖時(shí)發(fā)現(xiàn),處罰操作屬于性質(zhì)相同的處理,應(yīng)該將它們歸并在一起。每種處罰的規(guī)則和處理不同,增加了一個(gè)“處罰事物分發(fā)”處理,判斷不同的處罰類型,每種處罰處理的用戶界面不同,為三種處罰類型設(shè)計(jì)不同的用戶界面。最終的處罰結(jié)果是保存在一個(gè)數(shù)據(jù)庫(kù)表中,因此調(diào)用同一個(gè)“保存處罰記錄”處理。在整個(gè)處罰的處理部分,基本上是按照邏輯輸入、處理、邏輯輸出劃分的。另外增加了兩個(gè)界面處理,這是為了將用戶界面與業(yè)務(wù)處理分開來設(shè)計(jì)和實(shí)現(xiàn),便于系統(tǒng)的維護(hù)和修改。下面是修改后的數(shù)據(jù)流程圖:
還書數(shù)據(jù)流程圖還書子系統(tǒng)結(jié)構(gòu)圖走查軟件結(jié)構(gòu)圖
軟件結(jié)構(gòu)圖中的模塊關(guān)系體現(xiàn)的是調(diào)用關(guān)系,模塊之間的接口參數(shù)在軟件結(jié)構(gòu)圖上表現(xiàn)出來。設(shè)計(jì)者根據(jù)調(diào)用關(guān)系在紙上對(duì)系統(tǒng)進(jìn)行初步的試運(yùn)行,方法是從軟件結(jié)構(gòu)圖的最頂層按深度優(yōu)先原則調(diào)用下級(jí)模塊,直到圖的最底層。在紙上試運(yùn)行過程中,填寫一張功能模塊對(duì)照表。
數(shù)據(jù)結(jié)構(gòu)與程序模塊對(duì)照表軟件功能需求與程序模塊對(duì)照表功能模塊1模塊2……模塊n功能需求1ModulenameModulename功能需求2ModulenameModulename……功能需求nModulename第1列是分析階段確定的軟件功能編號(hào),通常一個(gè)功能可能需要多個(gè)模塊實(shí)現(xiàn),如果模塊超過5個(gè),往往說明該功能太大,應(yīng)該將其細(xì)分。每個(gè)功能都應(yīng)該有一條自上而下的模塊調(diào)用通路,如果發(fā)現(xiàn)某條通路走下來不能實(shí)現(xiàn)需要的功能,就要重新檢查數(shù)據(jù)流程圖到軟件結(jié)構(gòu)圖的轉(zhuǎn)換是否正確。在走查模塊時(shí)不要進(jìn)入模塊內(nèi)部的具體處理算法,只是檢查接口參數(shù)和分配的功能即可用快速原型法修正設(shè)計(jì)在設(shè)計(jì)時(shí),有些問題很難確定是否能夠?qū)崿F(xiàn),可以先開發(fā)一個(gè)原型,通過開發(fā)原型來發(fā)現(xiàn)設(shè)計(jì)中存在的問題,以便在編碼之前解決很多棘手的問題。另外,原型可以促進(jìn)開發(fā)人員之間、以及開發(fā)人員與用戶之間的溝通。開發(fā)原型時(shí),通常忽略功能上的很多細(xì)節(jié),只是將注意力放在系統(tǒng)的某個(gè)或某幾個(gè)特定方面。例如,界面方面、性能方面、還有安全方面等等,這種原型肯定會(huì)存在許多漏洞,但是,如果一個(gè)原型僅僅是要證明設(shè)計(jì)的可行性時(shí),就不必太多的關(guān)注這些漏洞。這種原型屬于拋棄型原型,意思是,開發(fā)的原型僅僅是為了證明系統(tǒng)某些特征的可行性,它不是最終的產(chǎn)品。關(guān)于設(shè)計(jì)的說明在程序結(jié)構(gòu)被設(shè)計(jì)和優(yōu)化后,應(yīng)該對(duì)設(shè)計(jì)進(jìn)行一些必要的說明。每個(gè)模塊寫一份處理說明;為模塊之間的接口提供一份接口說明;確定全局?jǐn)?shù)據(jù)結(jié)構(gòu);指出所有的設(shè)計(jì)約束和限制。處理說明應(yīng)該清楚地描述模塊的主要處理任務(wù)、條件抉擇和輸人/輸出。注意概要設(shè)計(jì)階段不要對(duì)模塊的內(nèi)部處理過程進(jìn)行詳細(xì)描述,這項(xiàng)工作是詳細(xì)設(shè)計(jì)的任務(wù)。接口說明要給出一張表格,列出所有進(jìn)入模塊和從模塊輸出的數(shù)據(jù)。接口說明中應(yīng)包括通過參數(shù)表傳遞的信息、對(duì)外界的輸入/輸出信息、訪問全局?jǐn)?shù)據(jù)區(qū)的信息等等。此外還要指出其下屬的模塊和上級(jí)模塊。模塊說明表模塊名稱:
編號(hào):主要功能:
輸入?yún)?shù)及類型:
輸出參數(shù)及類型:上級(jí)調(diào)用模塊:
向下調(diào)用模塊:
局部數(shù)據(jù)結(jié)構(gòu):
約束條件和設(shè)計(jì)限制:4.6設(shè)計(jì)復(fù)查采用概要設(shè)計(jì)復(fù)查的方法來檢查在概念上的設(shè)計(jì);在關(guān)鍵設(shè)計(jì)審查中,向其它開發(fā)者描述關(guān)鍵技術(shù)上的設(shè)計(jì)細(xì)節(jié);進(jìn)行程序設(shè)計(jì)的復(fù)查,程序設(shè)計(jì)的復(fù)查屬于詳細(xì)設(shè)計(jì)階段。復(fù)查的目標(biāo)是確保軟件設(shè)計(jì)與實(shí)現(xiàn)正是用戶想要的。
4.7數(shù)據(jù)設(shè)計(jì)
盡量使用簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)通常伴隨著簡(jiǎn)單的操作,有些人喜歡使用復(fù)雜的工具完成一些簡(jiǎn)單的事情,這在軟件開發(fā)中是比較忌諱的。在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)要注意數(shù)據(jù)之間的關(guān)系,特別要平衡數(shù)據(jù)冗余與數(shù)據(jù)關(guān)聯(lián)的矛盾。有時(shí),為了減少信息的冗余,需要增加更多的關(guān)聯(lián),使程序處理比較復(fù)雜;如果一味的降低數(shù)據(jù)之間的關(guān)聯(lián),可能會(huì)造成大量的數(shù)據(jù)冗余,難以保證數(shù)據(jù)的一致性。為了加強(qiáng)數(shù)據(jù)設(shè)計(jì)的可復(fù)用性,應(yīng)該針對(duì)常用的數(shù)據(jù)結(jié)構(gòu)和復(fù)雜的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)抽象類型,并且將數(shù)據(jù)結(jié)構(gòu)與操縱數(shù)據(jù)結(jié)構(gòu)的操作封裝在一起。同時(shí)要清楚地描述調(diào)用這個(gè)抽象數(shù)據(jù)結(jié)構(gòu)的接口說明。4.7數(shù)據(jù)設(shè)計(jì)(續(xù))4)
盡量使用經(jīng)典的數(shù)據(jù)結(jié)構(gòu),因?yàn)?,?duì)它們的討論比較普遍,容易被大多數(shù)開發(fā)人員理解,同時(shí),也能夠獲得更多的支持。5)在確定數(shù)據(jù)結(jié)構(gòu)時(shí)一般先考慮靜態(tài)結(jié)構(gòu),如果不能滿足要求,再考慮動(dòng)態(tài)結(jié)構(gòu)。
4.7數(shù)據(jù)設(shè)計(jì)(續(xù))文件設(shè)計(jì)是指對(duì)數(shù)據(jù)存儲(chǔ)文件的設(shè)計(jì),主要工作是根據(jù)使用要求、處理方式、存儲(chǔ)的信息量、數(shù)據(jù)的使用頻率和文件的物理介質(zhì)等因素,來確定文件的類別、文件的組織方式。設(shè)計(jì)文件記錄的格式,估計(jì)文件的容量。文件的設(shè)計(jì)過程包括文件的邏輯設(shè)計(jì)和文件的物理設(shè)計(jì)兩個(gè)階段,文件的邏輯設(shè)計(jì)在概要設(shè)計(jì)階段進(jìn)行,文件的物理設(shè)計(jì)在詳細(xì)設(shè)計(jì)階段進(jìn)行。4.7數(shù)據(jù)設(shè)計(jì)(續(xù))整理必須的數(shù)據(jù)元素:分析文件中要存儲(chǔ)的數(shù)據(jù)元素,確定每個(gè)數(shù)據(jù)元素的類型、長(zhǎng)度,并且給每個(gè)數(shù)據(jù)元素定義一個(gè)容易理解的、有意義的名字。分析數(shù)據(jù)間的關(guān)系:根據(jù)業(yè)務(wù)處理邏輯確定數(shù)據(jù)元素之間的關(guān)系,有時(shí)一個(gè)文件記錄中可能包含多個(gè)子數(shù)據(jù)結(jié)構(gòu)。例如,考生成績(jī)文件的記錄中可能包含:考生編號(hào)、姓名、學(xué)校、(語(yǔ)文、數(shù)學(xué)、英語(yǔ)、物理、化學(xué))、總成績(jī)。其中,括號(hào)部分是一個(gè)子結(jié)構(gòu),描述各科的成績(jī),這些數(shù)據(jù)元素可能需要同時(shí)處理。3)
確定文件的存儲(chǔ)介質(zhì)。目前,文件的存儲(chǔ)介質(zhì)主要有磁帶、軟盤、磁盤、光盤、可移動(dòng)快速閃存。選擇文件存儲(chǔ)介質(zhì)是主要考慮下面一些原則:a)
數(shù)據(jù)量b)
處理方式c)
存儲(chǔ)時(shí)間d)
處理時(shí)間e)
數(shù)據(jù)結(jié)構(gòu)f)
操作要求g)
費(fèi)用要求4.7數(shù)據(jù)設(shè)計(jì)(續(xù))確定文件的記錄格式。文件的記錄格式通常分為無格式的字符流和用戶定義的記錄格式兩種。并且還可以設(shè)計(jì)為定長(zhǎng)記錄和不定長(zhǎng)記錄。估算記錄的存取時(shí)間。根據(jù)文件的存儲(chǔ)介質(zhì)和類型,計(jì)算平均訪問時(shí)間和最壞情況下的訪問時(shí)間。估算文件的存儲(chǔ)量。根據(jù)一條記錄的大小估算整個(gè)文件的存儲(chǔ)量,然后,考慮文件的增長(zhǎng)速度,確定文件的存儲(chǔ)介質(zhì)的規(guī)格型號(hào),以及設(shè)計(jì)文件備份轉(zhuǎn)儲(chǔ)的周期
4.7數(shù)據(jù)設(shè)計(jì)(續(xù))4.7數(shù)據(jù)設(shè)計(jì)(續(xù))數(shù)據(jù)庫(kù)模式設(shè)計(jì):模式設(shè)計(jì)是在物理層和邏輯層面上描述的數(shù)據(jù)庫(kù)設(shè)計(jì)。第三范式形式的實(shí)體及關(guān)系數(shù)據(jù)模型是模式設(shè)計(jì)過程的輸入,模式設(shè)計(jì)的主要問題是處理具體的數(shù)據(jù)庫(kù)管理系統(tǒng)的結(jié)構(gòu)約束。子模式設(shè)計(jì):子模式是用戶使用的數(shù)據(jù)視圖。完整性和安全性設(shè)計(jì)優(yōu)化4.8詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì)也叫過程設(shè)計(jì),應(yīng)該在軟件結(jié)構(gòu)設(shè)計(jì)、數(shù)據(jù)設(shè)計(jì)之后進(jìn)行,主要是設(shè)計(jì)模塊內(nèi)的算法實(shí)現(xiàn)細(xì)節(jié)。任務(wù)不是編寫程序,而是要為編寫程序代碼設(shè)計(jì)“圖紙”,由程序員按“圖紙”用某種高級(jí)程序設(shè)計(jì)語(yǔ)言編寫程序代碼。因此,詳細(xì)設(shè)計(jì)的結(jié)果基本上決定了最終的程序代碼質(zhì)量。衡量程序代碼的質(zhì)量不僅要看它的邏輯是否正確,性能是否滿足要求,更主要的要看它是否容易閱讀和理解。因此,詳細(xì)設(shè)計(jì)的目標(biāo)不僅僅是保證所設(shè)計(jì)的模塊功能正確,更重要的是保證所設(shè)計(jì)的處理過程簡(jiǎn)明易懂。4.8詳細(xì)設(shè)計(jì)(續(xù))結(jié)構(gòu)化程序的特征:
程序模塊只有一個(gè)入口和一個(gè)出口。程序中只包含順序、條件和循環(huán)三種控制結(jié)構(gòu)。程序流程圖:程序流程圖也稱為程序框圖,是使用最廣泛的詳細(xì)設(shè)計(jì)方法。流程圖畫起來很簡(jiǎn)單,方框表示處理步驟,菱形表示邏輯判斷,箭頭表示控制流。判定表有時(shí)一個(gè)模塊內(nèi)部的實(shí)現(xiàn)算法中常常包含著多重嵌套的條件選擇,這類算法如果完全用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度福建省勞動(dòng)合同制員工社會(huì)保險(xiǎn)及福利待遇合同
- 2025年度電商平臺(tái)會(huì)員購(gòu)物返利協(xié)議
- 2025年度海鮮電商平臺(tái)運(yùn)營(yíng)合作協(xié)議
- 二零二五年度農(nóng)村土地流轉(zhuǎn)及農(nóng)業(yè)項(xiàng)目投資合同
- 二零二五年度社會(huì)保險(xiǎn)經(jīng)辦機(jī)構(gòu)與金融機(jī)構(gòu)合作協(xié)議
- 樁基合同-2025年度樁基施工項(xiàng)目管理與咨詢服務(wù)協(xié)議
- 二零二五年度煤炭供應(yīng)鏈金融服務(wù)協(xié)議
- 二零二五年度住房公積金購(gòu)房合同原件遺失風(fēng)險(xiǎn)預(yù)防及應(yīng)急處理合同
- 二零二五年度法人變更合同審查與合同續(xù)簽服務(wù)協(xié)議
- 2025年度租賃房屋安全責(zé)任定金協(xié)議
- 神經(jīng)外科規(guī)培入科宣教
- 四年級(jí)下冊(cè)數(shù)學(xué)簡(jiǎn)便計(jì)算練習(xí)400題及答案
- 8.2干旱的寶地-塔里木盆地課件2023-2024學(xué)年人教版地理八年級(jí)下冊(cè)
- 電匯憑證打印模板(建行)
- 數(shù)據(jù)分析與可視化實(shí)踐第三版全套教學(xué)課件
- 《壓力性尿失禁》課件
- 拈花灣策劃方案
- 甲狀旁腺疾病學(xué)習(xí)課件
- 消防隊(duì)消防產(chǎn)品培訓(xùn)課件
- 石油天然氣行業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化建設(shè)
- 數(shù)據(jù)分析與應(yīng)用培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論