版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章
總體設(shè)計XX大學(xué)XX系XXX軟件工程教程電子科技大學(xué)出版社學(xué)習(xí)目標(biāo)l
了解總體設(shè)計的目標(biāo)、任務(wù)和設(shè)計過程;l
理解總體設(shè)計的原理和結(jié)構(gòu)設(shè)計準(zhǔn)則;l
掌握面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計方法和描繪軟件結(jié)構(gòu)的圖形工具;l
能夠運用相關(guān)方法和工具進(jìn)行簡單的軟件結(jié)構(gòu)設(shè)計。目錄010203總體設(shè)計的目標(biāo)和任務(wù)總體設(shè)計的過程總體設(shè)計的原理04050607軟件結(jié)構(gòu)設(shè)計準(zhǔn)則描繪軟件結(jié)構(gòu)的圖形工具面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計方法本章小結(jié)總體設(shè)計的目標(biāo)和任務(wù)01總體設(shè)計的目標(biāo)和任務(wù)按照軟件生存周期模型的結(jié)構(gòu),總體設(shè)計(也稱概要設(shè)計)是在需求分析取得正式結(jié)果的基礎(chǔ)上開展的軟件開發(fā)工作,是軟件開發(fā)時期的第一階段工作,對開發(fā)時期的其他后續(xù)工作具有統(tǒng)籌的作用??傮w設(shè)計的目標(biāo)和任務(wù)總體設(shè)計的基本目的是回答“概括地說,系統(tǒng)應(yīng)該如何實現(xiàn)”這個問題,目標(biāo)是得到良好的軟件總體結(jié)構(gòu),即獨立性良好、規(guī)模適中的一組模塊以及深度、寬度、扇入、扇出合適的系統(tǒng)結(jié)構(gòu)。良好的總體結(jié)構(gòu)將給后續(xù)階段的工作帶來諸多便利,也是保障軟件質(zhì)量、降低開發(fā)成本、提高軟件可維護(hù)性的先決條件。什么是良好的軟件結(jié)構(gòu)?如何設(shè)計良好的軟件結(jié)構(gòu)?可以使用哪些工具?將是本章主要介紹的內(nèi)容。總體設(shè)計的目標(biāo)和任務(wù)從工程管理的角度,軟件設(shè)計可以劃分為兩個階段:總體設(shè)計階段和詳細(xì)設(shè)計階段??傮w設(shè)計的目標(biāo)是把需求分析得到的結(jié)構(gòu)化分析模型映射成結(jié)構(gòu)化設(shè)計模型。前者反映的是問題域的既定事實,后者反映的是帶有設(shè)計者意圖的或意志的預(yù)期事實。結(jié)構(gòu)化分析與結(jié)構(gòu)化設(shè)計的關(guān)系如圖4.1所示。總體設(shè)計的圖4.1分析模型到設(shè)計模型的映射總體設(shè)計的目標(biāo)和任務(wù)需要明白的是,分析模型不是設(shè)計的結(jié)果,分析模型要如實反映問題域的真實情況;設(shè)計模型要以分析模型為基礎(chǔ),用計算機(jī)所理解的虛擬世界的方式對問題域中待解決的問題進(jìn)行重新的結(jié)構(gòu)構(gòu)建,并反映設(shè)計這的意志,設(shè)計模型絕不能違反分析模型中的事實和現(xiàn)實世界的常識,否則,就不可能得到符合預(yù)期的產(chǎn)品??傮w設(shè)計的目標(biāo)和任務(wù)總體設(shè)計的主要任務(wù)是把分析階段得到的數(shù)據(jù)模型映射成數(shù)據(jù)庫設(shè)計,把數(shù)據(jù)流圖映射成軟件功能結(jié)構(gòu),行為模型可以用于詳細(xì)設(shè)計階段的流程、算法設(shè)計。軟件功能結(jié)構(gòu)反映了軟件的功能組成,以及各功能模塊間的邏輯關(guān)系(含接口關(guān)系)。總體設(shè)計的過程02總體設(shè)計的過程總體設(shè)計過程通常由兩個主要階段組成:系統(tǒng)設(shè)計階段,確定系統(tǒng)的的具體實現(xiàn)方案;”結(jié)構(gòu)設(shè)計階段,確定軟件的結(jié)構(gòu)。典型的總體設(shè)計過程包括以下九個步驟??傮w設(shè)計的過程(1)設(shè)想供選擇的方案在總體設(shè)計階段,系統(tǒng)分析員首先應(yīng)該考慮各種可能的實現(xiàn)方案,并力求選出最佳方案。設(shè)”想方案的出發(fā)點是數(shù)據(jù)流圖,常用的做法是,設(shè)想把數(shù)據(jù)流圖中的處理進(jìn)行分組的各種可能的方法,拋棄在技術(shù)上行不通、不合理的分組方法,余下的分組方法代表可能的實現(xiàn)策略??傮w設(shè)計的過程(2)選取合理的方案從前一步的到的不同方案中選取若干個合理的方案,通常要包括低成本、中等成本和高成本的”三種方案。在判斷方案的合理性時,可依據(jù)可行性研究階段確定的項目規(guī)模,有時可能還需要進(jìn)一步征求用戶的意見??傮w設(shè)計的過程(3)推薦最佳方案系統(tǒng)分析員應(yīng)綜合分析對比各種合理方案的利弊,推薦一個最佳方案,并為此方案制定詳細(xì)的實現(xiàn)計劃。用戶”和有關(guān)技術(shù)專家應(yīng)認(rèn)真審查分析員推薦的最佳方案,如果確實符合用戶需求,且在現(xiàn)有技術(shù)條件下能夠完全實現(xiàn),則提請使用部門負(fù)責(zé)人進(jìn)行審批。在審批通過后,方可進(jìn)入總體設(shè)計的下一個重要階段——結(jié)構(gòu)設(shè)計??傮w設(shè)計的過程(4)功能分級結(jié)構(gòu)設(shè)計的任務(wù)是確定目標(biāo)系統(tǒng)由哪些模塊組成,以及這些模塊之間的邏輯關(guān)系。結(jié)構(gòu)設(shè)計之”后的過程設(shè)計屬于詳細(xì)設(shè)計階段的任務(wù),用于確定每個模塊的處理過程??傮w設(shè)計的過程為了確定軟件的結(jié)構(gòu),首先應(yīng)該從實現(xiàn)的角度把復(fù)雜的功能進(jìn)一步分解。具體做法是,仔細(xì)分析數(shù)據(jù)流圖中的每個處理,如果一個處理的功能”過分復(fù)雜,則把它適當(dāng)?shù)姆纸獬梢幌盗斜容^簡單的功能,整個分解過程實質(zhì)上是對數(shù)據(jù)流圖的進(jìn)一步細(xì)化。在分解的過程中,還應(yīng)該用IPO表簡要地描述每個處理的算法??傮w設(shè)計的過程(5)設(shè)計軟件結(jié)構(gòu)設(shè)計軟件結(jié)構(gòu)就是要把軟件的模塊組織成良好的層次系統(tǒng)。在這個層次系統(tǒng)中,每一層模塊都調(diào)用它”下一層的模塊,每個下層模塊再調(diào)用更下層的模塊,最下層的模塊完成最具體的功能,從而實現(xiàn)程序的某個子功能,所有的子功能共同完成系統(tǒng)的完整功能。描述軟件結(jié)構(gòu)可以使用層次圖或結(jié)構(gòu)圖??傮w設(shè)計的過程如果數(shù)據(jù)流圖已經(jīng)細(xì)化到適當(dāng)?shù)膶哟危ㄈ绻俜纸饩蜕婕暗竭^程設(shè)計的問題),則可以”直接從數(shù)據(jù)流圖映射出軟件結(jié)構(gòu)??傮w設(shè)計的過程(6)數(shù)據(jù)庫設(shè)計對于需要使用數(shù)據(jù)庫的應(yīng)用領(lǐng)域,還要進(jìn)”行數(shù)據(jù)庫設(shè)計。數(shù)據(jù)庫的設(shè)計包括模式設(shè)計子模式設(shè)計、完整性設(shè)計和安全性設(shè)計、優(yōu)化處理等??傮w設(shè)計的過程(7)制定測試計劃雖然是在設(shè)計階段,但是提早考慮測試問題,能促使設(shè)計人員在設(shè)計時注意提高軟件的”可測試性。在總體設(shè)計階段僅是利用黑盒測試法制定功能測試計劃與測試策略。在詳細(xì)設(shè)計時才編寫詳細(xì)的測試用例和測試計劃??傮w設(shè)計的過程(8)編寫文檔應(yīng)該用正式的文檔記錄總體設(shè)計的結(jié)果,文檔通常包括以下五種。①
系統(tǒng)說明。主要內(nèi)容包括系統(tǒng)流程圖描繪的系統(tǒng)構(gòu)成”方案,組成系統(tǒng)的物理元素清單,成本/效益分析,對最佳方案的概括性描述,精華的數(shù)據(jù)流圖,用層次圖或結(jié)構(gòu)圖描繪的軟件結(jié)構(gòu),用IPO表或PDL語言簡要描述的各個模塊的算法,模塊間的結(jié)構(gòu)關(guān)系,以及需求、功能和模塊三者之間的交叉參照關(guān)系等。總體設(shè)計的過程②
用戶手冊。根據(jù)總體設(shè)計的結(jié)果,修改更正在需求分析階段產(chǎn)生的初步的用戶手冊。③
測試計劃。包括測試策略、測試方案、預(yù)期結(jié)”果、測試計劃等。④
詳細(xì)的實現(xiàn)計劃。包括實現(xiàn)的各階段所需要的時間、資源、人員配置等。⑤
數(shù)據(jù)庫設(shè)計的結(jié)果??傮w設(shè)計的過程(9)審查和復(fù)查最后,應(yīng)該對總體設(shè)計的結(jié)果進(jìn)行嚴(yán)格的”技術(shù)審查,在通過之后,再由使用部門負(fù)責(zé)人從管理的角度進(jìn)行復(fù)審??傮w設(shè)計的典型整體過程如圖4.2所示。圖4.2典型總體設(shè)計過程總體設(shè)計的原理03模塊和模塊化模塊并非是計算機(jī)專有術(shù)語,在計算機(jī)領(lǐng)域也沒有統(tǒng)一的嚴(yán)格定義,但是幾乎所有的軟件體系結(jié)構(gòu)都是以模塊為最小單位構(gòu)建的。模塊也成構(gòu)件,是指可單獨命名且可通過名字訪問的過程函數(shù)、子程序或宏調(diào)用。在具體計算機(jī)語言中,模塊是由邊界元素(比如Java中的{…})限定的相鄰程序元素的序列,且有一個總體標(biāo)識符代表它。面向?qū)ο蠓椒▽W(xué)中的對象、對象中的方法,都是模塊。模塊和模塊化模塊一般具有如下四個基本屬性。(1)接口:指模塊的輸入與輸出。(2)功能:指模塊實現(xiàn)的處理。(3)邏輯:描述模塊內(nèi)部的處理過程。(4)狀態(tài):指模塊使用時的環(huán)境和條件。模塊化就是把程序劃分成獨立命名且可獨立訪問的模塊,每個模塊完成一個子功能,所有模塊按用戶業(yè)務(wù)邏輯集成起來構(gòu)成一個整體,完成指定的功能滿足用戶需求。模塊和模塊化模塊化的目的是為了降低軟件的復(fù)雜性。對軟件進(jìn)行適當(dāng)?shù)姆纸?,可以減少開發(fā)難度,降低開發(fā)成本,提高考法效率。模塊化的論據(jù)如下:如果C(x)表示問題x的復(fù)雜程度,函數(shù)E(x)表示解決問題x所需要的工作量函數(shù)。對于p1、p2兩個問題,如果C(p1)>C(p2),
則有:E(p1)>E(p2)(公式4.1)模塊和模塊化由于p1和p2兩個問題合成一個問題時的復(fù)雜程度大于分別考慮每個問題時的復(fù)雜程度之和,即C(p1+p2)>C(p1)+C(p2)。這種假設(shè)看起來似乎有些武斷,但大多數(shù)情況下的確如此。所以,可以得到:E(p1+p2)>E(p1)+E(p2)
(公式4.2)模塊和模塊化但是如果按照這個論斷,無限制地分割軟件就可以無限地降低成本。現(xiàn)實中顯然并非如此,因為還有另一個因素起作用,使得上述論斷不能成立。當(dāng)無限地分割軟件時,雖然每個模塊的規(guī)模在減小,開發(fā)成本在降低,但同時系統(tǒng)的總模塊數(shù)會上升,模塊間的接口設(shè)計所需要的成本會顯著提升。如圖4.3所示。最小成本區(qū)成本或工作量總成本集成成本M成本/模塊模塊數(shù)量圖4.3模塊化和軟件成本關(guān)系圖模塊和模塊化由圖4-3可知,存在一個模塊數(shù)M,使得軟件總成本最低??梢娫诳傮w設(shè)計中,只有選擇合適的模塊數(shù)據(jù),才會使得整個系統(tǒng)的開發(fā)成本較小,但在目前還無法準(zhǔn)確預(yù)測這個M的數(shù)值。模塊和模塊化采用模塊化原理可以使軟件結(jié)構(gòu)清晰,降低設(shè)計難度,提高可理解性。由于程序的錯誤大多發(fā)生在模塊及它們之間的接口中,所以模塊化設(shè)計會使軟件容易測試和調(diào)試,進(jìn)而有助于提高軟件的可靠性。當(dāng)變動僅涉及少數(shù)幾個模塊時,模塊化還能夠提高可修改性。另外,模塊化也有助于軟件開發(fā)的組織管理,一個復(fù)雜的大型程序可以通過模塊化分解成許多程序,按照實現(xiàn)的難易度分配給技術(shù)熟練水平不同的程序員。抽象抽象是人類認(rèn)識復(fù)雜現(xiàn)象時使用的最有力的思維工具。人們在和現(xiàn)實世界的互動中認(rèn)識到,現(xiàn)實世界中的事務(wù)、狀態(tài)或過程之間總存在著某些共性。把這些共性歸納和概括起來,暫時忽略它們之間的差異,這就是抽象。抽象就是抽出事物的本質(zhì)特性而暫時不考慮它們的細(xì)節(jié)。抽象當(dāng)考慮任何問題的模塊化解法時,可以提出許多抽象的層次。在抽象的最高層次使用問題環(huán)境的語言,以概括的方式敘述問題的解法。在較低層次上使用更過程化的方法,把面向問題的術(shù)語和面向?qū)崿F(xiàn)的術(shù)語結(jié)合起來描述問題的解法。最后,在最低的抽象層次則以直接實現(xiàn)的方式敘述問題的解法。抽象軟件工程中的每個步驟都是對軟件解決方案抽象化程度的一次細(xì)化。在可行性研究階段,軟件作為系統(tǒng)的一個完整部件;在需求分析階段,軟件解法是使用在問題環(huán)境內(nèi)熟悉的方式進(jìn)行的描述;當(dāng)有總體設(shè)計向詳細(xì)設(shè)計過渡時,抽象的程度也隨之減少了;最后,當(dāng)源程序?qū)懗鰜砗?,也就達(dá)到了抽象的最底層。逐步求精逐步求精最初是由NiklausWirth提出的一種自頂向下的設(shè)計策略。按照這個策略,程序的體系結(jié)構(gòu)是通過逐步精化處理過程的層次而設(shè)計出來的。通過逐步分解對功能的宏觀陳述而開發(fā)出層次結(jié)構(gòu),最終得出用程序設(shè)計語言表達(dá)的程序。逐步求精抽象與求精是一對互補的概念。抽象使得設(shè)計者能夠說明結(jié)構(gòu)和數(shù)據(jù),但卻同時忽略了底層的細(xì)節(jié)。事實上,可以把抽象看作是一種通過忽略多余的細(xì)節(jié)同時強(qiáng)調(diào)有關(guān)的細(xì)節(jié),而實現(xiàn)逐步求精的方法。求精則幫助設(shè)計者在設(shè)計過程中逐步解釋底層細(xì)節(jié)。這兩個概念都有助于設(shè)計者在設(shè)計演化過程中創(chuàng)造出完整的設(shè)計模型。信息隱藏與局部化應(yīng)用模塊化原理時,必然會產(chǎn)生一個問題:如何分解一個軟件才能得到最佳的模塊組合?1972年,D.Parnas提出的信息隱藏原理指出:每一個模塊的實現(xiàn)細(xì)節(jié)(過程和數(shù)據(jù))對于不需要這些信息的其他模塊來說應(yīng)該是隱藏的。信息隱藏與局部化局部化的概念和信息隱藏概念是密切相關(guān)的。所謂局部化是指把一些關(guān)系密切的軟件元素物理地放得彼此靠近。局部化實質(zhì)上是一種實現(xiàn)信息隱藏的手段,信息隱藏是局部化的結(jié)果。信息隱藏與局部化信息隱藏意味著有效的模塊化可以通過定義一組獨立的模塊來實現(xiàn),這些模塊相互間的通信僅使用對于實現(xiàn)軟件功能來說是必要的信息。信息隱藏的原理不僅使得模塊可以進(jìn)行并行開發(fā),還可以減少測試和后期維護(hù)的工作量。因為測試和維護(hù)階段不可避免地要修改設(shè)計和代碼,模塊對于多數(shù)數(shù)據(jù)和處理過程細(xì)節(jié)的隱藏可以減少錯誤向外傳播。此外,整個系統(tǒng)欲擴(kuò)充功能也只需“插入”新模塊,原有的多數(shù)模塊無需改動。模塊獨立模塊的獨立性是指軟件系統(tǒng)中每個模塊只涉及軟件要求的具體子功能,而和軟件系統(tǒng)中其他的模塊的接口是簡單的。顯然,模塊化、抽象、信息隱藏和局部化的直接結(jié)果是模塊獨立。模塊獨立程度可以由兩個定性標(biāo)準(zhǔn)度量:耦合和內(nèi)聚。耦合衡量不同模塊彼此間的相互依賴程度;內(nèi)聚衡量一個模塊內(nèi)部各元素間彼此結(jié)合的緊密程度。顯然,模塊的耦合性越低,其獨立性越強(qiáng),內(nèi)聚性越高,其獨立性越強(qiáng)。模塊獨立(1)耦合耦合是對一個軟件結(jié)構(gòu)內(nèi)不同模塊間相互關(guān)聯(lián)程度的度量。耦合強(qiáng)弱取決于模塊間接口的復(fù)雜程度,一般由模塊之間的調(diào)用方式、傳遞信息的類型和數(shù)量來決定。模塊獨立軟件設(shè)計,應(yīng)該追求盡可能松散耦合的結(jié)構(gòu)。這樣的程序容易測試、修改和維護(hù),當(dāng)某一模塊中出現(xiàn)錯誤時,傳播到整個系統(tǒng)的可能性也小。模塊間的耦合性強(qiáng)烈影響著系統(tǒng)的可理解性、可測試性、可靠性和可維護(hù)性。模塊間的耦合方式有六種,如圖4.4所示。低高耦合性低耦合中等強(qiáng)度耦合
較強(qiáng)耦合強(qiáng)耦合非直接耦合
數(shù)據(jù)耦合特征耦合
控制耦合
公共環(huán)境耦合
內(nèi)容耦合模塊獨立性強(qiáng)弱圖4.4耦合性的6種類型模塊獨立①
非直接耦合。如果兩個模塊分別從屬于不同的上級模塊的控制與調(diào)用,它們之間不直接傳遞任何信息,互相獨立,則稱這兩個模塊為非直接耦合關(guān)系。需要注意的是,在一個軟件系統(tǒng)中,所有模塊之間不可能沒有任何間接的練習(xí),否則,它們無法構(gòu)成一個系統(tǒng)。模塊獨立②
數(shù)據(jù)耦合。如果兩個模塊之間有調(diào)用關(guān)系,相互以參數(shù)形式傳遞信息,而且交換的信息僅僅是數(shù)據(jù),那么這種耦合稱為數(shù)據(jù)耦合。系統(tǒng)中至少必須存在這種耦合,因為只有當(dāng)某些模塊的輸出數(shù)據(jù)作為另一個模塊的輸入數(shù)據(jù)時,系統(tǒng)才能完成有價值的功能。數(shù)據(jù)耦合是理想的設(shè)計目標(biāo)。模塊獨立③
特征耦合。兩個模塊通過傳遞數(shù)據(jù)結(jié)構(gòu)加以聯(lián)系,或都與一個數(shù)據(jù)結(jié)構(gòu)有關(guān)系,則稱這兩個模塊之間存在特征耦合(或標(biāo)記耦合)。當(dāng)被調(diào)用模塊只需要整個數(shù)據(jù)結(jié)構(gòu)中的一部分?jǐn)?shù)據(jù)元素時,將整個數(shù)據(jù)結(jié)構(gòu)作為參數(shù)的弊端是極易造成信息泄漏,給計算機(jī)犯罪提供了可乘之機(jī)。模塊獨立④
控制耦合。如果兩個模塊彼此間傳遞的信息中有控制信息,這種耦合稱為控制耦合。比如,一個模塊傳遞開關(guān)、標(biāo)志、名字等控制信息,明顯控制另一個模塊的內(nèi)部執(zhí)行邏輯。這種耦合意味著被調(diào)用模塊內(nèi)部的功能分解不徹底,調(diào)用模塊需要知道被調(diào)用模塊內(nèi)部的邏輯結(jié)構(gòu),這就降低了模塊的獨立性,對被調(diào)用模塊再分解后可以用數(shù)據(jù)耦合替代。模塊獨立⑤
公共環(huán)境耦合。當(dāng)兩個或多個模塊通過一個公共數(shù)據(jù)環(huán)境相互作用時,它們之間的耦合稱為公共環(huán)境耦合。公共環(huán)境是指全局變量、共享通信區(qū)、內(nèi)存的公共覆蓋區(qū)、任何存儲介質(zhì)上的文件、物理設(shè)備等。公共環(huán)境耦合的強(qiáng)度,隨耦合的模塊個數(shù)而變化——隨耦合模塊的個數(shù)增加而增加。在只有兩個模塊有公共環(huán)境耦合的情況下,這種耦合又可分為兩種情況。模塊獨立一種情況是,一個模塊往公共環(huán)境送數(shù)據(jù),另一個模塊從公共環(huán)境取數(shù)據(jù)。這種公共環(huán)境耦合是一種比較松散的耦合。另一種情況是,兩個模塊都既往公共環(huán)境中送數(shù)據(jù),又從連取數(shù)據(jù)。這種耦合比較緊密,介于數(shù)據(jù)耦合和控制耦合之間。模塊獨立如果兩個模塊共享的數(shù)據(jù)很多,都通過參數(shù)傳遞可能很不方便,此時利用公共環(huán)境耦合是一種可以被接受的方案。模塊獨立⑥
內(nèi)容耦合。如果一個模塊直接訪問另一個模塊的內(nèi)部數(shù)據(jù),一個模塊不通過正常入口而轉(zhuǎn)入到另一個模塊的內(nèi)部,兩個模塊有一部分代碼重疊(只可能出現(xiàn)在匯編程序中),一個模塊有多個入口,這些現(xiàn)象都屬于內(nèi)容耦合。內(nèi)容耦合是最高程度的耦合,是應(yīng)該堅決避免使用的耦合。模塊獨立總之,在設(shè)計軟件結(jié)構(gòu)時,應(yīng)該根據(jù)問題的特點,選擇合適的耦合類型。盡量使用數(shù)據(jù)耦合,少用標(biāo)記耦合和控制耦合,限制使用公共環(huán)境耦合,完全不用內(nèi)容耦合。具體做法有:降低模塊接口的復(fù)雜性,減少每個模塊的參數(shù)個數(shù),盡量使用標(biāo)準(zhǔn)過程調(diào)用,少用直接引用,以標(biāo)準(zhǔn)的形式直接傳遞數(shù)據(jù),把模塊的通信信息放在緩沖區(qū)中。模塊獨立(2)內(nèi)聚內(nèi)聚標(biāo)志了一個模塊內(nèi)部各元素彼此結(jié)合的緊密程度。它是信息隱藏和局部化概念的自然擴(kuò)展。理想的內(nèi)聚是每個模塊只做一件事。設(shè)計軟件結(jié)構(gòu)時應(yīng)該力求做到高內(nèi)聚,中等程度的內(nèi)聚也是可以接受的選擇。內(nèi)聚和耦合密切相關(guān),內(nèi)聚高往往意味著耦合松散。模塊獨立內(nèi)聚和耦合都是設(shè)計軟件結(jié)構(gòu)時需要考慮的結(jié)構(gòu)特征,但是實踐經(jīng)驗表明,內(nèi)聚更重要,應(yīng)該把更多的注意力集中到提高模塊的內(nèi)聚程度上。這類似于每個人做好自己,最終形成良好社會的的價值觀,因為通過統(tǒng)籌管理獲得全面提高的難度顯然更大。按照內(nèi)聚程度的不同,內(nèi)聚可以分為七種情況,如圖4.5所示。低高內(nèi)聚性中等強(qiáng)度內(nèi)聚低內(nèi)聚強(qiáng)內(nèi)聚偶然內(nèi)聚邏輯內(nèi)聚時間內(nèi)聚過程內(nèi)聚通信內(nèi)聚順序內(nèi)聚功能內(nèi)聚模塊獨立性強(qiáng)弱圖4.5內(nèi)聚類型模塊獨立①
偶然內(nèi)聚。模塊內(nèi)個元素之間沒有實質(zhì)性的聯(lián)系,或者說模塊內(nèi)各組成成分在功能上互不相關(guān)。偶然內(nèi)聚是強(qiáng)度最低的一種內(nèi)聚,模塊內(nèi)各元素不是為同一個功能服務(wù),各有不同需求,因而模塊的內(nèi)容不易理解,也不易修改和維護(hù)。模塊獨立②
邏輯內(nèi)聚。如果一個模塊完成的任務(wù)在邏輯上屬于相同或相似的一類,各元素之間存在必然的邏輯關(guān)系,則它們之間的關(guān)系屬于邏輯內(nèi)聚。典型的情況是把幾種相關(guān)的功能組合在一個模塊內(nèi),由傳遞給模塊的參數(shù)確定每次調(diào)用執(zhí)行哪種功能。邏輯內(nèi)聚會存在不同功能混在一起,共用部分程序代碼的情況,在遇到需求修改模塊時,往往會影響全局,使修改比較困看。模塊獨立③
時間內(nèi)聚。一個模塊包含的任務(wù)必須在同一時間段內(nèi)執(zhí)行,這些功能僅是因為時間因素被組織在一起。例如,初始化工作,同時打開文件,關(guān)閉文件,緊急故障處理等都是時間內(nèi)聚模塊。一般情況下,各部分只要滿足時間上的同一性,執(zhí)行順序可以任意安排。模塊獨立④
過程內(nèi)聚。如果一個模塊內(nèi)的元素是相關(guān)的,而且必須以特定次序執(zhí)行,受同一控制流支配則稱為過程內(nèi)聚。使用程序流程圖設(shè)計程序時,確定的模塊劃分往往得到過程內(nèi)聚的模塊。例如,把流程圖中的循環(huán)部分、判定部分、計算部分分成3個模塊,這3個模塊是過程內(nèi)聚模塊。模塊獨立⑤
通信內(nèi)聚。如果模塊中所有元素都使用相同的輸入數(shù)據(jù)或產(chǎn)生相同的輸出數(shù)據(jù),則稱為通信內(nèi)聚。⑥
順序內(nèi)聚。如果一個模塊內(nèi)的處理元素和同一個功能密切相關(guān),而且這些處理必須順序執(zhí)行。通常是,一個處理元素的輸出最為下一個處理元素的輸入,即在同一個數(shù)據(jù)結(jié)構(gòu)上操作。根據(jù)數(shù)據(jù)流圖劃分模塊時,往往得到順序內(nèi)聚的模塊。模塊獨立⑦
功能內(nèi)聚。模塊內(nèi)的所有處理元素屬于一個整體,即完成一個單一的功能。功能內(nèi)聚是最高成都的內(nèi)聚,是設(shè)計的目標(biāo)和理想的結(jié)構(gòu)。在實際設(shè)計中,沒有必要精確確定內(nèi)聚的級別,重要的是力爭做到高內(nèi)聚,并且能辨認(rèn)出低內(nèi)聚模塊,通過修改結(jié)構(gòu)提高內(nèi)聚程度。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則04軟件結(jié)構(gòu)設(shè)計準(zhǔn)則人們在軟件開發(fā)的長期實踐中積累了豐富的經(jīng)驗,總結(jié)得出了一些啟發(fā)規(guī)則,這些規(guī)則不是普適的基本原理,但是在許多場合仍然具有一定的指導(dǎo)作用,往往能幫助設(shè)計人員改進(jìn)軟件結(jié)構(gòu)提高軟件質(zhì)量。這些規(guī)則不是設(shè)計目標(biāo),但可以作為軟件結(jié)構(gòu)設(shè)計的準(zhǔn)則加以利用。這些準(zhǔn)則如下:軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(1)改進(jìn)軟件結(jié)構(gòu)提高模塊獨立性。初步設(shè)計出軟件結(jié)構(gòu)之后,為了提高模塊的獨立性,應(yīng)該審查、分析這個結(jié)構(gòu),通過分解和合并,力求降低耦合性提高內(nèi)聚性。例如多個模塊公有的一個子功能可以獨立成一個模塊,由這些模塊調(diào)用;有時通過分解或合并模塊可以減少控制信息的傳遞及對全程數(shù)據(jù)的引用,并降低接口的復(fù)雜程度。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(2)模塊規(guī)模應(yīng)該適中。有人從心理學(xué)角度研究得知,一個模塊的規(guī)模不應(yīng)過大,最好能寫在一頁A4紙內(nèi)(通常不超過60行語句),當(dāng)超過30行以后,模塊的可理解性迅速下降。過大的模塊往往是由于分解不充分,但是進(jìn)一步分解必須符合問題結(jié)構(gòu),一般說,分解不應(yīng)以犧牲模塊獨立性為代價。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則模塊規(guī)模也不宜過小,模塊過小,目標(biāo)系統(tǒng)所需的模塊個數(shù)必然增多,接口必然復(fù)雜。特別是只有一個上層模塊調(diào)用的模塊,通??梢院喜⒌缴霞壞K中。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(3)深度、寬度、扇入、扇出都應(yīng)當(dāng)適中深度指軟件結(jié)構(gòu)中控制的層數(shù)。在一定意義上能粗略地反映系統(tǒng)的規(guī)模和復(fù)雜程度。深度和程序的長度有粗略的對應(yīng)關(guān)系,程序越長往往容易深度越深。如果深度過大,則表示控制層數(shù)太多,應(yīng)該考慮是否其中某些模塊分的過于簡單了,可以考慮適當(dāng)合并。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則寬度是指軟件結(jié)構(gòu)在同一個層次上的模塊總數(shù)的最大值。一般說來,寬度越大系統(tǒng)越復(fù)雜。對寬度影響最大的因素是模塊的扇出。扇出是指一個模塊直接調(diào)用的模塊數(shù)目。扇出過大意味著模塊過分復(fù)雜,需要協(xié)調(diào)和控制過多的下層模塊;扇出過小也不好,比如總數(shù)是1。經(jīng)驗表明,一個設(shè)計得好的典型系統(tǒng)的平均扇出通常是3或4(扇出的上限通常是5~9)。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則扇出過大一般是因為缺乏中間層,此時應(yīng)當(dāng)適當(dāng)增加中間控制層模塊。扇出過小時,可以把下級模塊進(jìn)一步分解成若干個子功能模塊,或者合并到上級模塊中去。通過分解或合并調(diào)整軟件結(jié)構(gòu)時,必須符合問題結(jié)構(gòu)(即不能違背解決問題的常識),同時也不能違背模塊獨立原理。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則扇入是指一個模塊有多少個上級模塊直接調(diào)用它。扇入越大說明該模塊共享程度越高,這是有利的,但是,不能違背模塊獨立原理單純追求高扇入。一般設(shè)計得好的軟件結(jié)構(gòu),通常頂層扇出比較高,中間層扇出較少,底層扇入到公共的使用模塊中區(qū),從形象看像一個橄欖型。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(4)模塊的作用域應(yīng)該在控制域之內(nèi)模塊的作用域是指受該模塊內(nèi)一個判定影響的所有模塊的集合。模塊的控制域是指模塊本身及其所有直接或間接從屬于它的模塊集合。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則在一個設(shè)計得好的系統(tǒng)中,所有受判定影響的模塊應(yīng)該都從屬于做出判定的那個模塊,最好局限于做出判定的那個模塊本身及它的下屬模塊。否則,就需要在作用域之外傳遞控制信息,以保持判定應(yīng)有的作用,如此便增加了控制耦合,使軟件結(jié)構(gòu)變得復(fù)雜而難以理解。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(5)降低模塊結(jié)構(gòu)的復(fù)雜程度模塊接口復(fù)雜是軟件出錯的主要原因之一。接口的設(shè)計應(yīng)該盡量使信息傳遞簡單,并與模塊的功能一致。如果模塊的接口復(fù)雜或不一致(即看起來傳遞的數(shù)據(jù)之間沒有聯(lián)系),是緊耦合低內(nèi)聚的征兆,應(yīng)該重新分析該模塊的獨立性。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(6)設(shè)計單入口單出口的模塊這條規(guī)則是在告誡軟件工程師不要模塊間出現(xiàn)內(nèi)容耦合。當(dāng)從頂部進(jìn)入模塊且從底部退出模塊時,軟件是比較容易理解的。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則(7)模塊功能應(yīng)該可以預(yù)測模塊功能應(yīng)該能夠預(yù)測,是考慮到方便以后的軟件測試性和維護(hù),但也要防止模塊功能過分局限。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則如果一個模塊可以看作一個黑盒子,只要輸入相同的數(shù)據(jù)就產(chǎn)生同樣的輸出,這個模塊的功能就是可以預(yù)測的。任意限制模塊內(nèi)數(shù)據(jù)結(jié)構(gòu)的大小、過分限制在控制流中可以做出的選擇或外部接口的模式,該模塊的功能就過分局限了(使用范圍過分狹窄),畢竟可重用性是現(xiàn)代軟件設(shè)計追求的價值觀之一。在現(xiàn)實中不可避免地要修改這類結(jié)構(gòu),以提高模塊的靈活性,擴(kuò)大它的使用范圍。軟件結(jié)構(gòu)設(shè)計準(zhǔn)則以上七條總體設(shè)計的準(zhǔn)則是經(jīng)驗性的,對改進(jìn)設(shè)計、提高質(zhì)量往往具有重要的參考價值。但是,需要注意它們既不是設(shè)計的目標(biāo),也不是設(shè)計時應(yīng)該普遍遵循的原理,僅是可以借鑒的經(jīng)驗。描繪軟件結(jié)構(gòu)的圖形工具05層次圖層次圖用來描繪軟件的層次結(jié)構(gòu)。層次圖中,一個矩形框代表一個模塊,方框間的連線表示調(diào)用關(guān)系,最頂層的方框代表目標(biāo)系統(tǒng)的主控模塊。在方框圖中,位于上層的模塊調(diào)用其有連線的下層模塊。層次圖適用于自頂向下設(shè)計軟件結(jié)構(gòu)。圖4.6是一個庫存管理系統(tǒng)的層次圖。層次圖在使用層次圖時,應(yīng)該注意以下三點。(1)在層次圖中,同一層模塊對其上層來說,不存在調(diào)用次序問題,雖然人們習(xí)慣于從左往右畫,但并不代表系統(tǒng)按此順序調(diào)用下層模塊。(2)層次圖不指明怎樣調(diào)用模塊。(3)層次圖只表明一個模塊調(diào)用哪些模塊。HIPO圖HIPO(Hierarchy
Plus
Input-Process-Output)圖是層次圖加上輸入-處理-輸出圖的英文縮寫,是IBM公司20世界70年代發(fā)展起來表示軟件結(jié)構(gòu)的一種常用描述工具。為了能使HIPO圖具有可追蹤性,在H圖(層次圖)中除了頂層方框之外,每個方框都加了編號。HIPO圖完整的HIPO圖由層次圖和IPO表組成。H圖中的每一個模塊要對應(yīng)一張IPO表,每一個IPO表都要編號,并且要和它所對應(yīng)的模塊的編號一致。結(jié)構(gòu)圖Yourdon提出的結(jié)構(gòu)圖是進(jìn)行軟件結(jié)構(gòu)設(shè)計的另一個有力工具。結(jié)構(gòu)圖中一個方框代表一個模塊,框內(nèi)注明模塊的名稱或主要功能;方框之間用箭頭或直線連接表示調(diào)用關(guān)系,因為按照習(xí)慣總是上方模塊調(diào)用下層模塊,為了簡單起見,一般用直線替代箭頭線表示模塊間的調(diào)用關(guān)系。結(jié)構(gòu)圖在結(jié)構(gòu)圖中通常還用帶有注釋的箭頭表示模塊調(diào)用過程中來回傳遞的信息,其中箭頭尾部是空心圓表示傳遞的是數(shù)據(jù),實心圓表示傳遞的是控制信息,如圖4.8所示。產(chǎn)生最佳解結(jié)構(gòu)圖解得到好輸入計算最佳解輸出結(jié)果結(jié)果格式化顯示結(jié)果讀輸入編輯輸入圖4.8產(chǎn)生最佳解的結(jié)構(gòu)圖此外,結(jié)構(gòu)圖還使用一些附加符號表示模塊的選擇調(diào)用或循環(huán)調(diào)用。圖4.9所示為當(dāng)模塊M中某個判定為真時調(diào)用模塊A,為假時調(diào)用模塊B。圖4.10所示為模塊M循環(huán)調(diào)用A、B、C。圖4.9結(jié)構(gòu)圖選擇調(diào)用表示法圖4.10結(jié)構(gòu)圖循環(huán)調(diào)用表示法結(jié)構(gòu)圖通常層次圖作為描繪軟件結(jié)構(gòu)的文檔,而結(jié)構(gòu)圖作為文檔并不是很合適,因為結(jié)構(gòu)圖上的信息較多,反而降低了結(jié)構(gòu)圖的清晰性。但是,結(jié)構(gòu)圖卻可以作為檢查設(shè)計正確性和評價模塊獨立性的好方法。如果發(fā)現(xiàn)結(jié)構(gòu)圖上的模塊間的練習(xí)不容易解釋,則應(yīng)該考慮是否設(shè)計上存在問題。面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計方法06面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計方法面向數(shù)據(jù)流的軟件結(jié)構(gòu)設(shè)計方法,即以數(shù)據(jù)流圖為依據(jù)的設(shè)計軟件結(jié)構(gòu)的方法,也是通常所說的結(jié)構(gòu)化設(shè)計方法(簡稱SD方法)。因為任何軟件系統(tǒng)都可以用數(shù)據(jù)流圖表示,所以面向數(shù)據(jù)流的設(shè)計方法理論上可以設(shè)計任何軟件系統(tǒng)的結(jié)構(gòu)。概念面向數(shù)據(jù)流的設(shè)計方法的實質(zhì)是把數(shù)據(jù)流圖的信息流映射成軟件結(jié)構(gòu)。因此,信息流的類型決定了映射的方法。按照信息流的流動特征,可以分為變換流和事務(wù)流。概念(1)變換流任何軟件系統(tǒng)都看作是一種信息處理系統(tǒng),信息通常以“外部世界”的形式進(jìn)入系統(tǒng),經(jīng)過處理再以“外部世界”的形式離開系統(tǒng)。概念變換流的特征如圖4.11所示。信息沿輸入通路進(jìn)入系統(tǒng),同時由外部形式轉(zhuǎn)換成內(nèi)部形式,進(jìn)入系統(tǒng)的信息經(jīng)過變換中心的加工處理后,再沿著輸出通路變換成外部形式離開軟件系統(tǒng)。當(dāng)數(shù)據(jù)流具有這些特征時,這種信息流就叫做變換流。概念(2)事務(wù)流基本系統(tǒng)模型的實質(zhì)是變換流,因此,原則上所有信息流都可歸結(jié)為變換流。但是,當(dāng)數(shù)據(jù)流圖明顯具有圖4.12特征時,這種數(shù)據(jù)流是“以事務(wù)為中心的”,即數(shù)據(jù)沿著輸入通路到達(dá)一個處理T,該處理根據(jù)輸入數(shù)據(jù)的類型在若干個動作序列中選出一個執(zhí)行。這種數(shù)據(jù)流稱為事務(wù)流(輸入數(shù)據(jù)稱為事務(wù))。圖4.11變換流示意圖圖4.12事務(wù)流示意圖面向數(shù)據(jù)流設(shè)計方法的過程運用面向數(shù)據(jù)流的方法進(jìn)行軟件結(jié)構(gòu)設(shè)計的過程,如圖4.13所示。應(yīng)該注意,設(shè)計屬于創(chuàng)造性活動,不能沒有規(guī)矩,但更不能拘囿于規(guī)矩,設(shè)計首先需要人的判斷力和創(chuàng)造精神,這些常常需要凌駕于規(guī)則之上,才能有最大自由的發(fā)揮,才能獲得最佳的效果。圖面向數(shù)據(jù)流設(shè)計方法的過程變換分析法(1)復(fù)查基本系統(tǒng)模型首先應(yīng)該對需求分析階段得到的基本系統(tǒng)模型進(jìn)行復(fù)查,復(fù)查的目的是為了確保輸入數(shù)據(jù)和輸出數(shù)據(jù)符合實際。變換分析法(2)復(fù)查并精化數(shù)據(jù)流圖應(yīng)該對需求分析階段得到的數(shù)據(jù)流圖進(jìn)行復(fù)查,并在必要時進(jìn)行精化。要確保數(shù)據(jù)流圖正確描繪了目標(biāo)系統(tǒng)的業(yè)務(wù)業(yè)務(wù)邏輯,同時要確保數(shù)據(jù)流圖中的每個處理都代表了一個規(guī)模適中、相對獨立的子功能。變換分析法(3)確定數(shù)據(jù)流圖的類型通常,一個系統(tǒng)中的所有信息都可以被認(rèn)為是變換流,但是,當(dāng)遇到有明顯事務(wù)特性的信息流時,還是采用事務(wù)分析的方法進(jìn)行映射。多數(shù)情況是,系統(tǒng)即具有變換特征,也具有事務(wù)特征,因此,在確定系統(tǒng)數(shù)據(jù)流圖的特征時,應(yīng)該從全局角度考慮哪種特征更占優(yōu)。變換分析法(4)確定數(shù)據(jù)流的邊界對于變換流來說,分析確定輸入流和輸出流的邊界,從而孤立出變換中心。對于事務(wù)流來說,分析確定輸入流的邊界,從而孤立出事務(wù)中心。變換分析法在確定邊界時,不同的設(shè)計考慮有不同的取舍標(biāo)準(zhǔn),但是,通常一個處理框的誤差對最終的軟件結(jié)構(gòu)影響不大,況且在到初步軟件結(jié)構(gòu)后,還有優(yōu)化調(diào)整的要求。接下來,選取相應(yīng)的分析方法把系統(tǒng)數(shù)據(jù)流圖映射成變換型結(jié)構(gòu)或事務(wù)型結(jié)構(gòu)。變換分析法(5)完成“第一級分解”傳統(tǒng)方法論中,軟件結(jié)構(gòu)代表對控制自頂向下的分配,所謂分解其實就是分配控制,分配從屬關(guān)系。第一級分解,就是分配軟件結(jié)構(gòu)中的頂層控制。變換分析法對于變換流的情況,位于軟件結(jié)構(gòu)最頂層的總控模塊協(xié)調(diào)以下三個從屬模塊的控制。(1)輸入信息處理控制模塊。此模塊協(xié)調(diào)對所有輸入數(shù)據(jù)的接收。(2)變換中心控制模塊。此模塊管理對內(nèi)部形式的數(shù)據(jù)的所有操作。(3)輸出信息處理控制模塊。此模塊協(xié)調(diào)輸出信息的產(chǎn)生過程。變換分析法(6)完成“第二級分解”進(jìn)行第二級分解就是把數(shù)據(jù)流圖中的每個處理映射成軟件結(jié)構(gòu)中的一個適當(dāng)?shù)哪K。具體到變換流來說,第二級分解就是從變換中心的邊界開始沿著輸入通路向外移動,把輸入通路中每個處理依次映射成軟件結(jié)構(gòu)中的“輸入信息處理控制模塊”控制下的一個低層模塊。變換分析法然后,再從變換中心的邊界開始,沿著輸出通絡(luò)向外移動,把輸出通路中的每個處理依次映射成直接或間接受“輸出信息處理控制模塊”控制的一個低層模塊。最后,把變換中心內(nèi)的每個處理映射成受“變換中心控制模塊“控制的一個個模塊。變換分析法(7)優(yōu)化對經(jīng)過以上步驟得到的結(jié)果按照模塊獨立原理和總體設(shè)計準(zhǔn)則進(jìn)行優(yōu)化。為了產(chǎn)生合理的分解,得到盡可能高的內(nèi)聚、盡可能松散的耦合,最重要的是得到一個易于實現(xiàn)、易于測試、和易于維護(hù)的軟件結(jié)構(gòu),應(yīng)該對初步得到的軟件模塊進(jìn)行再分解或合并。變換分析法機(jī)械地遵循上述映射規(guī)則很可能會得出一些不必要的控制模塊,如果它們確實用處不大,那么應(yīng)該合并它們。如果控制模塊功能過分復(fù)雜,可以適當(dāng)?shù)卦黾又虚g層的控制模塊或者進(jìn)一步將它們分解。變換分析法任何優(yōu)化過程不能違背設(shè)計原理,不能違背問題域常識、不能為了最求所謂的“最佳設(shè)計”而優(yōu)化。設(shè)計的優(yōu)化可能會導(dǎo)出不同的軟件結(jié)構(gòu),要從中選優(yōu),力求得到“最好“的結(jié)構(gòu)。避免把結(jié)構(gòu)的優(yōu)化留到過程設(shè)計階段,這也是把結(jié)構(gòu)設(shè)計和過程設(shè)計分開的價值所在。變換分析法結(jié)構(gòu)簡單往往表明效率高。設(shè)計優(yōu)化應(yīng)該力求做到在有效模塊化的前提下使用盡可能少的模塊數(shù),以及在能夠滿足信息要求的前提下使用最簡單的數(shù)據(jù)結(jié)構(gòu)。切記,不能正常工作的最佳設(shè)計沒有實際意義。正常工作是一切設(shè)計優(yōu)化的基礎(chǔ),高效、最佳只是愿景目標(biāo)。簡單說就是“先使它能工作,然后再使它快起來”。事務(wù)分析法事務(wù)分析的設(shè)計步驟和變換分析的設(shè)計步驟大致相同或類似,區(qū)別僅在于映射方法。由事務(wù)流映射成的軟件結(jié)構(gòu)包括一個接收分支和一個發(fā)送分支。從事務(wù)中心的邊界開始,把接收流童虎的處理映射成模塊。發(fā)送分支由一個調(diào)度模塊控制它下面的所有模塊。然后把數(shù)據(jù)流圖中的每個活動流通路映射成與它的流特征相對應(yīng)的結(jié)構(gòu)。如圖4.14所示??偪亟邮胀氛{(diào)度BACA通
路圖4.14事務(wù)分析映射法事務(wù)分析法一般來說,如果數(shù)據(jù)流圖不具有顯著的事務(wù)特征,最好使用變換分析;反之,則使用事務(wù)分析技術(shù)。對于大型的或復(fù)雜的系統(tǒng),事務(wù)分析和變換分析往往兼而有之。事務(wù)分析法例4.1:由于總體設(shè)計的主要工作開始于對需求分析獲得的數(shù)據(jù)流圖的分析,下面以某個“學(xué)生檔案管理系統(tǒng)”的數(shù)據(jù)流圖為例,運用面向數(shù)據(jù)流的方法設(shè)計其軟件結(jié)構(gòu)。假設(shè)某“學(xué)生檔案管理系統(tǒng)”的數(shù)據(jù)流圖如圖4.15所示,并且假設(shè)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 借款合同的利息規(guī)定
- 商店交易合同
- 方式購銷合同范本模板
- 垃圾桶購銷合同
- 童裝批發(fā)合作協(xié)議
- 高效飲用水處理服務(wù)協(xié)議
- 家居訂購合同范例
- 租賃合同權(quán)益轉(zhuǎn)讓契約
- 倉儲服務(wù)合同范本格式樣本
- 招標(biāo)文件合同范本編寫示例
- 服裝工藝(各工序)單價表
- 聚丙烯腈碳纖維ppt課件
- 年產(chǎn)4萬噸鋁板生產(chǎn)項目建議書寫作模板-立項申批
- 《搬家擇日入宅擇日》書稿
- 銀行二月份事后監(jiān)督情況通報
- 學(xué)校護(hù)學(xué)崗工作應(yīng)急預(yù)案
- 李正中,固體理論,課后習(xí)題答案
- 生本課堂教學(xué)反思
- 留守兒童成長檔案(精編版)
- 統(tǒng)計學(xué)導(dǎo)論曾五一課后習(xí)題答案(完整版)
- 《眼科護(hù)理知識點》演示PPT
評論
0/150
提交評論