軟件工程-04概要設(shè)計_第1頁
軟件工程-04概要設(shè)計_第2頁
軟件工程-04概要設(shè)計_第3頁
軟件工程-04概要設(shè)計_第4頁
軟件工程-04概要設(shè)計_第5頁
已閱讀5頁,還剩175頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章概要設(shè)計1第四章軟件概要設(shè)計4.1軟件設(shè)計的目標(biāo)與準(zhǔn)則4.2軟件設(shè)計工程的任務(wù)4.3創(chuàng)建良好設(shè)計的原則4.4傳統(tǒng)的結(jié)構(gòu)化設(shè)計方法4.5概要設(shè)計評審4.6概要設(shè)計案例2軟件工程4.1軟件設(shè)計的目標(biāo)和準(zhǔn)則軟件設(shè)計的基本目標(biāo)是用比較抽象概括的方式確定目標(biāo)系統(tǒng)如何完成預(yù)定的任務(wù),即軟件設(shè)計是確定系統(tǒng)的物理模型。從技術(shù)觀點來看,軟件設(shè)計包括數(shù)據(jù)設(shè)計、體系結(jié)構(gòu)設(shè)計、接口設(shè)計、過程設(shè)計。有一些設(shè)計目標(biāo)是從用戶那里得到,更多的設(shè)計目標(biāo)是從非功能需求或應(yīng)用領(lǐng)域中抽取出來。設(shè)計目標(biāo)可以從以下5組設(shè)計準(zhǔn)則中選擇。3軟件工程性能準(zhǔn)則設(shè)計準(zhǔn)則定義響應(yīng)時間用戶提交請求后多長時間可得到系統(tǒng)的確認(rèn)吞吐量在一段固定時間內(nèi)系統(tǒng)能夠處理多少任務(wù)內(nèi)存系統(tǒng)運行需要占用多少內(nèi)存空間可靠性準(zhǔn)則設(shè)計準(zhǔn)則定義魯棒性面對非法用戶進(jìn)入后系統(tǒng)的存活能力可靠性明確期待的行為與觀察到行為之間的差別可用性系統(tǒng)能夠用來完成正常任務(wù)的時間百分比容錯性在出錯條件下系統(tǒng)的操作能力保密性系統(tǒng)忍受惡意攻擊的能力安全性再出現(xiàn)錯誤時系統(tǒng)避免威脅到人類生命的能力4軟件工程最終用戶準(zhǔn)則成本準(zhǔn)則設(shè)計準(zhǔn)則定義效用系統(tǒng)支持用戶工作的困難程度易用性用戶使用系統(tǒng)的困難程度設(shè)計準(zhǔn)則定義開發(fā)成本開發(fā)系統(tǒng)初始版本的成本部署成本安裝系統(tǒng)并培訓(xùn)用戶的成本升級成本從原有系統(tǒng)中導(dǎo)出數(shù)據(jù)的成本,此準(zhǔn)則導(dǎo)致了向后兼容性需求維護成本需要進(jìn)行錯誤修復(fù)和增強系統(tǒng)的成本管理成本需要對系統(tǒng)進(jìn)行管理的成本5軟件工程維護準(zhǔn)則性能、可靠性和最終用戶準(zhǔn)則往往從需求中明確地獲取,也可以從應(yīng)用領(lǐng)域中獲??;而成本和維護準(zhǔn)則由客戶和供應(yīng)商提出。設(shè)計準(zhǔn)則定義可擴展性向系統(tǒng)中添加功能或新類的困難程度可修改性更改系統(tǒng)功能的困難程度可適應(yīng)性將系統(tǒng)發(fā)送到不同應(yīng)用領(lǐng)域的困難程度可移植性將系統(tǒng)移植到不同平臺的困難程度可讀性通過閱讀源代碼來理解系統(tǒng)的困難程度需求的可追蹤性將代碼映射到特定需求上的困難程度6軟件工程在定義設(shè)計目標(biāo)時,希望開發(fā)一個既安全可靠,又廉價的系統(tǒng)是不現(xiàn)實的,因此開發(fā)人員應(yīng)當(dāng)對所有可能的設(shè)計目標(biāo)進(jìn)行權(quán)衡,對必須的設(shè)計目標(biāo)賦予優(yōu)先級別。一旦有了清晰的設(shè)計目標(biāo),就可以開始系統(tǒng)的初始分解。權(quán)衡基本原則空間與速度如果軟件的響應(yīng)時間或吞吐量不滿足需求,則可以使用更多的存儲空間來加快軟件的執(zhí)行速度。如果軟件太大,則可以犧牲一定的速度對數(shù)據(jù)進(jìn)行壓縮處理。7軟件工程權(quán)衡基本原則交付時間與功能如果開發(fā)進(jìn)度滯后于計劃,則按時交付的功能可以少于預(yù)定交付的功能,或推遲交付所有功能。契約軟件通常更強調(diào)功能,而商業(yè)外購軟件則更強調(diào)交付日期。交付時間與質(zhì)量如果測試滯后于計劃,則可以按時交付帶有錯誤的軟件,或推遲交付帶有少量錯誤的軟件。交付時間與人員配置如果開發(fā)進(jìn)度滯后于計劃,可以在項目中增加資源以提高生產(chǎn)率。在多數(shù)情況下,這種選擇只適用于早期項目。新的人員要經(jīng)過培訓(xùn)方可使用。這樣中途增加資源通常會降低生產(chǎn)率,還會增加軟件開發(fā)的成本。8軟件工程4.2軟件設(shè)計工程的任務(wù)軟件設(shè)計工程的任務(wù)是基于需求分析的結(jié)果建立各種設(shè)計模型,給出問題解決的方案。軟件設(shè)計是將用戶需求準(zhǔn)確地轉(zhuǎn)化成為最終的軟件產(chǎn)品的唯一途徑,在需求到實現(xiàn)之間起到了橋梁作用。在軟件設(shè)計階段,需要在多種設(shè)計方案之中進(jìn)行決策和折中,并使用選定的方案進(jìn)行后續(xù)的開發(fā)活動。設(shè)計決策將最終影響軟件實現(xiàn)的成敗,同時也將影響到軟件維護。9軟件工程軟件設(shè)計既是過程又是模型。設(shè)計過程是一系列的迭代步驟,使設(shè)計人員能夠描述目標(biāo)系統(tǒng)的各個側(cè)面。設(shè)計模型首先描述目標(biāo)系統(tǒng)的整體架構(gòu),然后逐步細(xì)化架構(gòu)得到構(gòu)造每個細(xì)節(jié)的指導(dǎo)原則,從而得到系統(tǒng)的一系列不同的視圖。軟件設(shè)計是后續(xù)開發(fā)步驟及軟件維護工作的基礎(chǔ)。如果沒有設(shè)計,只能建立一個不穩(wěn)定的系統(tǒng)結(jié)構(gòu)。軟件設(shè)計的概念10軟件工程所謂的“不穩(wěn)定”,是指每次修改,都會導(dǎo)致系統(tǒng)結(jié)構(gòu)整體的變更,不但費時費力,還會引入新的錯誤,降低軟件質(zhì)量。設(shè)計編碼測試維護測試編碼維護有軟件設(shè)計沒有軟件設(shè)計11軟件工程從工程管理角度來看,軟件設(shè)計分兩步完成:概要設(shè)計和詳細(xì)設(shè)計。概要設(shè)計是將軟件的需求轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)和軟件的系統(tǒng)結(jié)構(gòu);確定系統(tǒng)設(shè)計方案將軟件需求轉(zhuǎn)化為軟件體系結(jié)構(gòu)確定系統(tǒng)級接口全局?jǐn)?shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)庫模式。詳細(xì)設(shè)計是軟件結(jié)構(gòu)表示的細(xì)化,得到軟件的詳細(xì)數(shù)據(jù)結(jié)構(gòu)表達(dá)和具體算法描述。

過程設(shè)計即確立每個模塊的實現(xiàn)算法數(shù)據(jù)設(shè)計即局部數(shù)據(jù)結(jié)構(gòu)模塊接口設(shè)計軟件設(shè)計的階段與任務(wù)

12軟件工程從技術(shù)的角度,采用的方法不同會有所不同:傳統(tǒng)的結(jié)構(gòu)化方法將軟件設(shè)計劃分為體系結(jié)構(gòu)設(shè)計、數(shù)據(jù)設(shè)計、接口設(shè)計及過程設(shè)計四部分;面向?qū)ο蠓椒▌t將軟件設(shè)計劃分為體系結(jié)構(gòu)設(shè)計、類設(shè)計∕數(shù)據(jù)設(shè)計、接口設(shè)計、構(gòu)件級設(shè)計四部分。

軟件設(shè)計的階段與任務(wù)

13軟件工程體系結(jié)構(gòu)設(shè)計 體系結(jié)構(gòu)設(shè)計定義軟件的主要結(jié)構(gòu)元素及其之間的關(guān)系。體系結(jié)構(gòu)設(shè)計表示可以從系統(tǒng)規(guī)格說明、分析模型(如對象類或數(shù)據(jù)流圖)及體系結(jié)構(gòu)的風(fēng)格導(dǎo)出。類設(shè)計 類設(shè)計對分析階段所建立的對象類模型進(jìn)行細(xì)化,轉(zhuǎn)化為設(shè)計類的實現(xiàn)及軟件實現(xiàn)所要求的數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)設(shè)計14軟件工程 傳統(tǒng)方法主要根據(jù)需求階段所建立的實體-關(guān)系圖(E-R圖)來確定軟件涉及的文件系統(tǒng)的結(jié)構(gòu)及數(shù)據(jù)庫的表結(jié)構(gòu)。面向?qū)ο蠓椒ǜ鶕?jù)類設(shè)計導(dǎo)出數(shù)據(jù)設(shè)計。接口設(shè)計 接口設(shè)計描述用戶界面,軟件和其他系統(tǒng)元素如硬件設(shè)備、其他軟件系統(tǒng)及使用人員的外部接口,以及各種構(gòu)件之間的內(nèi)部接口。構(gòu)件級設(shè)計 構(gòu)件級設(shè)計將軟件體系結(jié)構(gòu)的結(jié)構(gòu)元素變換為對軟件構(gòu)件的過程性描述。從基于類的模型、15軟件工程 數(shù)據(jù)流模型及行為模型獲得的信息可以作為構(gòu)件設(shè)計的基礎(chǔ)。過程設(shè)計 過程設(shè)計的主要工作是確定軟件各個組成部分內(nèi)的算法及內(nèi)部數(shù)據(jù)結(jié)構(gòu),并選定某種過程的表達(dá)形式來描述各種算法。軟件設(shè)計過程中所有基本技術(shù)活動的經(jīng)典設(shè)計過程流程如圖

軟件設(shè)計的過程16軟件工程否設(shè)計輸入設(shè)計輸入的評審制定技術(shù)規(guī)范確定運行環(huán)境數(shù)據(jù)設(shè)計質(zhì)量設(shè)計體系結(jié)構(gòu)設(shè)計運行設(shè)計復(fù)用模塊的選擇與確定概要設(shè)計說明的編寫與評審是否需要修改設(shè)計?實施設(shè)計更改是否詳細(xì)設(shè)計是否需要修改設(shè)計?實施設(shè)計更改進(jìn)入實現(xiàn)階段是詳細(xì)設(shè)計說明的編寫與評審17軟件工程概要設(shè)計過程選定體系結(jié)構(gòu)軟件總體結(jié)構(gòu)設(shè)計按照結(jié)構(gòu)化設(shè)計方法把一個復(fù)雜的系統(tǒng)按功能劃分模塊,并確定每個模塊的功能。確定模塊之間的調(diào)用關(guān)系。確定系統(tǒng)的外部接口和內(nèi)部接口分析數(shù)據(jù)流圖,弄清數(shù)據(jù)流圖加工的過程,決定數(shù)據(jù)處理問題的類型(事務(wù)或變換)18軟件工程概要設(shè)計過程對初始結(jié)構(gòu)圖進(jìn)行改進(jìn)完善確定系統(tǒng)包含哪些應(yīng)用服務(wù)系統(tǒng)、客戶端、數(shù)據(jù)庫管理系統(tǒng);確定每個模塊放在哪個應(yīng)用服務(wù)器或客戶端的哪個目錄、哪個文件或是在數(shù)據(jù)庫內(nèi)建立的對象,落實體系結(jié)構(gòu)。進(jìn)行主要的算法設(shè)計進(jìn)行異常處理設(shè)計制定設(shè)計規(guī)范編寫概要設(shè)計說明書19軟件工程良好的設(shè)計原則可為設(shè)計過程導(dǎo)航。設(shè)計應(yīng)遵循抽象化的原則,包含數(shù)據(jù)抽象和過程抽象。過程抽象是指在軟件設(shè)計中將處理過程的實現(xiàn)細(xì)節(jié)隱藏在數(shù)據(jù)抽象中,可以直接通過模塊接口使用這些處理操作。數(shù)據(jù)抽象是指采用抽象數(shù)據(jù)類型表示數(shù)據(jù),實現(xiàn)數(shù)據(jù)封裝,使得使用者可通過接口使用數(shù)據(jù)而不必關(guān)心數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)。創(chuàng)建良好設(shè)計的原則

20軟件工程例1:考慮適用于低級CAD的圖形軟件包。又抽象Ⅰ該CAD軟件系統(tǒng)配有能與繪圖員進(jìn)行可視化通信的圖形界面,能用鼠標(biāo)代替繪圖工具,畫各種直線和曲線;能完成所有幾何計算以及所有截面視圖和輔助視圖的設(shè)計。圖形設(shè)計的結(jié)果存在圖形文件中,圖形文件可包含幾何的、正文的和其他各種補充設(shè)計信息。顯而易見,在這一抽象級別上,用問題域本身的術(shù)語來描述問題的解。抽象與逐步求精21軟件工程抽象ⅡCAD軟件任務(wù);用戶界面子任務(wù);創(chuàng)建二維圖形子任務(wù);顯示圖形子任務(wù);管理圖形文件子任務(wù);

endCAD.

在這一抽象級別上,給出了組成CAD軟件任務(wù)的所有主要子任務(wù),盡管術(shù)語已與問題域有所不同,但仍然不是實現(xiàn)所用的語言。抽象與逐步求精22軟件工程抽象Ⅲ(僅以“創(chuàng)建二維圖形子任務(wù)”為例)

PROCEDURE創(chuàng)建二維圖形

REPEATUNTIL<創(chuàng)建圖形任務(wù)終止>DOWHILE<出現(xiàn)與數(shù)字儀的交互時>

數(shù)字儀接口任務(wù);判斷作圖請求:線:畫線任務(wù);圓:畫圓任務(wù);┇

END;抽象與逐步求精23軟件工程

DOWHILE<出現(xiàn)與鍵盤的交互時>

鍵盤接口任務(wù);選擇分析或計算:輔助視圖:輔助視圖任務(wù);截面視圖:截面視圖任務(wù);┇

END;┇

ENDREPEAT;ENDPROCEDURE.抽象與逐步求精24軟件工程在這一抽象級別上,給出了初步的過程性表示,此時所有術(shù)語都是面向軟件(比如采用do?while結(jié)構(gòu))并且模塊結(jié)構(gòu)也開始明朗。求精過程還可繼續(xù)下去,直至產(chǎn)生源代碼。抽象與逐步求精25軟件工程數(shù)據(jù)抽象與過程抽象一樣,能使設(shè)計者按不同的詳細(xì)程度表示數(shù)據(jù)對象。仍以CAD軟件為例,我們可定義一個稱為drawing(圖)的數(shù)據(jù)對象:TYPEdrawingISSTRUCTUREDEFINEDnumberISSTRINGLENGTH(12);geometryDEFINED…notesISSTRINGLENGTH(256);

bomDEFINED…ENDdrawingTYPE;數(shù)據(jù)抽象26軟件工程數(shù)據(jù)抽象在此,drawing被表示為一種結(jié)構(gòu),其各個組成部件本身又可為某種數(shù)據(jù)抽象,比如geometry(幾何圖形)和bom。一旦抽象數(shù)據(jù)類型drawing定義完畢,即可用類型名直接說明數(shù)據(jù)對象,而不必涉及其內(nèi)部構(gòu)造的細(xì)節(jié),例如,可用語句:blueprintISINSTANCEOFdrawing;

schematicISINSTANCEOFdrawing;

說明blueprint和schematic具有drawing的一切特性。blueprint——藍(lán)圖,schematic——簡(略)圖。27軟件工程數(shù)據(jù)抽象在抽象數(shù)據(jù)類型的定義中可以附加一組操作的定義,用以確定在此類數(shù)據(jù)對象上可進(jìn)行的操作。以抽象數(shù)據(jù)類型drawing為例,可以定義擦除(erase)、存儲(save)、分類(catalog)和拷貝(copy)等操作。許多程序設(shè)計語言都提供了對抽象數(shù)據(jù)類型的支持,Ada

的程序包機制是對數(shù)據(jù)抽象和過程抽象的雙重支持28軟件工程設(shè)計應(yīng)當(dāng)遵循模塊化的原則。每個模塊可獨立地開發(fā)、測試,最后組裝成完整的程序。其出發(fā)點是本著將一種復(fù)雜問題“分而治之”的原則。其目的是使程序的結(jié)構(gòu)清晰,容易閱讀、理解、測試、修改。Meyer的良好模塊設(shè)計方法的標(biāo)準(zhǔn)模塊可分解性可將系統(tǒng)按問題/子問題分解的原則分解成系統(tǒng)的模塊層次結(jié)構(gòu);模塊可組裝性可利用已有的設(shè)計構(gòu)件組裝成新系統(tǒng),不必一切從頭開始。29軟件工程模塊可理解性一個模塊可不參考其他模塊而被理解;模塊連續(xù)性對軟件需求的一些微小變更只導(dǎo)致對某個模塊的修改而整個系統(tǒng)不用大動;模塊保護將模塊內(nèi)出現(xiàn)異常情況的影響范圍限制在模塊內(nèi)部;設(shè)計應(yīng)遵循信息隱蔽的原則。Parnas主張在開發(fā)時,將每個程序的成分隱藏在模塊內(nèi),定義每一個模塊時盡可能少地顯露其內(nèi)部的處理。30軟件工程每個模塊的實現(xiàn)細(xì)節(jié)對于其它模塊是隱蔽的,將來修改軟件時偶然引入錯誤所造成的影響就可以局限在一個或幾個模塊內(nèi)部,不致波及到軟件的其它部分。在可預(yù)見將來可能修改的場合,信息隱蔽可以提高軟件的可修改性、可測試性和可移植性。模塊(求一元二次方程的根)a,b,c根計算一元二次方程根的所有軟件元素(如局部變量,計算公式等)局部化31軟件工程4.模塊獨立性如果一個模塊能夠獨立于其他模塊被編程、測試和修改,則該模塊具有模塊獨立性。它是抽象、模塊化和信息隱蔽的直接產(chǎn)物。1978年Myers提出用兩個準(zhǔn)則來度量功能獨立性,即模塊間的耦合和模塊的內(nèi)聚。內(nèi)聚性:內(nèi)聚是一個模塊內(nèi)部各個元素彼此結(jié)合的緊密程度的度量。耦合性:耦合是模塊間互相連接的緊密程度的度量,它取決于各個模塊之間接口的復(fù)雜度、調(diào)用方式以及哪些信息通過接口。模塊之間的耦合性越高,其模塊獨立性就越弱。模塊的內(nèi)聚性越高,它與其他模塊之間的耦合性就會降低,而模塊獨立性就越強。

32軟件工程盡可能增加內(nèi)聚不同內(nèi)聚類型:內(nèi)聚性從高到低排序功能內(nèi)聚層內(nèi)聚通信內(nèi)聚順序內(nèi)聚過程內(nèi)聚時間內(nèi)聚實用程序內(nèi)聚高內(nèi)聚性低強模塊獨立性弱33軟件工程盡可能增加內(nèi)聚(1) 功能內(nèi)聚

一個模塊中各個部分都是為了完成一項具體功能而協(xié)同工作,緊密聯(lián)系,不可分割的。這種模塊就是功能內(nèi)聚模塊。功能內(nèi)聚模塊的模塊獨立性最強。功能內(nèi)聚的內(nèi)聚度最高,概要設(shè)計中要追求的目標(biāo)。滿足功能內(nèi)聚的模塊只執(zhí)行一個功能,這是一個判斷模塊是否是功能內(nèi)聚的方法。34軟件工程層內(nèi)聚 相關(guān)服務(wù)放在一起,并有嚴(yán)格的層次結(jié)構(gòu),高層服務(wù)可訪問低層服務(wù),反之不可。如分層結(jié)構(gòu)。用戶界面訪問操作系統(tǒng)訪問數(shù)據(jù)庫網(wǎng)絡(luò)通信應(yīng)用邏輯應(yīng)用程序的典型層次內(nèi)核(處理過程和交換)屏幕顯示功能用戶帳號管理文件系統(tǒng)應(yīng)用程序操作系統(tǒng)的典型層次35軟件工程通信內(nèi)聚 訪問或操作同一數(shù)據(jù)的過程放在一個類中,這些過程可以互相通信。如某個類設(shè)計。初始化插入刪除查找修改符號表36軟件工程通信內(nèi)聚通信內(nèi)聚例子如果一個模塊內(nèi)各組成部分的處理動作都使用相同的輸入數(shù)據(jù)或相同的輸出數(shù)據(jù),稱為通訊聚合。37軟件工程案例:通信內(nèi)聚獲得配件單價和庫存量配件編號庫存量單價兩個工作:1.按配件編號查詢“數(shù)據(jù)存儲”,獲得單價。2.按配件編號查詢“數(shù)據(jù)存儲”,獲得庫存量。這兩個處理動作都使用相同的輸入數(shù)據(jù),稱為通訊聚合。38軟件工程順序內(nèi)聚:存在一系列過程,其中一個過程向另一個過程提供輸入,這些過程放在一起,形成順序內(nèi)聚。如面向?qū)ο笙到y(tǒng)中的消息序列。過程內(nèi)聚:幾個一次調(diào)用的操作放在一個模塊中,它們是相關(guān)的且必須以特定次序執(zhí)行,則稱這個模塊為過程內(nèi)聚模塊。但在這種模塊內(nèi),一個操作的輸出不一定是下一個操作的輸入。如調(diào)用結(jié)構(gòu)。39軟件工程循環(huán)體計算累積事務(wù)記錄累積銷售額累積訂貨量通過循環(huán)體,計算兩種累積數(shù)。寫一個記錄讀一個記錄判定調(diào)用模塊被調(diào)用模塊40軟件工程時間內(nèi)聚:程序執(zhí)行過程中同一階段內(nèi)完成的操作放在一起,達(dá)到時間內(nèi)聚。例如:程序設(shè)計中的初始化模塊實用程序內(nèi)聚:邏輯上不能納入其他內(nèi)聚類型的相關(guān)實用程序放在一起,形成實用程序內(nèi)聚。如可復(fù)用的過程或類。41軟件工程功能內(nèi)聚功能內(nèi)聚如果一個模塊的各個成分都是完成某個具體任務(wù)必不可少的成分,這些成分協(xié)同工作,緊密聯(lián)系,不可分割,則稱為功能內(nèi)聚。功能內(nèi)聚的內(nèi)聚度最高,概要設(shè)計中要追求的目標(biāo)。滿足功能內(nèi)聚的模塊只執(zhí)行一個功能,這是一個判斷模塊是否是功能內(nèi)聚的方法。42軟件工程模塊內(nèi)聚巧合邏輯時間過程通信順序功能內(nèi)聚內(nèi)聚內(nèi)聚內(nèi)聚內(nèi)聚內(nèi)聚內(nèi)聚內(nèi)聚性模塊獨立性43軟件工程該模塊只能完成一個模塊嗎模塊內(nèi)各組成部分的關(guān)系如何次序重要嗎次序重要嗎邏輯相似嗎功能內(nèi)聚過程內(nèi)聚通信內(nèi)聚順序內(nèi)聚時間內(nèi)聚邏輯內(nèi)聚偶然內(nèi)聚否是數(shù)據(jù)流控制流兩者都不是是是是否否否44軟件工程6.盡可能降低耦合

主程序子程序1子程序2模塊之間無連接,則無耦合主程序子程序1子程序2模塊之間存在連接,則存在耦合耦合是模塊之間的互連程度度量模塊之間的連接有:調(diào)用,返回,進(jìn)入,跳出45軟件工程盡可能降低耦合模塊間存在相互依賴關(guān)系即為耦合。不同耦合類型按照耦合性從高向低排列有:內(nèi)容耦合 如果發(fā)生下列情形,模塊間就是內(nèi)容耦合:一個模塊直接訪問另一個模塊的內(nèi)部數(shù)據(jù);緊密耦合性松散弱模塊獨立性強內(nèi)容公共控制標(biāo)記數(shù)據(jù)例程調(diào)類型使外部耦合耦合耦合耦合耦合用耦合用耦合耦合46軟件工程一個模塊不通過正常入口轉(zhuǎn)到另一模塊內(nèi)部;兩個模塊有一部分程序代碼重迭(只可能出現(xiàn)在匯編語言中);

內(nèi)容耦合始終要避免它。AB進(jìn)入另一模塊內(nèi)部模塊代碼重疊AB47軟件工程(2)公共耦合

若一組模塊都訪問同一個公共數(shù)據(jù)環(huán)境,則它們之間的耦合就是公共耦合。公共數(shù)據(jù)環(huán)境可以是全局變量、全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等。這種耦合會引起下列問題:所有公共耦合模塊都與某一個公共數(shù)據(jù)環(huán)境內(nèi)部各項的物理安排有關(guān),若某個數(shù)據(jù)的大小被修改,將會影響到所有的模塊。無法控制各個模塊對公共數(shù)據(jù)的存取,嚴(yán)重影響軟件模塊的可靠性和適應(yīng)性。48軟件工程公共數(shù)據(jù)名的使用,明顯降低了程序的可讀性。公共耦合的復(fù)雜程度隨耦合模塊的個數(shù)增加而顯著增加。若只是兩模塊間有公共數(shù)據(jù)環(huán)境,則公共耦合有兩種情況。松散公共耦合和緊密公共耦合。common公共數(shù)據(jù)區(qū)ABcommon公共數(shù)據(jù)區(qū)AB松散的公共耦合緊密的公共耦合49軟件工程控制耦合 一個過程通過標(biāo)志、開關(guān)或命令顯式地控制另一個過程 的動作,就產(chǎn) 生控制耦合。FlagFlagf1f2fn50軟件工程A計算平均分或最高分B平均/最高(控制信號)成績讀入分?jǐn)?shù)輸出結(jié)果計算平均分計算最高分平均/最高?B控制耦合增加了理解和編程的復(fù)雜性,調(diào)用模塊必須知道被調(diào)模塊的內(nèi)部邏輯,增加了相互依賴去除模塊間控制耦合的方法:(1)找出模塊調(diào)用時所用的一個或多個控制變量。(2)在被調(diào)用模塊中根據(jù)控制變量找出所有的流程。(5)將每一個流程分解為一個獨立的模塊。(4)將被調(diào)用模塊內(nèi)的判定上移到調(diào)用模塊中進(jìn)行標(biāo)記耦合如果一組模塊通過參數(shù)表傳遞結(jié)構(gòu)或?qū)ο螅ㄗ⒁?,不是簡單變量或結(jié)構(gòu)中的某一分量),就是標(biāo)記耦合。事實上,這組模塊共享了這個結(jié)構(gòu)或?qū)ο?。這要求這些模塊都必須清楚該結(jié)構(gòu)或?qū)ο蟮膬?nèi)部細(xì)節(jié),并按結(jié)構(gòu)要求對此結(jié)構(gòu)或?qū)ο筮M(jìn)行操作。

p0(x0,y0)p1(x1,y1)畫線段函數(shù)

LINE(p0,p1)即為標(biāo)記耦合53軟件工程標(biāo)記耦合計算水費和電費計算水費計算電費住戶詳情水費住戶詳情電費模塊之間的特征聯(lián)結(jié)54軟件工程數(shù)據(jù)耦合如果模塊之間的訪問是通過數(shù)據(jù)參數(shù)(不是控制參數(shù)、結(jié)構(gòu)或?qū)ο髤?shù)、公共數(shù)據(jù)結(jié)構(gòu))來交換輸入、輸出信息的,則稱這種耦合為數(shù)據(jù)耦合。由于限制了只通過參數(shù)表傳遞數(shù)據(jù),數(shù)據(jù)耦合是松散的耦合,模塊之間的獨立性比較強數(shù)據(jù)耦合LINE(x0,y0,x1,y1)p0(x0,y0)p1(x1,y1)55軟件工程數(shù)據(jù)耦合開發(fā)貨單計算金額單價數(shù)量金額56軟件工程特征耦合與數(shù)據(jù)耦合的相互轉(zhuǎn)換計算水費和電費計算水費計算電費本月用水量水費本月用電量電費模塊之間的特征聯(lián)結(jié)57軟件工程改控制耦合為數(shù)據(jù)耦合舉例A計算平均分B1平均成績最高成績計算最高分B2例程調(diào)用耦合一個程序(或?qū)ο蟮牟僮鳎┱{(diào)用另一個程序(或另一個對象的操作),就產(chǎn)生例程調(diào)用耦合。如果幾個程序之間出現(xiàn)例程調(diào)用耦合,就意味著它們必須依賴對方的行為,而且調(diào)用者依賴被調(diào)用者的接口。在所有的系統(tǒng)中都存在這種類型的耦合。類型使用耦合類將實例變量或本地變量聲明為另一個類的實例,就產(chǎn)生類型(嵌套)耦合。59軟件工程典型的事例如在定義一個“幾何圖形”類時用到了“點”類的實例。類型使用耦合的問題是:當(dāng)類型定義改變時,該類型的使用者也必須改變。

包含/引入耦合一個構(gòu)件引入(import)一個包時就產(chǎn)生引入耦合,一個構(gòu)件包含(include)另一個構(gòu)件時,就產(chǎn)生包含耦合。包含∕引入耦合是必需的,因為它允許你使用庫或其他子系統(tǒng)的功能。但要注意可能的副作用。例如操作同名。

60軟件工程外部耦合 模塊對外部系統(tǒng),如操作系統(tǒng)、共享庫或硬件有依賴關(guān)系時就產(chǎn)生外部耦合。可通過信息隱蔽減少這種依賴關(guān)系。實際上,兩個模塊之間的耦合不只是一種類型,而是多種類型的混合。這就要求設(shè)計者按照降低耦合性的原則進(jìn)行比較和分析,逐步加以改進(jìn)。

盡可能提高抽象層次設(shè)計應(yīng)隱藏或推遲考慮細(xì)節(jié)以降低復(fù)雜性。61軟件工程類是包含過程抽象的數(shù)據(jù)抽象。使用泛化關(guān)系(父類)和接口,可進(jìn)一步提高抽象層次。類中公有操作越少,抽象程度越高。類中所有變量都是私有的,抽象程度達(dá)到最高。抽象可確保在設(shè)計時不必關(guān)心不必要的細(xì)節(jié),能把握問題的本質(zhì)并做出重要決策。盡可能提高可復(fù)用性復(fù)用性設(shè)計有兩方面的含義:62軟件工程盡量使用已有的構(gòu)件(包括開發(fā)環(huán)境提供的及以往開發(fā)類似系統(tǒng)時創(chuàng)建的);在設(shè)計時就應(yīng)該考慮將來的重復(fù)利用問題,有意識地按照可復(fù)用構(gòu)件的要求建立自己的設(shè)計。復(fù)用構(gòu)件的機制包括過程調(diào)用和繼承父類。在軟件設(shè)計中引入復(fù)用性的方法有:使設(shè)計盡可能通用(數(shù)據(jù)類型參數(shù)化,所有數(shù)據(jù)自包含);提高構(gòu)件的獨立性和抽象性(提高內(nèi)聚、降低耦合、提高抽象性);63軟件工程設(shè)計系統(tǒng)時要包含鉤子(建立一些表格或鏈接,用以納入新的功能);盡量簡化設(shè)計(只做簡單事情,易于與其他構(gòu)件配合,輸入∕輸出單一);

可以在算法、類、過程、框架和完整應(yīng)用程序的級別上創(chuàng)建可復(fù)用性。靈活性設(shè)計積極預(yù)測將來可能在實現(xiàn)和功能方面的變化,并采取相應(yīng)措施。在設(shè)計中引入靈活性的方法有:降低耦合并提高內(nèi)聚(提高替換能力)64軟件工程建立抽象(創(chuàng)建有多態(tài)操作的接口和父類)不要將代碼寫死(消除代碼中的常數(shù))拋出異常(由操作的調(diào)用者處理異常)使用并創(chuàng)建可復(fù)用的代碼預(yù)防過期積極預(yù)測將來可能在技術(shù)和運行環(huán)境上的變化,并為此采取相應(yīng)措施。在設(shè)計中應(yīng)遵循的預(yù)計過期的規(guī)則有:避免使用早期發(fā)布的技術(shù)避免使用針對特定環(huán)境的軟件庫65軟件工程避免使用軟件庫中未編檔的或很少使用的功能避免使用小公司或可能不提供長期支持的公司提供的可復(fù)用構(gòu)件或特殊硬件使用眾多廠商支持的標(biāo)準(zhǔn)語言和技術(shù)可移植性設(shè)計可移植性設(shè)計的主要目標(biāo)是讓軟件在盡可能多的平臺上運行。實現(xiàn)可移植性的規(guī)則有:避免使用特定環(huán)境的專有功能66軟件工程使用不依賴特定平臺的程序設(shè)計語言小心使用可能依賴某一平臺的類庫了解其他語言可能依賴特殊硬件結(jié)構(gòu)的功能和文本文件的差異可測試性設(shè)計設(shè)計時采取措施使得測試易于進(jìn)行??蓽y試性設(shè)計的最重要的方法是保證代碼的所有功能都能脫離圖形用戶界面執(zhí)行。需要考慮的可測試性設(shè)計的規(guī)則如下:堅持測試驅(qū)動設(shè)計(測試先行)的方法。。67軟件工程函數(shù)小型化。盡量做到一個函數(shù)對應(yīng)一個操作,使函數(shù)小型化。數(shù)據(jù)的顯示與控制分離。將處理代碼與GUI分離。這樣,各種GUI動作就變成了模型上的簡單方法調(diào)用。防御性設(shè)計為提高可靠性,應(yīng)確保不引入任何缺陷,能夠處理其他代碼不適當(dāng)使用構(gòu)件引起的問題。按契約設(shè)計是防御性設(shè)計技術(shù),其核心思想:被調(diào)用操作中設(shè)置為正常執(zhí)行必須滿足的前置條件(precondition):68軟件工程被調(diào)用操作正常執(zhí)行所得到的結(jié)果即為后置條件(postcondition):要求被調(diào)用操作在返回前有責(zé)任保證這些后置條件成立。被調(diào)用操作在執(zhí)行時確保不會被修改的不變量(invariant)。前置條件、后置條件和不變式都是布爾表達(dá)式,其計算結(jié)果為假,表示有錯誤發(fā)生。可以使用斷言機制。在重要構(gòu)件的邊界(如層)應(yīng)始終保留嚴(yán)格的斷言檢測。69軟件工程結(jié)構(gòu)化設(shè)計(structureddesign,SD)是一種面向數(shù)據(jù)流的設(shè)計方法,它可以與SA方法銜接。結(jié)構(gòu)化設(shè)計是基于模塊化、自頂向下細(xì)化、結(jié)構(gòu)化程序設(shè)計等程序設(shè)計技術(shù)基礎(chǔ)上發(fā)展起來的。基本思想是將系統(tǒng)設(shè)計成由相對獨立、功能單一的模塊組成的結(jié)構(gòu)。4.4傳統(tǒng)的結(jié)構(gòu)化設(shè)計方法70軟件工程該方法實施的要點是:首先研究、分析和審查數(shù)據(jù)流圖。從軟件的需求規(guī)格說明中弄清數(shù)據(jù)流加工的過程,對于發(fā)現(xiàn)的問題及時解決。然后根據(jù)數(shù)據(jù)流圖確定數(shù)據(jù)處理的類型。典型的類型有兩種:變換型和事務(wù)型。針對兩種不同類型分別進(jìn)行分析處理。由數(shù)據(jù)流圖推導(dǎo)出系統(tǒng)的初始結(jié)構(gòu)圖。利用一些啟發(fā)式原則改進(jìn)系統(tǒng)初始結(jié)構(gòu)圖,直到得到符合要求的結(jié)構(gòu)圖為止。修改和補充數(shù)據(jù)字典。制定測試計劃。71軟件工程將分析模型轉(zhuǎn)換為設(shè)計數(shù)據(jù)字典數(shù)據(jù)流圖實體關(guān)系圖狀態(tài)轉(zhuǎn)換圖加工規(guī)格說明控制規(guī)格說明數(shù)據(jù)對象描述過程設(shè)計接口設(shè)計體系結(jié)構(gòu)設(shè)計數(shù)據(jù)設(shè)計72軟件工程結(jié)構(gòu)化設(shè)計工具結(jié)構(gòu)化設(shè)計的核心是軟件結(jié)構(gòu)的設(shè)計。描述軟件結(jié)構(gòu)的工具主要有:IPO圖和模塊結(jié)構(gòu)圖。軟件結(jié)構(gòu)設(shè)計的常用方法是結(jié)構(gòu)化設(shè)計方法。IPO圖模塊結(jié)構(gòu)圖73軟件工程在系統(tǒng)結(jié)構(gòu)圖中的模塊傳入模塊

─從下屬模塊取得數(shù)據(jù),經(jīng)過某些處理,再將其傳送給上級模塊。它傳送的數(shù)據(jù)流叫做邏輯輸入數(shù)據(jù)流。傳出模塊

─從上級模塊獲得數(shù)據(jù),進(jìn)行某些處理,再將其傳送給下屬模塊。它傳送的數(shù)據(jù)流叫做邏輯輸出數(shù)據(jù)流。變換模塊

─從上級模塊取得數(shù)據(jù),進(jìn)行變換處理,轉(zhuǎn)換成其它形式,再傳送回上級模塊。協(xié)調(diào)模塊─對所有下屬模塊進(jìn)行協(xié)調(diào)和管理的模塊。74軟件工程傳入模塊AA傳出模塊DD變換模塊AB協(xié)調(diào)模塊AABB模塊類型圖示75軟件工程系統(tǒng)結(jié)構(gòu)圖的基本符號模塊調(diào)用數(shù)據(jù)控制信息轉(zhuǎn)接符號系統(tǒng)結(jié)構(gòu)圖的基本符號選擇(判斷)重復(fù)76軟件工程模塊調(diào)用示例(a)調(diào)用(b)判斷調(diào)用(c)循環(huán)調(diào)用77軟件工程產(chǎn)生最佳解的結(jié)構(gòu)圖78軟件工程數(shù)據(jù):模塊之間傳送的數(shù)據(jù)用帶空心圓的箭頭表示,并在旁邊標(biāo)上數(shù)據(jù)名??刂菩畔ⅲ嚎刂菩畔⑴c數(shù)據(jù)的主要區(qū)別是前者只反映數(shù)據(jù)的某種狀態(tài)。模塊間的數(shù)據(jù)傳遞AB(a)xyz查職工簡歷讀人事文件(b)職工號簡歷數(shù)據(jù)無此職工79軟件工程1.

確定信息流的類型;

2.

劃定流界;

3.

將數(shù)據(jù)流圖映射為程序結(jié)構(gòu);

4.

提取層次控制結(jié)構(gòu);

5.

通過設(shè)計復(fù)審和使用啟發(fā)式策略進(jìn)一步精化所得到的結(jié)構(gòu)。SD方法的設(shè)計過程80軟件工程數(shù)據(jù)處理的類型

在需求分析階段,面向數(shù)據(jù)流的SA方法產(chǎn)生數(shù)據(jù)流圖DFD。在軟件設(shè)計階段,面向數(shù)據(jù)流的SD方法將DFD轉(zhuǎn)換成程序結(jié)構(gòu)圖。數(shù)據(jù)處理即為在DFD中從系統(tǒng)的輸入數(shù)據(jù)流到系統(tǒng)的輸出數(shù)據(jù)流所經(jīng)歷的一連串連續(xù)變換。數(shù)據(jù)處理的類型分為變換流型與事務(wù)流型。

81軟件工程1、變換流變換流—在基本系統(tǒng)模型(即頂級數(shù)據(jù)流圖)中信息通常以“外部世界”所具有的形式進(jìn)入系統(tǒng),經(jīng)過處理后又以這種形式離開系統(tǒng)。輸入流外部表示內(nèi)部表示信息時間輸出流變換流82軟件工程1、變換流圖5-5-2典型的變換流變換流的特點是:經(jīng)過變換B的數(shù)據(jù)流一部分先經(jīng)過變換C到達(dá)變換E,然后另一部分經(jīng)過變換D到達(dá)E;即C和D是順序結(jié)構(gòu)。ABCDEF83軟件工程2、事務(wù)流事務(wù)流——單個數(shù)據(jù)項稱為事務(wù)(transaction)沿傳入路徑(也稱接受通道)進(jìn)入系統(tǒng),由外部形式變換為內(nèi)部形式后到達(dá)事務(wù)中心,事務(wù)中心根據(jù)數(shù)據(jù)項計值結(jié)果從若干動作路徑中選定一條繼續(xù)執(zhí)行??梢娝且粋€選擇結(jié)構(gòu)。事務(wù)中心TB事務(wù)CA圖5?5?3事務(wù)流84軟件工程面向數(shù)據(jù)流的設(shè)計過程精化數(shù)據(jù)流圖流的類型確定事務(wù)中心和各動作路徑確定輸入輸出流界映射為事務(wù)結(jié)構(gòu)映射為變換結(jié)構(gòu)提取控制結(jié)構(gòu)利用啟發(fā)式策略精化軟件結(jié)構(gòu)描述接口和全局?jǐn)?shù)據(jù)結(jié)構(gòu)事務(wù)分析變換分析復(fù)審詳細(xì)設(shè)計通過“變換”“事務(wù)”85軟件工程變換流

數(shù)據(jù)沿著輸入通路進(jìn)入系統(tǒng),經(jīng)過一系列數(shù)據(jù)變換,將數(shù)據(jù)的外部形式轉(zhuǎn)換成對應(yīng)的內(nèi)部表示,然后通過變換中心(也稱主加工)處理,再沿著輸出通路轉(zhuǎn)換成外部形式離開系統(tǒng)。具有這種特性的數(shù)據(jù)流稱為變換流。變換流型DFD可以分成:輸入+變換中心(主加工)+輸出

輸入數(shù)據(jù)C變換數(shù)據(jù)CD輸出數(shù)據(jù)D86軟件工程相應(yīng)于取得數(shù)據(jù)、變換數(shù)據(jù)、給出數(shù)據(jù),變換流型系統(tǒng)結(jié)構(gòu)圖由輸入、變換中心和輸出等三部分組成。主模塊B變換成C輸入B輸出CA變換成B輸入AC變換成D輸出DAABBBCCCDD87軟件工程事務(wù)流

數(shù)據(jù)沿著輸入通路到達(dá)一個事務(wù)中心,事務(wù)中心根據(jù)輸入數(shù)據(jù)(即事務(wù))的類型在若干個動作(稱為活動流)中選擇一個來執(zhí)行,這種數(shù)據(jù)流也稱為事務(wù)流。事務(wù)流有明顯的事務(wù)中心,各活動流以事務(wù)中心為起點呈輻射狀流出。在事務(wù)流型系統(tǒng)結(jié)構(gòu)圖中,事務(wù)中心模塊按所接受的事務(wù)的類型,選擇某一事務(wù)(活動流)處理模塊執(zhí)行。各事務(wù)處理模塊并列。88軟件工程事務(wù)中心分派模塊輸出結(jié)果事務(wù)1輸入作業(yè)信息事務(wù)2事務(wù)3事務(wù)4作業(yè)信息作業(yè)信息結(jié)果結(jié)果操作1操作2操作3操作4操作5操作6細(xì)節(jié)1細(xì)節(jié)2細(xì)節(jié)3細(xì)節(jié)4細(xì)節(jié)5細(xì)節(jié)689軟件工程變換分析

變換分析從變換流型的數(shù)據(jù)流圖導(dǎo)出系統(tǒng)結(jié)構(gòu)圖.步驟重畫數(shù)據(jù)流圖;區(qū)分有效(邏輯)輸入、有效(邏輯)輸出和變換中心部分;進(jìn)行一級分解,設(shè)計模塊結(jié)構(gòu)的頂層和第一層模塊;進(jìn)行二級分解,設(shè)計輸入、輸出和中心變換部分的中、下層模塊。90軟件工程1.重畫數(shù)據(jù)流圖(平鋪)為了建立系統(tǒng)結(jié)構(gòu),將數(shù)據(jù)流圖平鋪開來,物理輸入畫在左側(cè),物理輸出畫在右側(cè)。如果一個外部實體既是物理輸入又是物理輸出,則兩側(cè)都要畫出它。ABBCEGGHDFCDEABCDEFGH物理輸入物理輸出91軟件工程2.確定邏輯輸入、邏輯輸出

和變換中心部分變換中心是程序的核心功能,它的輸入是邏輯輸入,它的輸出為邏輯輸出。變換中心ABBCEGGHDFCDEABCDEFGH物理輸入物理輸出邏輯輸入邏輯輸出92軟件工程3.第一級分解:

設(shè)計模塊結(jié)構(gòu)的頂層和第一層頂層模塊:其功能就是整個系統(tǒng)的功能;輸入控制模塊:接收所有的輸入數(shù)據(jù);變換控制模塊:實現(xiàn)輸入到輸出的變換;輸出控制模塊:產(chǎn)生所有的輸出數(shù)據(jù)。頂層模塊變換控制輸出控制輸入控制93軟件工程變換中心ABBCEGGHDFCDEABCDEFGH物理輸入物理輸出邏輯輸入邏輯輸出主模塊C

D,E輸入C輸出D輸出ECCD,EDE邏輯輸入變換中心邏輯輸出94軟件工程4.第二級分解:設(shè)計中、下層模塊輸入控制模塊的分解:從變換中心的邊界開始,沿著各輸入通路,把輸入通路上的每個加工映射成輸入控制模塊的一個低層模塊。輸出控制模塊的分解:從變換中心的邊界開始,沿著各輸出通路,把輸出通路上的每個加工映射成輸出控制模塊的一個低層模塊。變換控制模塊的分解:變換控制模塊通常沒有通用的分解方法,應(yīng)根據(jù)數(shù)據(jù)流圖中變換部分的實際情況進(jìn)行設(shè)計。95軟件工程輸出HG

HABBCEGGHDFCD,EABCDEFGH物理輸入物理輸出主模塊CD,E輸入C輸出D輸出ECCD,EDE輸入BBB

CBC輸入AA

BABA輸出GE

G輸出FDFDFFEGGGHH96軟件工程輸出HG

HABBCEGGHDFCD,EABCDEFGH物理輸入物理輸出主模塊CD,E輸入C輸出D輸出ECCD,EDE輸入BBB

CBC輸入AA

BABA輸出GE

G輸出FDFDFFEGGGHH97軟件工程作業(yè)及解答(第5章)案例1:某火車售票系統(tǒng)的數(shù)據(jù)流程圖如下所示,畫出其結(jié)構(gòu)圖錄入員

1接受查詢原始查詢信息處理后查詢信息

2分析查詢

4按班次查詢

6查詢顯示

5按日期查詢

5按線路查詢旅客班次日期線路查詢結(jié)果查詢結(jié)果查詢結(jié)果查詢結(jié)果98軟件工程接受查詢輸入信息查詢信息列車查詢主模塊查詢顯示分析查詢按日期查詢按班次查詢按線路查詢查詢信息查詢信息查詢結(jié)果查詢結(jié)果日期班次線路99軟件工程案例2、已知某定貨系統(tǒng)的需求分析DFD圖如下,請按SD方法的設(shè)計步驟畫出結(jié)構(gòu)圖顧客編輯定貨單確定顧客訂貨產(chǎn)生暫存訂貨單開發(fā)貨單并改庫存業(yè)務(wù)員顧客D1配件D2顧客文件D5配件庫存D4暫存訂貨單D4暫存訂貨單D5銷售歷史D6應(yīng)收款明細(xì)帳發(fā)貨單可發(fā)貨不合格訂貨單訂貨單合格訂貨單不滿足訂貨單100軟件工程101軟件工程補充:變換分析下面以“家庭保安系統(tǒng)”的傳感器監(jiān)測子系統(tǒng)為例說明變換分析的各個步驟。步驟一、復(fù)審基本系統(tǒng)模型基本系統(tǒng)模型指頂級DFD和所有由外部提供的信息。這一設(shè)計步驟是對系統(tǒng)規(guī)格說明書和軟件需求規(guī)格說明書進(jìn)行評估。這兩個文檔描述軟件界面上信息的流程和結(jié)構(gòu)。102軟件工程圖1“家庭保安系統(tǒng)”的頂級數(shù)據(jù)流圖警報類別家庭保安系統(tǒng)軟件控制面板顯示器警報器電話線傳感器用戶命令顯示信息傳感數(shù)據(jù)電話撥號音頻103軟件工程圖2“家庭保安系統(tǒng)”的第一級DFD電話撥號音頻配置數(shù)據(jù)配置數(shù)據(jù)配置數(shù)據(jù)用戶命令處理顯示信息和狀態(tài)傳感器監(jiān)測系統(tǒng)配置控制面板顯示器警報器電話線傳感器配置信息配置命令啟動/停止命令原口令有效口令傳感器信息報警類別傳感數(shù)據(jù)顯示信息用戶命令口令啟動/停止系統(tǒng)和狀態(tài)啟動或停止消息口令核對用戶交互子系統(tǒng)104軟件工程步驟二、復(fù)審和精化軟件數(shù)據(jù)流圖這一步主要是對軟件需求規(guī)格說明書中的分析模型進(jìn)行精化,直至獲得足夠詳細(xì)的DFD。例如,由“傳感器監(jiān)測子系統(tǒng)”的第一級(圖2的局部)和第二級(圖3)DFD進(jìn)一步推導(dǎo)出第三級數(shù)據(jù)流圖(圖4),此時,每個變換對應(yīng)一個獨立的功能,可以用一個具有較高內(nèi)聚度的模塊實現(xiàn),至此已有足夠的信息可用于設(shè)計“傳感器監(jiān)測子系統(tǒng)”的程序結(jié)構(gòu),精化過程亦可結(jié)束。105軟件工程圖3“傳感器監(jiān)測子系統(tǒng)”的第二級DFD傳感器信息傳感器標(biāo)志的類型和位置傳感數(shù)據(jù)警報類別警報數(shù)據(jù)顯示格式產(chǎn)生警報信號電話撥號異常數(shù)據(jù)判別讀取傳感數(shù)據(jù)配置信息配置數(shù)據(jù)傳感器標(biāo)識類型電話號碼電話撥號音頻106軟件工程圖4“傳感器監(jiān)測子系統(tǒng)”的第三級DFD配置信息警報條件碼傳感器標(biāo)志定時信息傳感數(shù)據(jù)電話號碼對應(yīng)的音頻電話撥號音頻傳感器信息號碼表電話號碼讀取傳感數(shù)據(jù)獲取響應(yīng)信息建立警報條件選擇電話號碼連通電話網(wǎng)產(chǎn)生撥號脈沖產(chǎn)生警報信號格式化顯示產(chǎn)生顯示傳感器標(biāo)志的類型和位置格式化標(biāo)志的類型和位置置傳感器標(biāo)識警報數(shù)據(jù)警報類別配置數(shù)據(jù)107軟件工程步驟三、確定DFD的特性,判定它為變換流還是事務(wù)流。以圖4所示DFD為例,數(shù)據(jù)沿一個傳入路徑進(jìn)來,沿三個傳出路徑離開,沒有明顯的事務(wù)中心,因此,該信息流應(yīng)屬變換流。步驟四、劃定輸入流和輸出流的邊界,孤立變換中心?!皞鞲衅鞅O(jiān)測子系統(tǒng)”的流界在圖4中用虛線表示。108軟件工程步驟五、執(zhí)行“一級分解”(firstlevelfactoring)

一級分解的目標(biāo)是導(dǎo)出具有三個層次的程序結(jié)構(gòu),頂層為主控模塊;底層模塊執(zhí)行輸入、計算和輸出功能;中層模塊控制、協(xié)調(diào)底層的工作。109軟件工程圖5所示的結(jié)構(gòu)圖對應(yīng)于一級分解的上兩層模塊,即主控模塊和下面幾個中層控制模塊:①輸入流控制模塊,接收所有輸入數(shù)據(jù);②變換流控制模塊,對內(nèi)部形式數(shù)據(jù)進(jìn)行加工、處理;③輸出流控制模塊,產(chǎn)生輸出數(shù)據(jù)。110軟件工程圖5一級分解輸入流變換流變換流控制模塊輸入流控制模塊輸出流主控模塊輸出流控制模塊ABCDEFGH111軟件工程圖5展示的是一個簡單三叉結(jié)構(gòu),實際處理大型系統(tǒng)的復(fù)雜數(shù)據(jù)流時,可能需要多個模塊對應(yīng)圖5中一個模塊的功能?!耙患壏纸狻笨偟脑瓌t是,在完成控制功能并保持低耦合度、高內(nèi)聚度的前提下盡可能地減少模塊的數(shù)量。“傳感器監(jiān)測子系統(tǒng)”一級分解如圖6所示,其中控制模塊的名字概括了所有下屬模塊的功能。112軟件工程圖6傳感器監(jiān)測子系統(tǒng)一級分解結(jié)果警報條件控制模塊傳感器輸入控制模塊主控模塊警報輸出控制模塊配置信息113軟件工程補充:變換分析步驟六、執(zhí)行“二級分解”。二級分解的任務(wù)是把數(shù)據(jù)流圖中每個處理框映射為結(jié)構(gòu)圖中的一個模塊。其過程是從變換中心的邊界開始沿輸入、輸出通道向外移動;從變換中心的輸入(出)邊界向外移動,把遇到的每個處理框映射為結(jié)構(gòu)圖中相應(yīng)控制模塊下的一個模塊。其方法如圖7所示。114軟件工程圖7二級分解輸入流變換流輸入流控制模塊輸出流主控模塊ABCDEFGHBDAC變換流控制模塊輸出流控制模塊EFGH115軟件工程補充:變換分析顯示圖7中的DFD的處理框與程序結(jié)構(gòu)模塊一一對應(yīng),但按照軟件設(shè)計原則進(jìn)行設(shè)計時,可能需要把幾個處理框聚合為一個模塊,或者把一個處理框裂變?yōu)閹讉€模塊??傊?,應(yīng)根據(jù)“良好”設(shè)計的標(biāo)準(zhǔn),進(jìn)行二級分解。二級分解后得到的僅僅是程序結(jié)構(gòu)的“雛形”(first?cut),后續(xù)的復(fù)審和精化會反復(fù)修改。116軟件工程補充:變換分析由圖4輸出流部分導(dǎo)出的程序結(jié)構(gòu)如圖8所示。整個“傳感器監(jiān)測子系統(tǒng)”二級分解的結(jié)果見圖9,它僅僅是程序的雛形。117軟件工程圖8傳感器監(jiān)測子系統(tǒng)輸出流部分導(dǎo)出的程序結(jié)構(gòu)118軟件工程圖9、傳感器監(jiān)測子系統(tǒng)的程序結(jié)構(gòu)“雛形”119軟件工程程序結(jié)構(gòu)的模塊名已隱含了模塊功能,但仍有必要為每個模塊寫一個簡要的處理說明,它應(yīng)當(dāng)包括:

1.進(jìn)出模塊的信息(接口描述);

2.模塊的局部信息;

3.處理過程陳述,包括任務(wù)和主要的判斷點的位置、條件;

4.對有關(guān)限制和一些專門特性的簡要說明(例如,文件I/O,獨立于硬件的特性,特殊的實時要求等)。這些描述構(gòu)成第一版設(shè)計規(guī)格說明書。120軟件工程補充:變換分析步驟七、采用啟發(fā)式設(shè)計策略,精化所得程序結(jié)構(gòu)雛形,改良軟件質(zhì)量對于程序結(jié)構(gòu)的雛形,以“模塊獨立”為指導(dǎo)思想,對模塊進(jìn)行整合或分解,旨在追求高內(nèi)聚、低耦合,以及易實現(xiàn)、易測試、易維護的軟件結(jié)構(gòu)。121軟件工程例如,“傳感器監(jiān)測子系統(tǒng)”的程序結(jié)構(gòu)雛形可修改下如下:因只存在唯一一條傳入路徑,故輸入控制模塊可刪除;由變換中心產(chǎn)生的整個子結(jié)構(gòu)可歸并為“建立警報條件”一個模塊(選擇電話號碼的功能納入其中),變換控制模塊不再需要;“格式化顯示”和“生成顯示”兩個模塊歸并為“產(chǎn)生顯示”一個模塊。122軟件工程圖10傳感器監(jiān)測子系統(tǒng)精化后的程序結(jié)構(gòu)123軟件工程補充:變換分析上述七個設(shè)計步驟的目標(biāo)是給出軟件的一個整體描述。一旦有了這樣一個描述,設(shè)計人員即可從整體角度評價和精化軟件的總體結(jié)構(gòu),此時修改所需耗費不多,卻能大大提高軟件質(zhì)量。124軟件工程事務(wù)分析事務(wù)分析是從事務(wù)流型數(shù)據(jù)流圖導(dǎo)出系統(tǒng)結(jié)構(gòu)圖。步驟:確定事務(wù)中心和每條活動流的流特性將事務(wù)流型數(shù)據(jù)流圖映射成高層的系統(tǒng)結(jié)構(gòu)進(jìn)一步分解125軟件工程1.確定事務(wù)中心和各活動流的流特性

右圖為事務(wù)流型DFD的一般形式。事務(wù)中心(圖中的T): 位于活動流的起點, 活動流從該點成輻射狀流出?;顒恿鳎? 可為變換流 可為事務(wù)流事務(wù)流型的DFD的組成: 輸入流+事務(wù)中心+若干條活動流

T輸入流事務(wù)流活動流126軟件工程右圖為事務(wù)流型DFD的高層結(jié)構(gòu)形式。頂層模塊:其功能就是整個系統(tǒng)的功能。接收模塊:接收輸入數(shù)據(jù)。分派模塊:調(diào)度模塊, 控制下層的所有活動模塊。事務(wù)模塊:對應(yīng)活動流, 是該活動流映射成的。2.將事務(wù)流型DFD映射成

高層系統(tǒng)結(jié)構(gòu)…頂層模塊分派接收事務(wù)1事務(wù)2事務(wù)n127軟件工程3.進(jìn)一步分解接收模塊:類同于變換分析中輸入控制模塊的分解?;顒恿髂K:根據(jù)其流特性(變換流或事務(wù)流)進(jìn)一步采用變換分析或事務(wù)分析進(jìn)行分解。

128軟件工程進(jìn)行了邊界劃分的事務(wù)型數(shù)據(jù)流圖129軟件工程完整的事務(wù)型軟件結(jié)構(gòu)130軟件工程模塊設(shè)計的原則在選擇模塊設(shè)計的次序時,必須對一個模塊的全部直接下屬模塊都設(shè)計完成之后,才能轉(zhuǎn)向另一個模塊的下層模塊的設(shè)計。使用“黑盒”技術(shù):在設(shè)計當(dāng)前模塊時,先把該模塊的所有下層模塊定義成“黑盒”,在設(shè)計中利用它們時暫不考慮其內(nèi)部結(jié)構(gòu)和實現(xiàn)。在這一步定義好的“黑盒”,在下一步就可以對它們進(jìn)行設(shè)計和加工。最后,全部“黑盒”的內(nèi)容和結(jié)構(gòu)應(yīng)完全被確定。131軟件工程在設(shè)計下層模塊時,應(yīng)考慮模塊的耦合和內(nèi)聚問題,以提高初始結(jié)構(gòu)圖質(zhì)量。模塊劃分時,一個模塊的直接下屬模塊一般在5個左右。如果直接下屬模塊超過10個,可設(shè)立中間層次。如果出現(xiàn)以下情況,就停止模塊分解:模塊不能再細(xì)分為明顯的子任務(wù);分解成用戶提供的模塊或庫函數(shù);模塊接口是輸入輸出設(shè)備傳送的信息;模塊不宜再分解得過小。132軟件工程變換分析是軟件系統(tǒng)結(jié)構(gòu)設(shè)計的主要方法。一般,一個大型的軟件系統(tǒng)是變換型結(jié)構(gòu)和事務(wù)型結(jié)構(gòu)的混合結(jié)構(gòu)。所以,我們通常利用以變換分析為主,事務(wù)分析為輔的方式進(jìn)行軟件結(jié)構(gòu)設(shè)計。133軟件工程abdpqrsbac1d分派模塊事務(wù)控制qrs接受通路p134軟件工程模塊功能完善化一個完整的模塊應(yīng)當(dāng)有以下幾部分:執(zhí)行規(guī)定的功能的部分;出錯處理的部分。當(dāng)模塊不能完成規(guī)定的功能時,必須回送出錯標(biāo)志,出現(xiàn)例外情況的原因。如果需要返回數(shù)據(jù)給它的調(diào)用者,在完成數(shù)據(jù)加工或結(jié)束時,應(yīng)當(dāng)給它的調(diào)用者返回一個狀態(tài)碼。改進(jìn)系統(tǒng)結(jié)構(gòu)的啟發(fā)式原則135軟件工程消除重復(fù)功能,改善軟件結(jié)構(gòu)完全相似:在結(jié)構(gòu)上完全相似,可能只是在數(shù)據(jù)類型上不一致。此時可以采取完全合并的方法。局部相似:找出其相同部分,分離出去,重新定義成一個獨立的下一層模塊。還可以與它的上級模塊合并。136軟件工程R1R2XY相似部分R1R2XYR1+R2XYX+R1Y+R2R1Y+R2X不可取開關(guān)太多137軟件工程模塊的作用范圍應(yīng)在控制范圍之內(nèi)模塊的控制范圍包括它本身及其所有的從屬模塊。模塊的作用范圍是指模塊內(nèi)一個判定的作用范圍,凡是受這個判定影響的所有模塊都屬于這個判定的作用范圍。如果一個判定的作用范圍包含在這個判定所在模塊的控制范圍之內(nèi),則這種結(jié)構(gòu)是簡單的,否則,它的結(jié)構(gòu)是不簡單的。138軟件工程盡可能減少高扇出結(jié)構(gòu)

如果一個模塊的扇出數(shù)過大,就意味著該模塊過分復(fù)雜,需要協(xié)調(diào)和控制過多的下屬模塊。應(yīng)當(dāng)適當(dāng)增加中間層次的控制模塊。PPP1P2139軟件工程避免或減少使用病態(tài)聯(lián)接直接病態(tài)聯(lián)接公共數(shù)據(jù)域病態(tài)聯(lián)接通信模塊病態(tài)聯(lián)接ABcommonABTABLEITABABxxxx(a)直接病態(tài)聯(lián)接(b)公共數(shù)據(jù)域病態(tài)聯(lián)接(c)通信模塊病態(tài)聯(lián)接140軟件工程模塊的大小要適中。設(shè)計功能可預(yù)測的模塊一個功能可預(yù)測的模塊,不論內(nèi)部處理細(xì)節(jié)如何,但對相同的輸入數(shù)據(jù),總能產(chǎn)生同樣的結(jié)果。但是,如果模塊內(nèi)部蘊藏有一些特殊的鮮為人知的功能時,這個模塊就可能是不可預(yù)測的。對于這種模塊,如果調(diào)用者不小心使用,其結(jié)果將不可預(yù)測。141軟件工程保存當(dāng)前標(biāo)記恢復(fù)“以前”標(biāo)記標(biāo)記?標(biāo)記?功能不可預(yù)測的模塊142軟件工程軟件設(shè)計評審是保證軟件開發(fā)質(zhì)量和產(chǎn)品質(zhì)量的重要措施,是開發(fā)人員投入編碼前最后的一道把握質(zhì)量的關(guān)口。軟件設(shè)計評審是要在軟件設(shè)計工作之后集中查找和發(fā)現(xiàn)設(shè)計中的缺陷。此時找出并消除缺陷,其難度比編碼以后更容易,代價更低。如果設(shè)計缺陷被帶到交付的產(chǎn)品中,它將會給用戶帶來很大影響,那時要找到和消除它們將非常困難。4.5軟件概要設(shè)計評審143軟件工程需求規(guī)格概述是否與需求規(guī)格說明保持一致?是否每一部分的設(shè)計都可以追溯到需求規(guī)格、接口需求規(guī)格或其他產(chǎn)品文檔?是否對需求分析中不完整、易變動、潛在的需求進(jìn)行了相應(yīng)的設(shè)計分析?模塊的規(guī)格是否和軟件需求文檔中的功能需求和軟件接口規(guī)格要求保持一致?設(shè)計和算法是否能滿足模塊的所有需求?是否闡述了設(shè)計中的風(fēng)險和對風(fēng)險的評估?概要設(shè)計評審的檢查內(nèi)容

144軟件工程總體設(shè)計設(shè)計目標(biāo)是否明確清晰地進(jìn)行了定義?是否闡述了設(shè)計所依賴的運行環(huán)境?與需求中運行環(huán)境是否一致性?是否全面準(zhǔn)確地解釋了設(shè)計中使用到的一些基本概念?設(shè)計中的邏輯是否正確和完備?是否全面考慮了各種設(shè)計約束?是否有不同的設(shè)計方案的比較?是否有選擇方案的結(jié)論?是否清楚闡述了方案選擇的理由?是否合理劃分了模塊并闡述了模塊間的關(guān)系?145軟件工程系統(tǒng)結(jié)構(gòu)和處理流程能否正確地實現(xiàn)全部的功能需求?接口設(shè)計用戶界面設(shè)計是否正確且全面?是否有硬件接口設(shè)計?硬件接口設(shè)計是否正確且全面?是否有軟件接口設(shè)計?接口設(shè)計是否正確且全面?是否有通信接口設(shè)計?通信接口設(shè)計是否正確且全面?內(nèi)部接口設(shè)計是否正確且全面?146軟件工程是否描述了接口的功能特征?接口是否便于查錯?接口相互之間、接口和其他模塊、接口和需求規(guī)格說明及接口需求規(guī)格說明是否保持一致?是否所有的接口都需要類型、數(shù)量、質(zhì)量的信息?質(zhì)量屬性設(shè)計是否有可靠性的設(shè)計,設(shè)計是否具體、合理、有效?是否有安全性的設(shè)計,設(shè)計是否具體、合理、有效?147軟件工程是否有可維護性的設(shè)計,設(shè)計是否具體、合理、有效?是否有可移植性的設(shè)計,設(shè)計是否具體、合理、有效?是否有可測試性的設(shè)計,設(shè)計是否具體、合理、有效?是否明確規(guī)定了測試信息的輸出格式?數(shù)據(jù)結(jié)構(gòu)是否準(zhǔn)確定義了主要的常量?全局變量的定義是否準(zhǔn)確?定義的全局變量的必要性是否充分?主要的數(shù)據(jù)結(jié)構(gòu)是否都有定義?148軟件工程是否說明了數(shù)據(jù)結(jié)構(gòu)存儲要求及一致性約束條件?是否對所有的數(shù)據(jù)成員、參數(shù)、對象進(jìn)行了描述?是否所有需要的數(shù)據(jù)結(jié)構(gòu)都進(jìn)行了定義,或者定義了不需要的數(shù)據(jù)結(jié)構(gòu)?是否所有的數(shù)據(jù)成員都進(jìn)行了足夠詳細(xì)的描述?數(shù)據(jù)成員的有效值區(qū)間是否定義?共享和存儲數(shù)據(jù)的使用是否描述清楚?運行設(shè)計149軟件工程對系統(tǒng)運行時的順序、控制、過程及時間的說明是否全面、準(zhǔn)確?出錯處理設(shè)計是否列出了主要的錯誤類別?每一錯誤類別是否都有對應(yīng)的出錯處理?設(shè)計是否考慮了檢錯和恢復(fù)措施?出錯處理是否正確、合理?運行環(huán)境硬件平臺、工具的選擇是否合理? 軟件平臺、工具的選擇是否合理?150軟件工程清晰性程序結(jié)構(gòu),包括數(shù)據(jù)流、控制流和接口的描述是否清楚?一致性程序、模塊、函數(shù)、數(shù)據(jù)成員的名稱是否保持一致?設(shè)計是否反映了真正的操作環(huán)境、硬件環(huán)境、軟件環(huán)境?對系統(tǒng)設(shè)計的多種可能的描述之間是否保持一致?(例如:靜態(tài)結(jié)構(gòu)的描述和動態(tài)描述)可行性151軟件工程設(shè)計在計劃、預(yù)算、技術(shù)上是否可行?詳細(xì)程度是否估計了每個子模塊的規(guī)模(代碼行數(shù))?是否可信?程序執(zhí)行過程中的關(guān)鍵路徑是否都被標(biāo)名和經(jīng)過分析?是否考慮了足夠數(shù)量及代表性的系統(tǒng)狀態(tài)?詳細(xì)程度是否足夠進(jìn)行下一步的詳細(xì)設(shè)計?152軟件工程可維護性是否模塊化設(shè)計?模塊是否為高內(nèi)聚、低耦合?是否進(jìn)行了性能分析?是否描述了所有的性能參數(shù)?(如實時性能約束、存儲空間、速度要求、磁盤I/O空間)153軟件工程4.7案例分析

下面通過一個汽車數(shù)字儀表板的設(shè)計來介紹變換分析的過程。說明變換分析的各個步驟。變換分析是一系列設(shè)計步驟的總稱,經(jīng)過這些步驟把具有變換流特點的數(shù)據(jù)流圖按預(yù)先確定的模式映射成軟件結(jié)構(gòu)。案例1:變換分析154軟件工程假設(shè)儀表板的功能如下:(1)通過模/數(shù)(A/D)轉(zhuǎn)換實現(xiàn)傳感器和微處理機接口;(2)在發(fā)光二極管(LCD)面板上顯示數(shù)據(jù);(3)指示每小時英里數(shù)(mph),行駛的里程,每加侖油行駛的英里數(shù)(mpg)等等;(4)指示加速或減速;(5)超速警告:如果車速超過55英里/小時,則發(fā)出超速警告鈴聲。在軟件需求分析階段,應(yīng)該對上述每項性能和其它要求進(jìn)行全面的分析,并建立起相應(yīng)的文檔資料,得出數(shù)據(jù)流圖。具體的設(shè)計步驟如下:變換分析155軟件工程1、復(fù)查基本系統(tǒng)模型2、復(fù)查并精化數(shù)據(jù)流圖確保數(shù)據(jù)流圖給出目標(biāo)系統(tǒng)的正確的邏輯模型,且使數(shù)據(jù)流圖中每個處理都代表一個規(guī)模適中相對獨立的子功能156軟件工程3、確定數(shù)據(jù)流圖的類型這一步的任務(wù)是確定數(shù)據(jù)流圖是變換型數(shù)據(jù)流圖還是事務(wù)型數(shù)據(jù)流圖。從上圖中可以看出,數(shù)據(jù)沿著兩條輸入通路(旋轉(zhuǎn)信號和燃料流量傳感器信號)進(jìn)入系統(tǒng),然后沿著五條通路(4個顯示,一個警告鈴聲)離開,沒有明顯的事務(wù)中心(雖然變換“計算mph與超速值”可以看作是一個事務(wù)中心)。因此,可以認(rèn)為這個數(shù)據(jù)流圖的類型是變換型數(shù)據(jù)流圖。157軟件工程4、確定輸入流和輸出流的邊界,從而孤立出變換中心5-5-6具有邊界的數(shù)據(jù)流圖158軟件工程5、進(jìn)行“第一級分解”軟件結(jié)構(gòu)代表對控制的自頂向下的分配,所謂分解就是分配控制的過程。對于變換流的情況,數(shù)據(jù)流圖被映射成一個特殊的軟件結(jié)構(gòu),這個結(jié)構(gòu)控制輸入、變換和輸出等信息處理過程。159軟件工程5、進(jìn)行“第一級分解”5-5-7第一級分解的方法

·輸入信息處理控制模塊Ca,協(xié)調(diào)對所有輸入數(shù)據(jù)的接收;

·變換中心控制模塊Ct,管理對內(nèi)部形式的數(shù)據(jù)的所有操作;

·輸出信息處理控制模塊Ce,協(xié)調(diào)輸出信息的產(chǎn)生過程。數(shù)字儀表板第一級分解的結(jié)構(gòu)圖?160軟件工程5-5-8第一級分解的結(jié)果161軟件工程6、進(jìn)行“第二級分解”

第二級分解就是把數(shù)據(jù)流圖中的每個處理映射成軟件結(jié)構(gòu)中一個適當(dāng)?shù)哪K。完成第二級分解的方法是,從變換

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論