軟件工程與項(xiàng)目管理(第2版) 課件 (王素芬)第9、10章 軟件維護(hù)、面向?qū)ο蠓椒▽W(xué)_第1頁
軟件工程與項(xiàng)目管理(第2版) 課件 (王素芬)第9、10章 軟件維護(hù)、面向?qū)ο蠓椒▽W(xué)_第2頁
軟件工程與項(xiàng)目管理(第2版) 課件 (王素芬)第9、10章 軟件維護(hù)、面向?qū)ο蠓椒▽W(xué)_第3頁
軟件工程與項(xiàng)目管理(第2版) 課件 (王素芬)第9、10章 軟件維護(hù)、面向?qū)ο蠓椒▽W(xué)_第4頁
軟件工程與項(xiàng)目管理(第2版) 課件 (王素芬)第9、10章 軟件維護(hù)、面向?qū)ο蠓椒▽W(xué)_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

9.1軟件維護(hù)的概念

9.2軟件維護(hù)的特點(diǎn)

9.3軟件維護(hù)的類型及比例

9.4區(qū)分維護(hù)類型的原則

9.5軟件維護(hù)的步驟

9.6軟件的可維護(hù)性

9.7軟件維護(hù)的副作用

9.8軟件重用9.1軟件維護(hù)的概念軟件維護(hù)是指軟件系統(tǒng)交付使用以后,為了改正軟件錯(cuò)誤或滿足用戶新的需要而修改軟件的過程。在整個(gè)軟件生存周期中,軟件維護(hù)是最費(fèi)時(shí),也是最重要的一個(gè)階段。據(jù)有關(guān)資料統(tǒng)計(jì),軟件維護(hù)占軟件總的開發(fā)工作量的60%以上,而維護(hù)費(fèi)用可能占開發(fā)費(fèi)用的55%~70%。因此,對(duì)軟件維護(hù)工作必須給予足夠的重視。軟件維護(hù)的作用如下:(1)在運(yùn)行中發(fā)現(xiàn)軟件錯(cuò)誤和設(shè)計(jì)缺陷,這些錯(cuò)誤和缺陷在測(cè)試階段未能發(fā)現(xiàn);改進(jìn)設(shè)計(jì),以便增強(qiáng)軟件的功能,提高軟件的性能。(2)要求已經(jīng)運(yùn)行的軟件能夠適應(yīng)特定的硬件、軟件、外部設(shè)備、通信設(shè)備等的工作環(huán)境,或者是要求適應(yīng)已變動(dòng)的數(shù)據(jù)或文件。(3)使已經(jīng)投入運(yùn)行的軟件與其他相關(guān)的程序有良好的接口,以利于協(xié)同工作。(4)使運(yùn)行軟件的應(yīng)用范圍得到必要的擴(kuò)充等。9.2軟件維護(hù)的特點(diǎn)1.結(jié)構(gòu)化維護(hù)與非結(jié)構(gòu)化維護(hù)軟件的開發(fā)過程對(duì)軟件的維護(hù)有較大的影響。根據(jù)軟件開發(fā)的過程可以把軟件維護(hù)分為結(jié)構(gòu)化維護(hù)和非結(jié)構(gòu)化維護(hù)兩類,如圖9.1所示。1)非結(jié)構(gòu)化維護(hù)對(duì)于非結(jié)構(gòu)化維護(hù),軟件配置的唯一成分是程序代碼,沒有文檔。維護(hù)活動(dòng)從艱苦地評(píng)價(jià)程序代碼開始,常常由于程序內(nèi)部文檔不足而使評(píng)價(jià)更困難,對(duì)于軟件結(jié)構(gòu)、全程數(shù)據(jù)結(jié)構(gòu)、系統(tǒng)接口、性能和(或)設(shè)計(jì)約束等經(jīng)常會(huì)產(chǎn)生誤解。因?yàn)闆]有測(cè)試方面的文檔,所以不可能進(jìn)行回歸測(cè)試。2)結(jié)構(gòu)化維護(hù)對(duì)于結(jié)構(gòu)化維護(hù),軟件配置完整,維護(hù)工作從評(píng)價(jià)設(shè)計(jì)文檔開始,確定軟件重要的結(jié)構(gòu)特點(diǎn)、性能特點(diǎn)以及接口特點(diǎn);估計(jì)要求的改動(dòng)將帶來的影響,并且計(jì)劃實(shí)施途徑。然后首先修改設(shè)計(jì)并且對(duì)所做的修改進(jìn)行仔細(xì)復(fù)查。接下來編寫相應(yīng)的源程序代碼;使用在測(cè)試說明書中包含的信息進(jìn)行回歸測(cè)試。最后,把修改后的軟件再次交付使用。2.軟件的維護(hù)成本在過去的幾十年中,軟件維護(hù)的費(fèi)用穩(wěn)步上升。1970年用于維護(hù)已有軟件的費(fèi)用只占軟件總預(yù)算的35%~40%,1980年上升為40%~60%,1990年上升為70%~80%。有形的維護(hù)費(fèi)用只不過是軟件維護(hù)的最明顯的代價(jià),其他一些現(xiàn)在還不明顯的代價(jià)將來可能更為人們所關(guān)注。因?yàn)榭捎玫馁Y源必須供維護(hù)任務(wù)使用,以致耽誤甚至喪失了開發(fā)的良機(jī),這是一個(gè)無形的代價(jià)。其他無形的代價(jià)(維護(hù)成本)還有:(1)一些看起來是合理的改錯(cuò)或修改的要求不能及時(shí)滿足,使得用戶不滿意;(2)維護(hù)時(shí)產(chǎn)生的改動(dòng),可能會(huì)帶來新的潛伏的故障,從而降低軟件的整體質(zhì)量;(3)當(dāng)必須把軟件開發(fā)人員抽調(diào)去進(jìn)行維護(hù)工作時(shí),將在開發(fā)過程中造成混亂。軟件維護(hù)的最后一個(gè)代價(jià)是生產(chǎn)率的大幅度下降,這種情況在維護(hù)舊程序時(shí)常常遇到。維護(hù)工作量可以分成生產(chǎn)性活動(dòng)和非生產(chǎn)性活動(dòng)。維護(hù)工作量的計(jì)算表達(dá)式如下:其中:M——維護(hù)中消耗的總工作量;P——生產(chǎn)性工作量; K——經(jīng)驗(yàn)常數(shù); c——復(fù)雜程度(非結(jié)構(gòu)化設(shè)計(jì)和缺少文檔都會(huì)增加軟件的復(fù)雜程度); d——維護(hù)人員對(duì)軟件的熟悉程度。通過這個(gè)模型可以看出,如果使用了不好的軟件開發(fā)方法(沒有使用軟件工程方法論),而且參加維護(hù)的人員都不是原來開發(fā)的人員,那么維護(hù)工作量(及成本)將按指數(shù)級(jí)增加。此外,還涉及以下成本的附加因素:(1)到用戶處的差旅費(fèi);(2)對(duì)維護(hù)者以及用戶的培訓(xùn)費(fèi);(3)軟件工程環(huán)境和軟件測(cè)試環(huán)境的成本和年度維護(hù)費(fèi);(4)薪水和津貼之類的人員成本。建立維護(hù)概念時(shí),要根據(jù)有限的可用數(shù)據(jù)估算成本。隨著開發(fā)工作的推進(jìn),估算要進(jìn)一步細(xì)化,歷史度量數(shù)據(jù)應(yīng)用作估算維護(hù)成本的輸入。3.軟件維護(hù)工具控制軟件維護(hù)成本的潛在方法是使用CASE工具,這些工具輔助軟件維護(hù)活動(dòng)。CASE可以看成是一套相互關(guān)聯(lián)的、支持軟件開發(fā)和維護(hù)所有各方面的工具。這些相互關(guān)聯(lián)的CASE工具最好以軟件工程環(huán)境的形式匯集在一起,以支持那些支持軟件維護(hù)活動(dòng)的方法、策略、指南及標(biāo)準(zhǔn)。最好也為維護(hù)者提供軟件測(cè)試環(huán)境,以便修改后的軟件產(chǎn)品能在非運(yùn)行環(huán)境中測(cè)試。軟件工程環(huán)境提供初始開發(fā)和修改軟件產(chǎn)品的工具。軟件測(cè)試環(huán)境提供測(cè)試環(huán)境,應(yīng)用于在非運(yùn)行環(huán)境中測(cè)試修改后的軟件產(chǎn)品。注明成功運(yùn)用CASE工具的日期。維護(hù)者應(yīng)仔細(xì)策劃這些工作。4.軟件維護(hù)中的問題與軟件維護(hù)有關(guān)的絕大多數(shù)問題,都可歸因于軟件定義和軟件開發(fā)的方法有缺點(diǎn)。在軟件生命周期的前兩個(gè)時(shí)期沒有嚴(yán)格而又科學(xué)的管理和規(guī)則,幾乎必然會(huì)導(dǎo)致在最后階段出現(xiàn)問題。下面列出和軟件維護(hù)有關(guān)的部分問題。(1)理解他人編寫的程序一般都有一定的困難性。(2)軟件配置的文檔嚴(yán)重不足甚至沒有,或者沒有合格的文檔。(3)當(dāng)需要對(duì)軟件進(jìn)行維護(hù)時(shí),由于軟件人員經(jīng)常流動(dòng),維護(hù)階段持續(xù)的時(shí)間又很長,因此一般不能指望由原來的開發(fā)人員來完成或提供對(duì)軟件的解釋。(4)絕大多數(shù)軟件在設(shè)計(jì)時(shí)沒有考慮到將來的修改問題。(5)追蹤軟件的建立過程非常困難,或根本做不到。(6)軟件維護(hù)可以說是一項(xiàng)毫無吸引力的工作。之所以形成這樣一種觀念,一方面是因?yàn)檐浖S護(hù)工作量大,看不到什么“成果”,更主要的原因是因?yàn)榫S護(hù)工作難度大,又經(jīng)常遭受挫折,且從事這項(xiàng)工作缺乏成就感。上述種種問題在現(xiàn)有的沒有采用軟件工程思想開發(fā)出來的軟件中,都或多或少地存在著。而軟件工程部分地解決了與維護(hù)有關(guān)的各種問題。9.3軟件維護(hù)的類型及比例根據(jù)軟件維護(hù)的不同原因,軟件維護(hù)可以分成改正性維護(hù)、適應(yīng)性維護(hù)、完善性維護(hù)和預(yù)防性維護(hù)4種類型。1.改正性維護(hù)(Corrective)因?yàn)檐浖y(cè)試不可能暴露出一個(gè)大型軟件系統(tǒng)所有潛藏的錯(cuò)誤,所以必然會(huì)有第一項(xiàng)維護(hù)活動(dòng):在任何大型程序的使用期間,用戶在某些特定的使用環(huán)境下必然會(huì)發(fā)現(xiàn)這些潛藏的程序錯(cuò)誤,并且把他們遇到的問題報(bào)告給維護(hù)人員。診斷和改正錯(cuò)誤的過程稱為改正性維護(hù)。2.適應(yīng)性維護(hù)(Adaptive)計(jì)算機(jī)科學(xué)技術(shù)領(lǐng)域的各個(gè)方面都在迅速進(jìn)步,外部環(huán)境、數(shù)據(jù)環(huán)境可能發(fā)生變化;另一方面,應(yīng)用軟件的使用壽命很容易超過10年,遠(yuǎn)遠(yuǎn)長于最初開發(fā)這個(gè)軟件時(shí)的運(yùn)行環(huán)境的壽命。因此,適應(yīng)性維護(hù)也就是為了和變化了的環(huán)境適當(dāng)?shù)嘏浜隙M(jìn)行的修改軟件的活動(dòng),是既必要又經(jīng)常的維護(hù)活動(dòng)。3.完善性維護(hù)(Perfective)當(dāng)一個(gè)軟件系統(tǒng)順利運(yùn)行時(shí),常常出現(xiàn)第3項(xiàng)維護(hù)活動(dòng):在使用軟件的過程中用戶往往提出增加新功能或修改已有功能的建議,還可能提出一般性的改進(jìn)意見。為了滿足這類要求,需要進(jìn)行完善性維護(hù)。這項(xiàng)維護(hù)活動(dòng)通常占軟件維護(hù)工作的大部分。4.預(yù)防性維護(hù)(Preventive)當(dāng)為了改進(jìn)未來的可維護(hù)性和可靠性,或?yàn)榱私o未來的改進(jìn)奠定更好的基礎(chǔ)而修改尚未引起問題的產(chǎn)品缺陷時(shí),將出現(xiàn)第4項(xiàng)維護(hù)活動(dòng)。這項(xiàng)維護(hù)活動(dòng)通常稱為預(yù)防性維護(hù),它被定義為“把今天的方法學(xué)應(yīng)用到昨天的系統(tǒng),以支持明天的需求”。5.維護(hù)類型的比例在維護(hù)階段的前期,改正性維護(hù)的工作量較大。隨著錯(cuò)誤發(fā)現(xiàn)率急劇降低,并趨于穩(wěn)定,就進(jìn)入正常使用期。然而,由于改造的要求,適應(yīng)性維護(hù)和完善性維護(hù)的工作量逐步增加,在這些維護(hù)過程中又會(huì)引入新的錯(cuò)誤,從而加重了維護(hù)的工作量。實(shí)踐證明,在這4項(xiàng)維護(hù)活動(dòng)中,完善性維護(hù)所占的比例最大,即大部分維護(hù)工作是改變和加強(qiáng)軟件,而不是糾錯(cuò)。所以,維護(hù)并不一定是救火式的緊急維修,而可以是有計(jì)劃的一種再開發(fā)活動(dòng)。統(tǒng)計(jì)事實(shí)證明,完善性維護(hù)活動(dòng)約占整個(gè)維護(hù)工作的50%,改正性維護(hù)占20%,適應(yīng)性維護(hù)占25%,其他維護(hù)活動(dòng)只占5%左右,如圖9.2所示。應(yīng)該注意,上述4類維護(hù)活動(dòng)都必須應(yīng)用于整個(gè)軟件配置,維護(hù)軟件文檔和維護(hù)軟件的可執(zhí)行代碼是同樣重要的。從圖9.3中可看到,軟件維護(hù)活動(dòng)的工作量占整個(gè)生存周期的70%以上,這是因?yàn)槁L的軟件運(yùn)行過程中需要不斷對(duì)軟件進(jìn)行修改,以滿足用戶的擴(kuò)充要求,加強(qiáng)軟件功能、性能的維護(hù)活動(dòng)以及適應(yīng)新的環(huán)境要求,它們需要花費(fèi)很多精力和時(shí)間,而且有時(shí)修改不正確,經(jīng)常還會(huì)引入新的錯(cuò)誤。同時(shí),軟件維護(hù)技術(shù)不像開發(fā)技術(shù)那樣成熟、規(guī)范化,自然消耗工作量就比較多。9.4區(qū)分維護(hù)類型的原則維護(hù)的部分任務(wù)是確定用戶的請(qǐng)求是屬于缺陷改正,還是適應(yīng)性或完善性修改。開發(fā)方通常必須免費(fèi)更正軟件缺陷,用戶則要支付適應(yīng)性或完善性軟件修改的費(fèi)用。在實(shí)踐中,區(qū)分它們可能非常困難,以下是一些指導(dǎo)原則。(1)若系統(tǒng)不能按程序員的意圖工作,則這是一個(gè)程序錯(cuò)誤,屬于產(chǎn)品缺陷。(2)若系統(tǒng)沒有實(shí)現(xiàn)陳述的需求,則這是另一類缺陷,屬于違背需求。(3)若用戶有未說明的期望,但系統(tǒng)并不支持,則這屬于灰色區(qū)域。在實(shí)踐中,說明所有需求是不現(xiàn)實(shí)的。因此,對(duì)于用戶的合理期望,應(yīng)屬于產(chǎn)品缺陷問題。(4)若問題不屬于開發(fā)時(shí)的合理期望,那么它是一項(xiàng)適應(yīng)性或完善性修改。(5)若系統(tǒng)能夠完成用戶任務(wù),但用戶想不出該如何執(zhí)行,則這屬于可用性問題。它通常不作為產(chǎn)品缺陷,除非指定了可用性需求。由此可見,在維護(hù)問題上存在灰色區(qū)域,這些灰色區(qū)域可能引發(fā)爭(zhēng)執(zhí)。為避免發(fā)生這種情況,合同可以包含這樣一項(xiàng)聲明:關(guān)于缺陷的爭(zhēng)執(zhí)應(yīng)交由雙方共同提出的仲裁者仲裁。9.5軟件維護(hù)的步驟9.5.1填寫維護(hù)申請(qǐng)報(bào)告所有軟件維護(hù)申請(qǐng)應(yīng)按規(guī)定的方式提出。軟件維護(hù)組織通常提供維護(hù)申請(qǐng)報(bào)告(MRF,MaintenanceRequestForm),或稱軟件問題報(bào)告(見表9.1),由申請(qǐng)維護(hù)的用戶填寫。

如果遇到一個(gè)錯(cuò)誤,則用戶必須完整地說明產(chǎn)生錯(cuò)誤的情況,包括輸入數(shù)據(jù)、錯(cuò)誤清單以及其他有關(guān)材料。如果申請(qǐng)的是適應(yīng)性維護(hù)或完善性維護(hù),則用戶必須提出一份修改說明書,列出所有希望的修改。維護(hù)申請(qǐng)報(bào)告將由維護(hù)管理員和系統(tǒng)監(jiān)督員來研究處理。維護(hù)申請(qǐng)報(bào)告是由軟件組織外部提交的文檔,它是計(jì)劃維護(hù)工作的基礎(chǔ)。軟件組織內(nèi)部應(yīng)相應(yīng)地做出軟件修改報(bào)告(Software

Change

Report,SCR),報(bào)告中應(yīng)指明:(1)所需修改變動(dòng)的性質(zhì);(2)申請(qǐng)修改的優(yōu)先級(jí);(3)為滿足某個(gè)維護(hù)申請(qǐng)報(bào)告所需的工作量;(4)預(yù)計(jì)修改后的狀況。

軟件修改報(bào)告應(yīng)提交修改負(fù)責(zé)人,經(jīng)批準(zhǔn)后才能開始進(jìn)一步安排維護(hù)工作。9.5.2維護(hù)計(jì)劃維護(hù)計(jì)劃在軟件開發(fā)期間由維護(hù)者制訂,宜包含用戶如何提出更改軟件產(chǎn)品的請(qǐng)求。維護(hù)計(jì)劃應(yīng)包含:(1)為何需要維護(hù);(2)由誰做什么工作;(3)所參與的每個(gè)人的角色和職責(zé)是什么;(4)工作如何執(zhí)行;(5)可用于維護(hù)的資源是什么;(6)維護(hù)在何處執(zhí)行;(7)維護(hù)何時(shí)開始。9.5.3維護(hù)工作實(shí)施對(duì)于一項(xiàng)具體的軟件維護(hù)任務(wù),在維護(hù)工作開始之前,應(yīng)該建立一個(gè)維護(hù)小組,接著制訂維護(hù)的報(bào)告,并且為這項(xiàng)維護(hù)任務(wù)建立事件流模型,在維護(hù)完成后要保存維護(hù)的記錄,最后還應(yīng)當(dāng)評(píng)價(jià)本次維護(hù)活動(dòng)。維護(hù)小組由若干名維護(hù)人員組成,其中包括一名維護(hù)管理員和數(shù)名系統(tǒng)管理員。所有的維護(hù)請(qǐng)求由維護(hù)管理員經(jīng)過分析后傳給系統(tǒng)管理員去完成。系統(tǒng)管理員是熟悉軟件某一部分的軟件技術(shù)人員。所有的維護(hù)必須在修改批準(zhǔn)人員允許的范圍內(nèi)進(jìn)行。維護(hù)小組的組成如圖9.4所示。在維護(hù)過程中,維護(hù)人員要各司其職,明確維護(hù)責(zé)任,以減少維護(hù)過程中的混亂。軟件維護(hù)所需要的一種報(bào)告是維護(hù)請(qǐng)求表。這是由軟件開發(fā)人員提供,由軟件用戶填寫的表格。如果軟件運(yùn)行遇到問題,則用戶必須詳細(xì)描述出錯(cuò)時(shí)的情況,包括輸入數(shù)據(jù)、輸出數(shù)據(jù)和其他有關(guān)資料。維護(hù)請(qǐng)求表是制訂軟件維護(hù)計(jì)劃的依據(jù)。在維護(hù)小組內(nèi)部還應(yīng)該指定一個(gè)軟件修改報(bào)告,內(nèi)容包括:本次維護(hù)所需要的工作量、維護(hù)的性質(zhì)、維護(hù)的優(yōu)先級(jí)等。在制訂維護(hù)計(jì)劃之前,軟件修改報(bào)告要交給修改批準(zhǔn)人進(jìn)行審查。上述工作完成后,就可以為維護(hù)活動(dòng)建立事件流模型了。圖9.5表示從提出維護(hù)請(qǐng)求到維護(hù)結(jié)束所出現(xiàn)的事件流。首先要判斷維護(hù)請(qǐng)求的類型。在這點(diǎn)上用戶和維護(hù)人員可能有不同的看法,用戶可能認(rèn)為這次維護(hù)是改正性維護(hù),而維護(hù)人員可能更愿意把它看成是適應(yīng)性維護(hù)或完善性維護(hù)。對(duì)于這些不同意見,雙方必須協(xié)商解決。如果是改正性維護(hù),那么接著要判斷錯(cuò)誤的嚴(yán)重程度,如果屬于嚴(yán)重錯(cuò)誤,系統(tǒng)的一部分無法運(yùn)行,則維護(hù)管理員應(yīng)該立即對(duì)問題進(jìn)行分析,并分配人員進(jìn)行維護(hù)。如果問題不嚴(yán)重,則這次維護(hù)和其他軟件開發(fā)任務(wù)放在一起,統(tǒng)一安排時(shí)間進(jìn)行。對(duì)于完善性維護(hù)和適應(yīng)性維護(hù),可以當(dāng)作同一性質(zhì)的維護(hù)。首先判斷維護(hù)要求的優(yōu)先級(jí),如果優(yōu)先級(jí)不高,則可以同其他開發(fā)任務(wù)放在一起,統(tǒng)一安排時(shí)間進(jìn)行;否則,維護(hù)管理員應(yīng)立即對(duì)問題進(jìn)行分析,并分配人員進(jìn)行維護(hù)。無論是什么性質(zhì)的維護(hù),當(dāng)分配具體的系統(tǒng)管理員實(shí)施時(shí),所需要的工作是大致相同的,包括復(fù)查軟件設(shè)計(jì)、修改代碼、單元測(cè)試、整體測(cè)試、有效性測(cè)試、系統(tǒng)測(cè)試和復(fù)審。就其本質(zhì)而言,維護(hù)工作就相當(dāng)于一次開發(fā),因?yàn)樵陂_發(fā)階段用到的文檔、開發(fā)方法,這里都會(huì)重新用到。在軟件維護(hù)事件流中的最后一步是復(fù)審,它再次驗(yàn)證軟件的所有成分是否有效,是否滿足用戶在維護(hù)請(qǐng)求表中所提的要求。維護(hù)工作完成后,就該保存維護(hù)記錄。如果沒有維護(hù)記錄,就無法評(píng)價(jià)一個(gè)軟件使用的完好程度,也無法評(píng)價(jià)維護(hù)工作的有效性,難以估計(jì)維護(hù)的實(shí)際代價(jià)。維護(hù)記錄一般包括以下信息:(1)程序標(biāo)識(shí)。(2)源程序代碼的行數(shù)。(3)機(jī)器代碼的數(shù)目。(4)編碼使用的程序設(shè)計(jì)語言。(5)程序完成的日期。(6)自從交付使用以來程序運(yùn)行的次數(shù)。(7)自從交付使用以來程序出現(xiàn)故障的次數(shù)。(8)程序修改的次數(shù)和標(biāo)識(shí)。(9)因程序修改而增加的源代碼數(shù)目。(10)因程序修改而刪除的源代碼數(shù)目。(11)每個(gè)修改所花費(fèi)的人·時(shí)數(shù)。(12)程序修改的日期。(13)軟件工程師的名字。(14)維護(hù)請(qǐng)求表的標(biāo)識(shí)。(15)維護(hù)類型。(16)維護(hù)開始和結(jié)束的日期。(17)用于完成維護(hù)任務(wù)所耗費(fèi)的人·時(shí)數(shù)。(18)與維護(hù)有關(guān)的純利潤。如果在維護(hù)過程中記錄了以上數(shù)據(jù),就可以對(duì)維護(hù)活動(dòng)進(jìn)行定量評(píng)價(jià),可以從以下幾個(gè)方面度量維護(hù)活動(dòng):(1)每次程序運(yùn)行時(shí)平均出現(xiàn)的故障數(shù)。(2)花費(fèi)在每一種維護(hù)類型上的總工作量。(3)對(duì)每個(gè)程序、每種編程語言、每種維護(hù)類型平均進(jìn)行的程序修改數(shù)。(4)增加或刪除一條源代碼所花費(fèi)的工作量。(5)維護(hù)各種編程語言的源程序所花費(fèi)的工作量。(6)處理一張維護(hù)請(qǐng)求表的平均時(shí)間。(7)各種維護(hù)請(qǐng)求類型所占的比例。根據(jù)對(duì)維護(hù)活動(dòng)所進(jìn)行的度量結(jié)果,可以幫助軟件開發(fā)人員重新做出關(guān)于開發(fā)技術(shù)、編程語言選擇、資源分配等方面的決定。9.5.4維護(hù)文檔整理在軟件維護(hù)活動(dòng)進(jìn)行的同時(shí),需要記錄一些與維護(hù)工作有關(guān)的數(shù)據(jù)信息,這些信息可作為估計(jì)軟件維護(hù)的有效程度,確定軟件產(chǎn)品的質(zhì)量,確定維護(hù)的實(shí)際開銷等工作的原始數(shù)據(jù)。其具體內(nèi)容應(yīng)包括:(1)程序標(biāo)識(shí)符。(2)源語句數(shù)。(3)機(jī)器指令條數(shù)。(4)使用的程序設(shè)計(jì)語言。(5)程序安裝的日期。(6)自從安裝以來程序運(yùn)行的次數(shù)。(7)自從安裝以來程序失效的次數(shù)。(8)程序變動(dòng)的層次和標(biāo)識(shí)。(9)因程序變動(dòng)而增加的源語句數(shù)。(10)因程序變動(dòng)而刪除的源語句數(shù)。(11)每個(gè)改動(dòng)耗費(fèi)的人·時(shí)數(shù)。(12)程序改動(dòng)的日期。(13)軟件工程師的名字。(14)維護(hù)要求表的標(biāo)識(shí)。(15)維護(hù)類型。(16)維護(hù)開始和完成的日期。(17)累計(jì)用于維護(hù)的人·時(shí)數(shù)。(18)與完成的維護(hù)相聯(lián)系的純效益。應(yīng)該為每項(xiàng)維護(hù)工作都收集上述數(shù)據(jù),以便填寫維護(hù)記錄表(見表9.2)??梢岳眠@些數(shù)據(jù)構(gòu)成一個(gè)維護(hù)數(shù)據(jù)庫的基礎(chǔ),并且用各種方法對(duì)它們進(jìn)行評(píng)價(jià)。9.5.5維護(hù)活動(dòng)評(píng)價(jià)如果已經(jīng)開始進(jìn)行維護(hù)活動(dòng),則可以對(duì)維護(hù)工作做一些定量的評(píng)價(jià)。至少可以從7個(gè)方面來度量維護(hù)工作。(1)每次程序允許平均失效的次數(shù)。(2)用于每一類維護(hù)活動(dòng)的總?cè)恕r(shí)數(shù)。(3)平均每個(gè)程序、每種語言、每種維護(hù)類型所做的程序變動(dòng)數(shù)。(4)維護(hù)過程中增加或刪除一個(gè)源語句平均花費(fèi)的人·時(shí)數(shù)。(5)維護(hù)每種語言平均花費(fèi)的人·時(shí)數(shù)。(6)一張維護(hù)表的平均周轉(zhuǎn)時(shí)間。(7)不同維護(hù)類型所占的百分比。根據(jù)對(duì)維護(hù)工作定量度量的結(jié)果,可以做出關(guān)于開發(fā)技術(shù)、語言選擇、維護(hù)工作量規(guī)劃、資源分配及其他許多方面的決定,而且可以利用這樣的數(shù)據(jù)去分析評(píng)價(jià)維護(hù)任務(wù)。9.6軟件的可維護(hù)性所謂軟件的可維護(hù)性,就是維護(hù)人員理解、掌握和修改被維護(hù)軟件的難易程度。具有可維護(hù)性的軟件,應(yīng)具備如表9.3所示的4條性質(zhì)。符合上述4個(gè)條件的軟件其可維護(hù)性很好,反之,可維護(hù)性就差。由此可知,可維護(hù)性與開發(fā)人員的素質(zhì)關(guān)系極大。低素質(zhì)的開發(fā)人員開發(fā)出低質(zhì)量的軟件,其可維護(hù)性差,維護(hù)難度系數(shù)大,市場(chǎng)潛力就會(huì)十分渺茫。1.決定軟件可維護(hù)性的因素決定軟件可維護(hù)性的因素有:(1)可理解性:軟件的可理解性表現(xiàn)為人們通過閱讀源程序代碼和相關(guān)文檔,了解程序的結(jié)構(gòu)、功能及使用的容易程度。一個(gè)可理解性好的程序應(yīng)具備的特性有:模塊化、編碼風(fēng)格一致,不使用令人捉摸不定或含糊不清的代碼,使用有意義的數(shù)據(jù)名和過程名,結(jié)構(gòu)化,具有完整性等。(2)可靠性:表明一個(gè)程序按照用戶的要求和設(shè)計(jì)目標(biāo)在給定的一段時(shí)間內(nèi)正確執(zhí)行的概率。關(guān)于可靠性,度量的標(biāo)準(zhǔn)主要有:①平均失效間隔時(shí)間(MITF)。②平均修復(fù)時(shí)間(MTTR)。③有效:A?=?MTBD(MTBD?+?MDT),其中MTBD為系統(tǒng)平均不工作間隔時(shí)間,MDT為平均不工作時(shí)間。(3)可測(cè)試性:診斷和測(cè)試系統(tǒng)的難易程度。(4)可修改性:可修改性表明程序容易修改的程度。一個(gè)可修改的程序應(yīng)當(dāng)是可理解的、通用的、靈活的、簡(jiǎn)單的。其中,通用性是指程序適用于各種功能變化而無須修改。靈活性是指能夠容易地對(duì)程序進(jìn)行修改。2.可維護(hù)性復(fù)審在軟件工程的每一個(gè)階段、每一項(xiàng)活動(dòng)的復(fù)審環(huán)節(jié)中,應(yīng)該著重對(duì)可維護(hù)性進(jìn)行復(fù)審,盡可能提高可維護(hù)性,至少要保證不降低可維護(hù)性。9.7軟件維護(hù)的副作用所謂軟件維護(hù)的副作用,是指因修改軟件而造成的錯(cuò)誤或其他不希望發(fā)生的情況。軟件維護(hù)的副作用主要有3種,即修改軟件源程序的副作用、修改數(shù)據(jù)的副作用和修改文檔資料的副作用。1.修改軟件源程序的副作用在使用程序設(shè)計(jì)語言修改源代碼時(shí),都可能引入錯(cuò)誤。例如,刪除或修改一個(gè)子程序,刪除或修改一個(gè)標(biāo)號(hào),刪除或修改一個(gè)標(biāo)識(shí)符,改變程序代碼的時(shí)序關(guān)系,改變占用存儲(chǔ)的大小,改變邏輯運(yùn)算符,修改文件的打開或關(guān)閉,改進(jìn)程序的執(zhí)行效率,把設(shè)計(jì)的改變翻譯成代碼的改變,以及為邊界條件的邏輯測(cè)試做出改變時(shí),都容易引入錯(cuò)誤。2.修改數(shù)據(jù)的副作用在修改數(shù)據(jù)結(jié)構(gòu)時(shí),有可能造成軟件設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)不匹配,因而導(dǎo)致軟件出錯(cuò)。修改數(shù)據(jù)的副作用就是修改軟件信息結(jié)構(gòu)導(dǎo)致的結(jié)果。例如,在重新定義局部或全局常量,重新定義記錄或文件格式,增大或減小一個(gè)數(shù)組或高層數(shù)據(jù)結(jié)構(gòu)的大小,修改全局或公共數(shù)據(jù),重新初始化控制標(biāo)志或指針,重新排列輸入/輸出或子程序的參數(shù)時(shí),容易導(dǎo)致設(shè)計(jì)與數(shù)據(jù)不相容的錯(cuò)誤。修改數(shù)據(jù)的副作用可以通過詳細(xì)的設(shè)計(jì)文檔加以控制。在此文檔中描述了一種交叉引用,把數(shù)據(jù)元素、記錄、文件和其他結(jié)構(gòu)聯(lián)系起來。3.修改文檔資料的副作用對(duì)數(shù)據(jù)流、軟件結(jié)構(gòu)、模塊邏輯或任何其他有關(guān)特性進(jìn)行修改時(shí),必須對(duì)相關(guān)技術(shù)文檔進(jìn)行相應(yīng)修改,否則會(huì)導(dǎo)致文檔與程序功能不匹配,缺省條件改變,新錯(cuò)誤信息不正確等錯(cuò)誤,使得軟件文檔不能反映軟件的當(dāng)前狀態(tài)。對(duì)于用戶來說,軟件事實(shí)上就是文檔。如果對(duì)可執(zhí)行軟件的修改不反映在文檔里,就會(huì)產(chǎn)生修改文檔的副作用。例如,對(duì)交互輸入的順序或格式進(jìn)行的修改,如果沒有正確地記錄在文檔中,就可能引起重大的問題。過時(shí)的文檔內(nèi)容、索引和文本可能造成沖突,引起用戶的失敗和不滿。因此,必須在軟件交付之前對(duì)整個(gè)軟件配置進(jìn)行評(píng)審,以減少文檔的副作用。軟件維護(hù)的方式及其副作用的表現(xiàn)如表9.4所示。9.8軟件重用1.軟件重用的概念軟件重用是指在兩次或多次不同的軟件開發(fā)過程中重復(fù)使用相同或相似軟件元素的過程。軟件元素包括程序代碼、測(cè)試用例、設(shè)計(jì)文檔、設(shè)計(jì)過程、需求分析文檔甚至領(lǐng)域知識(shí)。對(duì)于新的軟件開發(fā)項(xiàng)目而言,它們或者是構(gòu)成整個(gè)目標(biāo)軟件系統(tǒng)的部件,或者在軟件開發(fā)過程中發(fā)揮某種作用。通常將這些軟件元素稱為軟部件。為了能夠在軟件開發(fā)過程中重用現(xiàn)有的軟部件,必須在此之前不斷地進(jìn)行軟部件的積累,并將它們組織成軟部件庫。這就是說,軟件重用不僅要討論如何檢索所需的軟部件以及如何對(duì)它們進(jìn)行必要的修剪,還要解決如何選取軟部件、如何組織軟部件庫等問題。因此,軟件重用方法學(xué)通常要求軟件開發(fā)項(xiàng)目既要考慮重用已有軟部件的機(jī)制,又要系統(tǒng)地考慮生產(chǎn)可重用軟部件的機(jī)制。這類項(xiàng)目通常被稱為軟件重用項(xiàng)目。2.軟件重用技術(shù)的意義軟件重用技術(shù)的意義有:(1)可以減少軟件開發(fā)過程中大量的重復(fù)性工作,提高軟件生產(chǎn)率,降低開發(fā)成本,縮短開發(fā)周期。(2)通過軟部件嚴(yán)格的質(zhì)量認(rèn)證,使采用軟件重用技術(shù)開發(fā)的軟件系統(tǒng)有更可靠的質(zhì)量保證。(3)使用可重用軟部件有利于軟件系統(tǒng)的結(jié)構(gòu)優(yōu)化,提高軟件的靈活性和標(biāo)準(zhǔn)化程度。3.軟件重用的過程按照重要活動(dòng)是否跨越相似性較小的多個(gè)應(yīng)用領(lǐng)域,軟件重用可區(qū)別為橫向重用和縱向重用。橫向重用(horizontalreuse)是指重用不同應(yīng)用領(lǐng)域中的軟件元素,如數(shù)據(jù)結(jié)構(gòu)、分類算法、人機(jī)界面構(gòu)件等。標(biāo)準(zhǔn)函數(shù)庫是一種典型的、原始的橫向重用機(jī)制??v向重用是指在一類具有較多公共性的應(yīng)用領(lǐng)域之間進(jìn)行軟部件重用。因?yàn)樵趦蓚€(gè)截然不同的應(yīng)用領(lǐng)域之間實(shí)施軟件重用的潛力不大,所以縱向重用才廣受矚目,并成為軟件重用技術(shù)的真正所在。不難理解,縱向重用活動(dòng)的主要關(guān)鍵點(diǎn)即是域分析;根據(jù)應(yīng)用領(lǐng)域的特征及相似性預(yù)測(cè)軟部件的可重用性。一旦根據(jù)域確認(rèn)了軟部件的重用價(jià)值,即可進(jìn)行軟部件的開發(fā)并對(duì)具有重用價(jià)值的軟部件進(jìn)行一般化,以便它們能夠適應(yīng)新的類似的應(yīng)用領(lǐng)域。然后,軟部件及其文檔即可進(jìn)入軟部件庫,成為可供后續(xù)開發(fā)項(xiàng)目使用的可重用資源。這些部件構(gòu)成軟部件構(gòu)造活動(dòng)。顯然,它是一個(gè)軟部件不斷積累、不斷完善的漸進(jìn)過程。隨著軟部件的不斷豐富,軟部件庫的規(guī)模會(huì)不斷擴(kuò)大,因此,庫的組織結(jié)構(gòu)將直接影響軟部件的檢索效應(yīng),特別是當(dāng)檢索手段并不局限于標(biāo)準(zhǔn)函數(shù)庫所采用的簡(jiǎn)單名字匹配方法時(shí)更是如此。可供候選的軟部件從庫中檢索出來以后,用戶還必須理解其功能及行為,以判別它是否真正適用于當(dāng)前項(xiàng)目。必要時(shí)可考慮對(duì)某個(gè)與期望的功能/行為匹配程度最佳的軟部件進(jìn)行稍許修改,甚至可以將修改后的軟部件加進(jìn)軟部件庫以替代原有的軟部件。當(dāng)然,這要求修改后的軟部件比原有軟部件具有更高的重用價(jià)值。上述軟件重用方法如圖9.6所示。顯然,軟件重用過程可借助計(jì)算機(jī)的幫助。支持軟件重用的CASE工具的主要任務(wù)是,用某種組織結(jié)構(gòu)實(shí)現(xiàn)軟部件庫的存儲(chǔ),提供友好的人機(jī)界面,幫助用戶瀏覽、檢索和修改軟部件庫,并且對(duì)用戶感興趣的問題進(jìn)行解釋。事實(shí)上,現(xiàn)在幾乎所有的軟件重用活動(dòng)都是在CASE工具的幫助下進(jìn)行的。使用重用技術(shù)可以減少軟件開發(fā)活動(dòng)中大量的重復(fù)性工作,這樣就能夠提高軟件的生產(chǎn)率,降低開發(fā)成本,縮短開發(fā)周期。同時(shí),由于軟部件大都經(jīng)過嚴(yán)格的質(zhì)量認(rèn)證,并在實(shí)際運(yùn)行環(huán)境中得到檢驗(yàn),因此,重用軟部件有助于改善軟件質(zhì)量。此外,大量使用軟部件后,軟件的靈活性和標(biāo)準(zhǔn)化程度也可望得到提高。10.1面向?qū)ο蟮母拍?/p>

10.2面向?qū)ο蟮哪P?/p>

10.3面向?qū)ο蟮姆治?/p>

10.4面向?qū)ο蟮脑O(shè)計(jì)

10.5面向?qū)ο蟮膶?shí)現(xiàn)

10.6面向?qū)ο蠛突趯?duì)象的區(qū)別10.1面向?qū)ο蟮母拍蠲嫦驅(qū)ο?ObjectOriented,OO)是20世紀(jì)90年代以來主流的軟件開發(fā)方法。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開發(fā),擴(kuò)展到很寬的范圍,如數(shù)據(jù)庫系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺(tái)、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。起初,“面向?qū)ο蟆笔菍V冈诔绦蛟O(shè)計(jì)中采用封裝、繼承、抽象等設(shè)計(jì)方法??墒?,這個(gè)定義顯然不適合現(xiàn)在的情況。面向?qū)ο蟮乃枷胍呀?jīng)涉及軟件開發(fā)的各個(gè)方面,如面向?qū)ο蟮姆治?ObjectOrientedAnalysis,OOA),面向?qū)ο蟮脑O(shè)計(jì)(ObjectOrientedDesign,OOD)以及面向?qū)ο蟮木幊虒?shí)現(xiàn)(ObjectOrientedProgramming,OOP)。10.1.1傳統(tǒng)開發(fā)方法存在的問題傳統(tǒng)開發(fā)方法存在以下幾個(gè)問題。1.軟件重用性差重用性是指同一事物不經(jīng)修改或稍加修改就可多次重復(fù)使用的性質(zhì)。傳統(tǒng)的程序設(shè)計(jì)通過庫函數(shù)的方式來實(shí)現(xiàn)重用,實(shí)踐表明標(biāo)準(zhǔn)函數(shù)庫缺乏靈活性,往往難以適應(yīng)不同應(yīng)用場(chǎng)合的不同要求。對(duì)于用戶自己設(shè)計(jì)的功能模塊,對(duì)它的重用也有限制,一方面要保證功能完全相同,否則需要進(jìn)行修改,另一方面,過程和數(shù)據(jù)是相互依賴的,功能的變化往往涉及數(shù)據(jù)結(jié)構(gòu)的改變,如果新的應(yīng)用中的數(shù)據(jù)與原來模塊中的數(shù)據(jù)不同,則對(duì)數(shù)據(jù)進(jìn)行修改的同時(shí),功能模塊也需要修改。2.軟件可維護(hù)性差軟件工程強(qiáng)調(diào)軟件的可維護(hù)性,強(qiáng)調(diào)文檔資料的重要性,規(guī)定最終的軟件產(chǎn)品應(yīng)該由完整、一致的配置成分組成。在軟件開發(fā)過程中,始終強(qiáng)調(diào)軟件的可讀性、可修改性和可測(cè)試性是軟件的重要的質(zhì)量指標(biāo)。實(shí)踐證明,用傳統(tǒng)方法開發(fā)出來的軟件,維護(hù)時(shí)其費(fèi)用和成本仍然很高,其原因是可修改性差,維護(hù)困難,導(dǎo)致可維護(hù)性差。3.開發(fā)出的軟件不能滿足用戶需要用傳統(tǒng)的結(jié)構(gòu)化方法開發(fā)大型軟件系統(tǒng)涉及各種不同領(lǐng)域的知識(shí),在開發(fā)需求模糊或需求動(dòng)態(tài)變化的系統(tǒng)時(shí),所開發(fā)出的軟件系統(tǒng)往往不能真正滿足用戶的需要。用結(jié)構(gòu)化方法開發(fā)的軟件,其穩(wěn)定性、可修改性和可重用性都比較差,這是因?yàn)榻Y(jié)構(gòu)化方法的本質(zhì)是功能分解,從代表目標(biāo)系統(tǒng)整體功能的單個(gè)處理著手,自頂向下不斷把復(fù)雜的處理分解為子處理,這樣一層一層地分解下去,直到僅剩下若干個(gè)容易實(shí)現(xiàn)的子功能處理為止,然后用相應(yīng)的工具來描述各個(gè)最底層的處理。因此,結(jié)構(gòu)化方法是圍繞實(shí)現(xiàn)處理功能的“過程”來構(gòu)造系統(tǒng)的。然而,用戶需求的變化大部分是針對(duì)功能的,因此,這種變化對(duì)于基于過程的設(shè)計(jì)來說是災(zāi)難性的。用這種方法設(shè)計(jì)出來的系統(tǒng)結(jié)構(gòu)常常是不穩(wěn)定的,用戶需求的變化往往造成系統(tǒng)結(jié)構(gòu)的較大變化,從而需要花費(fèi)很大代價(jià)才能實(shí)現(xiàn)這種變化。10.1.2面向?qū)ο蟮幕靖拍?.對(duì)象對(duì)象是人們要進(jìn)行研究的任何事物,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計(jì)劃或事件。我們所指的對(duì)象是計(jì)算機(jī)中的對(duì)象,是對(duì)現(xiàn)實(shí)中對(duì)象的模擬,它抽象出現(xiàn)實(shí)世界中對(duì)象的特征和行為,分別用數(shù)據(jù)和函數(shù)刻畫,并封裝成一個(gè)整體。模擬后的計(jì)算機(jī)對(duì)象既能體現(xiàn)現(xiàn)實(shí)世界事物的狀態(tài),也具有相應(yīng)的行為。在不同領(lǐng)域中對(duì)于對(duì)象有不同理解。一般地認(rèn)為,對(duì)象就是一種事物,一個(gè)實(shí)體。在面向?qū)ο蟮念I(lǐng)域中,則應(yīng)當(dāng)從概念和實(shí)現(xiàn)形式兩個(gè)角度來理解對(duì)象。從概念上講,對(duì)象是代表著正在創(chuàng)建的系統(tǒng)中的一個(gè)實(shí)體。例如,一個(gè)商品銷售系統(tǒng),像顧客、商品、柜臺(tái)、廠家等都是對(duì)象,這些對(duì)象對(duì)于實(shí)現(xiàn)系統(tǒng)的完整功能都是必要的。從實(shí)現(xiàn)形式上講,對(duì)象是一個(gè)狀態(tài)和操作(方法)的封裝體。狀態(tài)是由對(duì)象的數(shù)據(jù)結(jié)構(gòu)的內(nèi)容和值定義的,方法是一系列的實(shí)現(xiàn)步驟,它是由若干操作構(gòu)成的。對(duì)象實(shí)現(xiàn)了信息隱藏,對(duì)象與外部是通過操作接口聯(lián)系的,方法的具體實(shí)現(xiàn)外部是不可見的。封裝的目的就是阻止非法的訪問,操作接口提供了這個(gè)對(duì)象的功能。對(duì)象是通過消息與另一個(gè)對(duì)象傳遞信息的,每當(dāng)一個(gè)操作被調(diào)用時(shí),就有一條消息被發(fā)送到這個(gè)對(duì)象上,消息帶來了將被執(zhí)行的這個(gè)操作的詳細(xì)內(nèi)容。一般地講,消息傳遞的語法隨系統(tǒng)不同而不同,其他組成部分包括:目標(biāo)對(duì)象、所請(qǐng)求的方法和參數(shù)。2.對(duì)象的狀態(tài)和行為對(duì)象具有狀態(tài),一個(gè)對(duì)象用數(shù)據(jù)值來描述它的狀態(tài)。對(duì)象還有操作,用于改變對(duì)象的狀態(tài),對(duì)象及其操作就是對(duì)象的行為。對(duì)象實(shí)現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對(duì)象的統(tǒng)一體中。3.類我們習(xí)慣上把具有相同或相似性質(zhì)的對(duì)象劃分成類。因此,對(duì)象的抽象是類,類的具體化就是對(duì)象,也可以說類的實(shí)例是對(duì)象。類是創(chuàng)建對(duì)象的樣板,它包含著所創(chuàng)建對(duì)象的狀態(tài)描述和方法的定義。類的完整描述包含了外部接口和內(nèi)部算法以及數(shù)據(jù)結(jié)構(gòu)的形式。由一個(gè)特定的類所創(chuàng)建的對(duì)象被稱為這個(gè)類的實(shí)例,因此類是對(duì)象的抽象及描述,它是具有共同行為的若干對(duì)象的統(tǒng)一描述體。類中要包含生成對(duì)象的具體方法。類是抽象數(shù)據(jù)類型的實(shí)現(xiàn)。一個(gè)類的所有對(duì)象都有相同的數(shù)據(jù)結(jié)構(gòu),并且共享相同的實(shí)現(xiàn)操作的代碼,而各個(gè)對(duì)象有著各自不同的狀態(tài),即私有的存儲(chǔ)。因此,類是所有對(duì)象的共同的行為和不同狀態(tài)的集合體。類具有屬性,它是對(duì)象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。類具有操作,它是對(duì)象的行為的抽象,用操作名和實(shí)現(xiàn)該操作的方法來描述。4.類的結(jié)構(gòu)在客觀世界中有若干類,這些類之間有一定的結(jié)構(gòu)關(guān)系。通常有兩種主要的結(jié)構(gòu)關(guān)系,即一般—具體結(jié)構(gòu)關(guān)系,整體—部分結(jié)構(gòu)關(guān)系。(1)一般—具體結(jié)構(gòu)稱為分類結(jié)構(gòu),也可以說是“或”關(guān)系,或者是“isa”關(guān)系。(2)整體—部分結(jié)構(gòu)稱為組裝結(jié)構(gòu),它們之間的關(guān)系是一種“與”關(guān)系,或者是“hasa”關(guān)系。5.消息和方法對(duì)象之間進(jìn)行通信的結(jié)構(gòu)叫做消息。在對(duì)象的操作中,當(dāng)一個(gè)消息發(fā)送給某個(gè)對(duì)象時(shí),消息包含接收對(duì)象去執(zhí)行某種操作的信息。發(fā)送一條消息至少要包括說明接受消息的對(duì)象名、發(fā)送給該對(duì)象的消息名(即對(duì)象名、方法名)。一般還要對(duì)參數(shù)加以說明,參數(shù)可以是認(rèn)識(shí)該消息的對(duì)象所知道的變量名,或者是所有對(duì)象都知道的全局變量名。類中操作的實(shí)現(xiàn)過程叫做方法,一個(gè)方法有方法名、參數(shù)和方法體。消息傳遞如圖10.1所示。10.1.3面向?qū)ο蟮奶卣?1)對(duì)象唯一性。每個(gè)對(duì)象都有自身唯一的標(biāo)識(shí),通過這種標(biāo)識(shí),可找到相應(yīng)的對(duì)象。在對(duì)象的整個(gè)生命期中,它的標(biāo)識(shí)都不改變,不同的對(duì)象不能有相同的標(biāo)識(shí)。(2)分類性。分類性是指將具有一致的數(shù)據(jù)結(jié)構(gòu)(屬性)和行為(操作)的對(duì)象抽象成類。一個(gè)類就是這樣一種抽象,它反映了與應(yīng)用有關(guān)的重要性質(zhì),而忽略其他一些無關(guān)內(nèi)容。任何類的劃分都是主觀的,但必須與具體的應(yīng)用有關(guān)。(3)繼承性。繼承性是子類自動(dòng)共享父類數(shù)據(jù)結(jié)構(gòu)和方法的機(jī)制,這是類之間的一種關(guān)系。在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并加入若干新的內(nèi)容。繼承性是面向?qū)ο蟪绦蛟O(shè)計(jì)語言不同于其他語言的最重要的特點(diǎn),是其他語言所沒有的。在類層次中,子類只繼承一個(gè)父類的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為單重繼承。在類層次中,子類繼承了多個(gè)父類的數(shù)據(jù)結(jié)構(gòu)和方法,則稱為多重繼承。在軟件開發(fā)中,類的繼承性使所建立的軟件具有開放性、可擴(kuò)充性,這是信息組織與分類的行之有效的方法,它簡(jiǎn)化了對(duì)象、類的創(chuàng)建工作量,增加了代碼的可重性。采用繼承性,提供了類的規(guī)范的等級(jí)結(jié)構(gòu)。通過類的繼承關(guān)系,使公共的特性能夠共享,提高了軟件的重用性。(4)多態(tài)性。多態(tài)性是指相同的操作或函數(shù)、過程可作用于多種類型的對(duì)象上并獲得不同的結(jié)果。不同的對(duì)象,收到同一消息可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性。多態(tài)性允許每個(gè)對(duì)象以適合自身的方式去響應(yīng)共同的消息。多態(tài)性增強(qiáng)了軟件的靈活性和重用性。10.1.4面向?qū)ο蟮囊孛嫦驅(qū)ο蟮囊匕ǎ?1)抽象。抽象是指強(qiáng)調(diào)實(shí)體的本質(zhì)、內(nèi)在的屬性。在系統(tǒng)開發(fā)中,抽象指的是在決定如何實(shí)現(xiàn)對(duì)象之前的對(duì)象的意義和行為。使用抽象可以盡可能避免過早考慮一些細(xì)節(jié)。類實(shí)現(xiàn)了對(duì)象的數(shù)據(jù)(即狀態(tài))和行為的抽象。(2)封裝性(信息隱藏)。封裝性是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ)。面向?qū)ο蟮念愂欠庋b良好的模塊,類定義將其說明(用戶可見的外部接口)與實(shí)現(xiàn)(用戶不可見的內(nèi)部實(shí)現(xiàn))顯式地分開,其內(nèi)部實(shí)現(xiàn)按其具體定義的作用域提供保護(hù)。對(duì)象是封裝的最基本單位。封裝防止了程序相互依賴性而帶來的變動(dòng)影響。面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。(3)共享性。面向?qū)ο蠹夹g(shù)在不同級(jí)別上促進(jìn)了共享同一類中的共享。同一類中的對(duì)象有著相同的數(shù)據(jù)結(jié)構(gòu)。這些對(duì)象之間是結(jié)構(gòu)、行為特征的共享關(guān)系。在同一應(yīng)用中共享。在同一應(yīng)用的類層次結(jié)構(gòu)中,存在繼承關(guān)系的各相似子類中,存在數(shù)據(jù)結(jié)構(gòu)和行為的繼承,使各相似子類共享共同的結(jié)構(gòu)和行為。使用繼承來實(shí)現(xiàn)代碼的共享,這也是面向?qū)ο蟮闹饕獌?yōu)點(diǎn)之一。另一種共享是在不同應(yīng)用中的共享。面向?qū)ο蟛粌H允許在同一應(yīng)用中共享信息,而且為未來目標(biāo)的可重用設(shè)計(jì)準(zhǔn)備了條件。通過類庫這種機(jī)制和結(jié)構(gòu)來實(shí)現(xiàn)不同應(yīng)用中的信息共享。(4)強(qiáng)調(diào)對(duì)象結(jié)構(gòu)而不是程序結(jié)構(gòu)。10.1.5面向?qū)ο蟮拈_發(fā)方法1.?Booch方法Booch最先描述了面向?qū)ο蟮能浖_發(fā)方法的基礎(chǔ)問題,指出面向?qū)ο箝_發(fā)是一種根本不同于傳統(tǒng)的功能分解的設(shè)計(jì)方法。面向?qū)ο蟮能浖纸飧咏藢?duì)客觀事務(wù)的理解,而功能分解只通過問題空間的轉(zhuǎn)換來獲得。2.?Coad方法Coad方法是1989年Coad和Yourdon提出的面向?qū)ο箝_發(fā)方法。該方法的主要優(yōu)點(diǎn)是通過多年來大系統(tǒng)開發(fā)的經(jīng)驗(yàn)與面向?qū)ο蟾拍畹挠袡C(jī)結(jié)合,在對(duì)象、結(jié)構(gòu)、屬性和操作的認(rèn)定方面,提出了一套系統(tǒng)的原則。該方法完成了從需求角度進(jìn)一步進(jìn)行類和類層次結(jié)構(gòu)的認(rèn)定。盡管Coad方法沒有引入類和類層次結(jié)構(gòu)的術(shù)語,但事實(shí)上已經(jīng)在分類結(jié)構(gòu)、屬性、操作、消息關(guān)聯(lián)等概念中體現(xiàn)了類和類層次結(jié)構(gòu)的特征。3.?OMT方法OMT方法是1991年由JamesRumbaugh等5人提出來的,其經(jīng)典著作為“面向?qū)ο蟮慕Ec設(shè)計(jì)”。該方法是一種新興的面向?qū)ο蟮拈_發(fā)方法,開發(fā)工作的基礎(chǔ)是對(duì)真實(shí)世界的對(duì)象建模,然后圍繞這些對(duì)象使用分析模型來進(jìn)行獨(dú)立于語言的設(shè)計(jì),面向?qū)ο蟮慕:驮O(shè)計(jì)促進(jìn)了對(duì)需求的理解,有利于開發(fā)出更清晰、更容易維護(hù)的軟件系統(tǒng)。該方法為大多數(shù)應(yīng)用領(lǐng)域的軟件開發(fā)提供了一種實(shí)際的、高效的保證,努力尋求一種問題求解的實(shí)際方法。4.?UML(UnifiedModelingLanguage)語言軟件工程領(lǐng)域在1995—1997年取得了前所未有的進(jìn)展,其成果超過軟件工程領(lǐng)域過去15年的成就總和,其中最重要的成果之一就是統(tǒng)一建模語言(UML)的出現(xiàn)。UML將是面向?qū)ο蠹夹g(shù)領(lǐng)域內(nèi)占主導(dǎo)地位的標(biāo)準(zhǔn)建模語言。UML不僅統(tǒng)一了Booch方法、OMT方法和OOSE(面向?qū)ο筌浖こ?方法的表示方法,而且對(duì)其作了進(jìn)一步的發(fā)展,最終統(tǒng)一為大眾接受的標(biāo)準(zhǔn)建模語言。UML是一種定義良好、易于表達(dá)、功能強(qiáng)大且普遍適用的建模語言。它融入了軟件工程領(lǐng)域的新思想、新方法和新技術(shù)。它的作用域不限于支持面向?qū)ο蟮姆治雠c設(shè)計(jì),還支持從需求分析開始的軟件開發(fā)全過程。10.2面向?qū)ο蟮哪P?0.2.1對(duì)象模型對(duì)象模型表示了靜態(tài)的、結(jié)構(gòu)化的系統(tǒng)數(shù)據(jù)性質(zhì),描述了系統(tǒng)的靜態(tài)結(jié)構(gòu),它是從客觀世界實(shí)體的對(duì)象關(guān)系角度來描述,表現(xiàn)了對(duì)象的相互關(guān)系。該模型主要關(guān)心系統(tǒng)中對(duì)象的結(jié)構(gòu)、屬性和操作,它是分析階段3個(gè)模型的核心,是其他兩個(gè)模型的框架。1.對(duì)象和類對(duì)象和類涉及以下內(nèi)容:(1)對(duì)象。對(duì)象建模的目的就是描述對(duì)象。(2)類。通過將對(duì)象抽象成類,可以使問題抽象化,抽象增強(qiáng)了模型的歸納能力。類的符號(hào)表示如圖10.2所示。(3)屬性。屬性指的是類中對(duì)象所具有的性質(zhì)(數(shù)據(jù)值)。(4)操作和方法。操作是類中對(duì)象所使用的一種功能或變換。類中的各對(duì)象可以共享操作,每個(gè)操作都有一個(gè)目標(biāo)對(duì)象作為其隱含參數(shù)。方法是類的操作的實(shí)現(xiàn)步驟。2.關(guān)聯(lián)關(guān)聯(lián)用于描述類與類之間的連接。由于對(duì)象是類的實(shí)例,因此,類與類之間的關(guān)聯(lián)也就是其對(duì)象之間的關(guān)聯(lián)。類與類之間有多種連接方式,每種連接的含義各不相同(語義的連接),但外部表示形式相似,故統(tǒng)稱為關(guān)聯(lián)。關(guān)聯(lián)關(guān)系一般都是雙向的,即關(guān)聯(lián)的對(duì)象雙方彼此都能與對(duì)方通信。反過來說,如果某兩個(gè)類的對(duì)象之間存在可以互相通信的關(guān)系,或者說對(duì)象雙方能夠感知另一方,那么這兩個(gè)類之間就存在關(guān)聯(lián)關(guān)系。描述這種關(guān)系常用的字句是:“彼此知道”“互相連接”等。根據(jù)不同的含義,關(guān)聯(lián)可分為普通關(guān)聯(lián)、遞歸關(guān)聯(lián)、限定關(guān)聯(lián)、或關(guān)聯(lián)、有序關(guān)聯(lián)、三元關(guān)聯(lián)(見圖10.3)和聚合7種。比較常用的關(guān)聯(lián)有普通關(guān)聯(lián)、遞歸關(guān)聯(lián)和聚合。1)普通關(guān)聯(lián)普通關(guān)聯(lián)是最常見的一種關(guān)聯(lián),只要類與類之間存在連接關(guān)系就可以用普通關(guān)聯(lián)表示。比如,作家使用計(jì)算機(jī),計(jì)算機(jī)會(huì)將處理結(jié)果等信息返回給作家,那么,在其各自所對(duì)應(yīng)的類之間就存在普通關(guān)聯(lián)關(guān)系。普通關(guān)聯(lián)的圖示是連接兩個(gè)類之間的直線,如圖10.4所示。2)遞歸關(guān)聯(lián)如果一個(gè)類與它本身有關(guān)聯(lián)關(guān)系,那么這種關(guān)聯(lián)稱為遞歸關(guān)聯(lián)。任何關(guān)聯(lián)關(guān)系中都涉及與此關(guān)聯(lián)有關(guān)的角色,也就是與此關(guān)聯(lián)相連的類中的對(duì)象所扮演的角色關(guān)聯(lián)中的角色通常用字符串命名。在類圖中,把角色的名字放置在與此角色有關(guān)的關(guān)聯(lián)關(guān)系(直線)的末端,并且緊挨著使用該角色的類。角色名是關(guān)聯(lián)的一個(gè)組成部分,建模者可根據(jù)需要選用。引入角色的好處是能夠指明類和類的對(duì)象之間的聯(lián)系。注意,角色名不是類的組成部分,一個(gè)類可以在不同的關(guān)聯(lián)中扮演不同的角色。3)聚合聚合是關(guān)聯(lián)的特例。如果類與類之間的關(guān)系具有“整體與部分”的特點(diǎn),則把這樣的關(guān)聯(lián)稱為聚合。例如,汽車由車輪、發(fā)動(dòng)機(jī)、底盤等構(gòu)成,則表示汽車的類與表示輪子的類、發(fā)動(dòng)機(jī)的類、底盤的類之間的關(guān)系就具有“整體與部分”的特點(diǎn),因此,這是一個(gè)聚合關(guān)系。識(shí)別聚合關(guān)系的常用方法是尋找“由……構(gòu)成”“包含”“是……的一部分”等字句,這些字句很好地反映了相關(guān)類之間的“整體-部分”關(guān)系。聚合的圖示方式為,在表示關(guān)聯(lián)關(guān)系的直線末端加一個(gè)空心的小菱形,空心菱形緊挨著具有整體性質(zhì)的類,如圖10.8所示,聚合關(guān)系中可以出現(xiàn)重?cái)?shù)、角色(僅用于表示部分的類)和限定詞,也可以給聚合關(guān)系命名,圖10.8所示的聚合關(guān)系表示海軍由許多軍艦組成。除去上述的一般聚合外,聚合還有兩種特殊的聚合方式,即共享聚合和復(fù)合聚合。如果聚合關(guān)系中的處于部分方的對(duì)象同時(shí)參與了多個(gè)處于整體方對(duì)象的構(gòu)成,則該聚合稱為共享聚合。比如,一個(gè)球隊(duì)(整體方)由多個(gè)球員(部分方)組成,但是一個(gè)球員還可能加入了多個(gè)球隊(duì),球隊(duì)和球員之間的這種關(guān)系就是共享聚合。共享聚合關(guān)系可以通過聚合的重?cái)?shù)反映出來,如果作為整體方的類的重?cái)?shù)不是1,那么該聚合就是共享聚合,如圖10.9所示。如果構(gòu)成整體類的部分類,完全隸屬于整體類,則這樣的聚合稱為復(fù)合聚合。換句話說,如果沒有整體類,則部分類也沒有存在的價(jià)值,部分類的存在是因?yàn)橛姓w類的存在。比如,窗口由文本框、列表框、按鈕和菜單組成。整體方的重?cái)?shù)必須是零或1,部分方的重?cái)?shù)可取任意范圍值,如圖10.10所示。3.繼承一個(gè)類的所有信息(屬性或操作)能被另一個(gè)類繼承,繼承某個(gè)類的子類中不僅可以有屬于自己的信息,而且還擁有了被繼承類中的信息。引入繼承的好處在于由于把一般的公共信息放在父類中,因此處理某個(gè)具體特殊情況時(shí)只需要定義該情況的個(gè)別信息,公共信息從父類中繼承得來,增強(qiáng)了系統(tǒng)的靈活性、易維護(hù)性和可擴(kuò)充性。程序員只要定義新擴(kuò)充或更改的信息就可以了,舊的信息完全不必修改(仍可繼續(xù)使用),大大縮短了維護(hù)系統(tǒng)的時(shí)間。繼承某類所有信息的具體類,稱為子類,被繼承類稱為父類。可以從父類中繼承的信息有屬性、操作和所有的關(guān)聯(lián)關(guān)系。建模過程如下:(1)識(shí)別繼承關(guān)系。確定了類中應(yīng)該定義的屬性之后,就可以利用繼承機(jī)制共享公共性質(zhì),并對(duì)系統(tǒng)中眾多的類加以組織。繼承關(guān)系的建立實(shí)質(zhì)上是知識(shí)抽取的過程,它應(yīng)該反映出一定深度的領(lǐng)域知識(shí),因此必須有領(lǐng)域?qū)<颐芮信浜喜拍芡瓿?。許多歸納關(guān)系都是根據(jù)客觀世界現(xiàn)有的分類模式建立起來的,只要可能,就應(yīng)該使用現(xiàn)有的概念。一般說來,可以使用以下兩種方式建立繼承(即歸納)關(guān)系。①自底向上:抽象出現(xiàn)有類的共同性質(zhì)泛化出父類,這個(gè)過程實(shí)質(zhì)上模擬人類歸納思維過程。②自頂向下:把現(xiàn)有類細(xì)化成更具體的子類,這模擬了人類的演繹思維過程。從應(yīng)用域中常常能明顯看出應(yīng)該做的自頂向下的具體化工作。例如,帶有形容詞修飾的名詞詞組往往暗示了一些具體類。但是,在分析階段應(yīng)該避免過度細(xì)化。使用多重繼承機(jī)制時(shí),通常應(yīng)該指定一個(gè)主要父類,從它繼承大部分屬性和行為;次要父類只補(bǔ)充一些屬性和行為。(2)反復(fù)修改。在實(shí)際的建模過程中,僅僅經(jīng)過一次建模過程很難得到完全正確的對(duì)象模型。事實(shí)上,軟件建模過程本身就是一個(gè)反復(fù)修改、逐步完善的過程。在建模的任何一個(gè)步驟中,如果發(fā)現(xiàn)了模型的缺陷,都必須返回到前期階段進(jìn)行修改。由于面向?qū)ο蟮母拍詈头?hào)在整個(gè)開發(fā)過程中都是一致的,因此更容易實(shí)現(xiàn)反復(fù)修改及逐步完善的過程。4.對(duì)象模型對(duì)象模型由一個(gè)或若干個(gè)模板組成。模板將模型分為若干個(gè)便于管理的子塊,在整個(gè)對(duì)象模型和類及關(guān)聯(lián)的構(gòu)造塊之間,模板提供了一種集成的中間單元,模板中的類名及關(guān)聯(lián)名是唯一的。10.2.2動(dòng)態(tài)模型動(dòng)態(tài)模型是與時(shí)間和變化有關(guān)的系統(tǒng)性質(zhì)。該模型描述了系統(tǒng)的控制結(jié)構(gòu),它表示了瞬間的、行為化的系統(tǒng)控制性質(zhì),它關(guān)心的是系統(tǒng)的控制,操作的執(zhí)行順序,它表示從對(duì)象的事件和狀態(tài)的角度出發(fā),表現(xiàn)了對(duì)象的相互行為。該模型描述的系統(tǒng)屬性是觸發(fā)事件、事件序列、狀態(tài)、事件與狀態(tài)的組織。使用狀態(tài)圖作為描述工具。它涉及事件、狀態(tài)、操作等重要概念。1.事件事件是指定時(shí)刻發(fā)生的某件事。2.狀態(tài)狀態(tài)是對(duì)象屬性值的抽象。對(duì)象的屬性值按照影響對(duì)象顯著行為的性質(zhì)將其歸并到一個(gè)狀態(tài)中去。狀態(tài)指明了對(duì)象對(duì)輸入事件的響應(yīng)。3.狀態(tài)圖狀態(tài)圖用來描述一個(gè)特定對(duì)象的所有可能狀態(tài)及其引起狀態(tài)轉(zhuǎn)移的事件。大多數(shù)面向?qū)ο蠹夹g(shù)都用狀態(tài)圖表示單個(gè)對(duì)象在其生命周期中的行為。一個(gè)狀態(tài)圖包括一系列的狀態(tài)以及狀態(tài)之間的轉(zhuǎn)移。10.2.3功能模型功能模型描述了系統(tǒng)的所有計(jì)算。功能模型指出發(fā)生了什么,動(dòng)態(tài)模型確定什么時(shí)候發(fā)生,而對(duì)象模型確定發(fā)生的客體。功能模型表明一個(gè)計(jì)算如何從輸入值得到輸出值,它不考慮計(jì)算的次序。功能模型由多張數(shù)據(jù)流圖組成。數(shù)據(jù)流圖用來表示從源對(duì)象到目標(biāo)對(duì)象的數(shù)據(jù)值的流向,它不包含控制信息,控制信息在動(dòng)態(tài)模型中表示,同時(shí)數(shù)據(jù)流圖也不表示對(duì)象中值的組織,值的組織在對(duì)象模型中表示。數(shù)據(jù)流圖中包含有處理、數(shù)據(jù)流、動(dòng)作對(duì)象和數(shù)據(jù)存儲(chǔ)對(duì)象。(1)處理。數(shù)據(jù)流圖中的處理用來改變數(shù)據(jù)值。最低層處理是純粹的函數(shù),一張完整的數(shù)據(jù)流圖是一個(gè)高層處理。(2)數(shù)據(jù)流。數(shù)據(jù)流圖中的數(shù)據(jù)流將對(duì)象的輸出與處理、處理與對(duì)象的輸入、處理與處理聯(lián)系起來。在一個(gè)計(jì)算機(jī)中,用數(shù)據(jù)流來表示中間數(shù)據(jù)值,數(shù)據(jù)流不能改變數(shù)據(jù)值。(3)動(dòng)作對(duì)象。動(dòng)作對(duì)象是一種主動(dòng)對(duì)象,它通過生成或者使用數(shù)據(jù)值來驅(qū)動(dòng)數(shù)據(jù)流圖。(4)數(shù)據(jù)存儲(chǔ)對(duì)象。數(shù)據(jù)流圖中的數(shù)據(jù)存儲(chǔ)是被動(dòng)對(duì)象,它用來存儲(chǔ)數(shù)據(jù)。它與動(dòng)作對(duì)象不一樣,數(shù)據(jù)存儲(chǔ)本身不產(chǎn)生任何操作,它只響應(yīng)存儲(chǔ)和訪問的要求。10.3面向?qū)ο蟮姆治雒嫦驅(qū)ο蠓治龅哪康氖菍?duì)客觀世界的系統(tǒng)進(jìn)行建模。以上面介紹的模型概念為基礎(chǔ),結(jié)合“銀行網(wǎng)絡(luò)系統(tǒng)”的具體實(shí)例來構(gòu)造客觀世界問題的準(zhǔn)確、嚴(yán)密的分析模型。分析模型有3種用途:用來明確問題需求;為用戶和開發(fā)人員提供明確需求;為用戶和開發(fā)人員提供一個(gè)協(xié)商的基礎(chǔ),作為后繼的設(shè)計(jì)和實(shí)現(xiàn)的框架。10.3.1面向?qū)ο蟮姆治鲞^程面向?qū)ο蟮姆治鲞^程如圖10.15所示。系統(tǒng)分析的第一步是:陳述需求。分析者必須同用戶一起工作來提煉需求,因?yàn)檫@樣才表示了用戶的真實(shí)意圖,其中涉及對(duì)需求的分析及查找丟失的信息。下面以“銀行網(wǎng)絡(luò)系統(tǒng)”為例,用面向?qū)ο蠓椒ㄟM(jìn)行開發(fā)。銀行網(wǎng)絡(luò)系統(tǒng)問題陳述:設(shè)計(jì)一個(gè)支持銀行ATM計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)的軟件。這個(gè)網(wǎng)絡(luò)包括柜員機(jī)和自動(dòng)取款機(jī)(ATM),由聯(lián)營機(jī)構(gòu)共享。每個(gè)營業(yè)部提供各自的計(jì)算機(jī)來維護(hù)它的賬戶和處理面臨的事務(wù)。柜員機(jī)屬于各營業(yè)部,并且直接與營業(yè)部計(jì)算機(jī)通信,柜員輸入賬務(wù)和處理數(shù)據(jù)。ATM與中心處理機(jī)通信。中心處理機(jī)分理事務(wù)到相應(yīng)的營業(yè)部。ATM接收現(xiàn)金卡,與用戶交互,與中心計(jì)算機(jī)通信完成事務(wù)處理,分配現(xiàn)金和打印收據(jù)。系統(tǒng)需要恰當(dāng)?shù)挠涗浐桶踩WC。系統(tǒng)必須正確控制并發(fā)訪問同一賬號(hào)。營業(yè)部提供自己的計(jì)算機(jī)軟件。共享系統(tǒng)的費(fèi)用由各營業(yè)部根據(jù)現(xiàn)金卡數(shù)量來分擔(dān)。圖10.16給出銀行網(wǎng)絡(luò)系統(tǒng)的示意圖。10.3.2建立對(duì)象模型首先標(biāo)識(shí)和關(guān)聯(lián),因?yàn)樗鼈冇绊懥苏w結(jié)構(gòu)和解決問題的方法;其次是增加屬性,進(jìn)一步描述類和關(guān)聯(lián)的基本網(wǎng)絡(luò),使用繼承合并和組織類;最后操作增加到類中去作為構(gòu)造動(dòng)態(tài)模型和功能模型的副產(chǎn)品。1.確定類構(gòu)造對(duì)象模型的第一步是標(biāo)出來自問題域的相關(guān)的對(duì)象類,對(duì)象包括物理實(shí)體和概念。所有類在應(yīng)用中都必須有意義,在問題陳述中,并非所有類都是明顯給出的。有些是隱含在問題域或一般知識(shí)中的。按圖10.17所示的過程確定類。查找問題陳述中的所有名詞,產(chǎn)生暫定類。根據(jù)下列標(biāo)準(zhǔn),去掉不必要的類和不正確的類。(1)冗余類:若兩個(gè)類表述了同一個(gè)信息,則保留最富有描述能力的類。(2)不相干的類:除掉與問題沒有關(guān)系或根本無關(guān)的類。(3)模糊類:類必須是確定的,有些暫定類邊界定義模糊或范圍太廣。(4)屬性:如果某些名詞描述的是其他對(duì)象的屬性,則從暫定類中刪除。如果某一性質(zhì)的獨(dú)立性很重要,就應(yīng)該把它歸屬到類,而不把它作為屬性。(5)操作:如果問題陳述中的名詞有動(dòng)作含義,則描述的操作就不是類。但是具有自身性質(zhì)而且需要獨(dú)立存在的操作應(yīng)該描述成類。2.準(zhǔn)備數(shù)據(jù)字典為所有建模實(shí)體準(zhǔn)備一個(gè)數(shù)據(jù)字典。準(zhǔn)確描述各個(gè)類的精確含義,描述當(dāng)前問題中的類的范圍,包括對(duì)類的成員、用法方面的假設(shè)或限制。3.確定關(guān)聯(lián)兩個(gè)或多個(gè)類之間的相互依賴就是關(guān)聯(lián)。一種依賴表示一種關(guān)聯(lián),可用各種方式來實(shí)現(xiàn)關(guān)聯(lián),但在分析模型中應(yīng)刪除實(shí)現(xiàn)的考慮,以便設(shè)計(jì)時(shí)更為靈活。關(guān)聯(lián)常用描述性動(dòng)詞或動(dòng)詞詞組來表示,其中有物理位置的表示、傳導(dǎo)的動(dòng)作、通信、所有者關(guān)系、條件的滿足等。從問題陳述中抽取所有可能的關(guān)聯(lián)表述,把它們記下來,但不要過早去細(xì)化這些表述。所有可能的關(guān)聯(lián),大多數(shù)是直接抽取問題中的動(dòng)詞詞組而得到的。在陳述中,有些動(dòng)詞詞組表述的關(guān)聯(lián)是不明顯的。最后,還有一些關(guān)聯(lián)與客觀世界或人的假設(shè)有關(guān),必須同用戶一起核實(shí)這種關(guān)聯(lián),因?yàn)檫@種關(guān)聯(lián)在問題陳述中找不到。使用下列標(biāo)準(zhǔn)去掉不必要和不正確的關(guān)聯(lián):(1)若某個(gè)類已被刪除,那么與它有關(guān)的關(guān)聯(lián)也必須刪除或者用其他類來重新表述。(2)不相干的關(guān)聯(lián)或?qū)崿F(xiàn)階段的關(guān)聯(lián):刪除所有問題域之外的關(guān)聯(lián)或涉及實(shí)現(xiàn)結(jié)構(gòu)中的關(guān)聯(lián)。(3)動(dòng)作:關(guān)聯(lián)應(yīng)該描述應(yīng)用域的結(jié)構(gòu)性質(zhì)而不是瞬時(shí)事件。(4)派生關(guān)聯(lián):省略那些可以用其他關(guān)聯(lián)來定義的關(guān)聯(lián)。因?yàn)檫@種關(guān)聯(lián)是冗余的。4.確定屬性屬性是個(gè)體對(duì)象的性質(zhì),屬性通常用修飾性的名詞詞組來表示。形容詞常常表示具體的可枚舉的屬性值,屬性不可能在問題陳述中完全表述出來,必須借助于應(yīng)用域的知識(shí)及對(duì)客觀世界的知識(shí)才可以找到它們。只考慮與具體應(yīng)用直接相關(guān)的屬性,不要考慮那些超出問題范圍的屬性。首先找出重要屬性,避免那些只用于實(shí)現(xiàn)的屬性,要為各個(gè)屬性取有意義的名字。按下列標(biāo)準(zhǔn)刪除不必要的和不正確的屬性:(1)對(duì)象:若實(shí)體的獨(dú)立存在比它的值重要,那么這個(gè)實(shí)體不是屬性而是對(duì)象。(2)限定詞:若屬性值取決于某種具體上下文,則可考慮把該屬性重新表述為一個(gè)限定詞。(3)名稱:名稱常常作為限定詞而不是對(duì)象的屬性,當(dāng)名稱不依賴于上下文關(guān)系時(shí),名稱即為一個(gè)對(duì)象屬性,尤其是它不唯一時(shí)。(4)標(biāo)識(shí)符:在考慮對(duì)象模糊性時(shí),引入對(duì)象標(biāo)識(shí)符表示,在對(duì)象模型中不列出這些對(duì)象標(biāo)識(shí)符,它是隱含在對(duì)象模型中的,只列出存在于應(yīng)用域的屬性。(5)內(nèi)部值:若屬性描述了對(duì)外不透明的對(duì)象的內(nèi)部狀態(tài),則應(yīng)從對(duì)象模型中刪除該屬性。(6)細(xì)化:忽略那些不可能對(duì)大多數(shù)操作有影響的屬性。5.使用繼承來細(xì)化類使用繼承來共享公共機(jī)構(gòu),以此來組織類,可以用兩種方式來進(jìn)行。(1)自底向上通過把現(xiàn)有類的共同性質(zhì)一般化為父類,尋找具有相似的屬性、關(guān)系或操作的類來發(fā)現(xiàn)繼承。有些一般化結(jié)構(gòu)常常是基于客觀世界邊界的現(xiàn)有分類,只要可能,盡量使用現(xiàn)有概念。對(duì)稱性常有助于發(fā)現(xiàn)某些丟失的類。(2)自頂向下將現(xiàn)有的類細(xì)化為更具體的子類。具體化常??梢詮膽?yīng)用域中明顯看出來。應(yīng)用域中各枚舉字情況是最常見的具體化的來源。當(dāng)同一關(guān)聯(lián)名出現(xiàn)多次且意義也相同時(shí),應(yīng)盡量具體化為相關(guān)聯(lián)的類。在類層次中,可以為具體的類分配屬性和關(guān)聯(lián)。各屬性都應(yīng)分配給最一般的適合的類,有時(shí)也加上一些修正。6.完善對(duì)象模型對(duì)象建模不可能一次就能保證模型是完全正確的,軟件開發(fā)的整個(gè)過程就是一個(gè)不斷完善的過程。模型的不同組成部分多半是在不同的階段完成的,如果發(fā)現(xiàn)模型的缺陷,就必須返回到前期階段去修改,有些細(xì)化工作是在動(dòng)態(tài)模型和功能模型完成之后才開始進(jìn)行的。具體的完善過程如下:(1)對(duì)于丟失對(duì)象的情況分析及解決辦法:·若同一類中存在毫無關(guān)系的屬性和操作,則分解這個(gè)類,使各部分相互關(guān)聯(lián);·若一般化體系不清楚,則可能分離扮演兩種角色的類;·若存在無目標(biāo)類的操作,則找出并加上失去目標(biāo)的類;·若存在名稱及目的相同的冗余關(guān)聯(lián),則通過一般化創(chuàng)建丟失的父類,把關(guān)聯(lián)組織在一起。(2)查找多余的類。(3)若類中缺少屬性、操作和關(guān)聯(lián),則可刪除這個(gè)類。(4)查找丟失的關(guān)聯(lián)。(5)若丟失了操作的訪問路徑,則加入新的關(guān)聯(lián)以回答查詢。10.3.3建立動(dòng)態(tài)模型1.準(zhǔn)備腳本動(dòng)態(tài)分析從尋找事件開始,然后確定各對(duì)象的可能事件順序。在分析階段不考慮算法的執(zhí)行,算法是實(shí)現(xiàn)模型的一部分。2.確定事件確定所有外部事件。事件包括所有來自或發(fā)往用戶的信息、外部設(shè)備的信號(hào)、輸入、轉(zhuǎn)換和動(dòng)作,可以發(fā)現(xiàn)正常事件,但不能遺漏條件和異常事件。3.準(zhǔn)備事件跟蹤表把腳本表示成一個(gè)事件跟蹤表,即不同對(duì)象之間的事件排序表,對(duì)象為表中的列,給每個(gè)對(duì)象分配一個(gè)獨(dú)立的列。4.構(gòu)造狀態(tài)圖對(duì)各對(duì)象類建立狀態(tài)圖,反映對(duì)象接收和發(fā)送的事件,每個(gè)事件跟蹤都對(duì)應(yīng)于狀態(tài)圖中的一條路徑。10.3.4建立功能模型功能模型用來說明值是如何計(jì)算的,表明值之間的依賴關(guān)系及相關(guān)的功能,數(shù)據(jù)流圖有助于表示功能依賴關(guān)系,其中的處理對(duì)應(yīng)于狀態(tài)圖的活動(dòng)和動(dòng)作,其中的數(shù)據(jù)流對(duì)應(yīng)于對(duì)象圖中的對(duì)象或?qū)傩?。建立功能模型的具體步驟如下:(1)確定輸入值、輸出值。先列出輸入、輸出值,輸入、輸出值是系統(tǒng)與外界之間的事件的參數(shù)。(2)建立數(shù)據(jù)流圖。數(shù)據(jù)流圖說明輸出值是怎樣從輸入值得來的,數(shù)據(jù)流圖通常按層次組織。10.3.5確定操作在建立對(duì)象模型時(shí),確定了類、關(guān)聯(lián)、結(jié)構(gòu)和屬性,還沒有確定操作。只有建立了動(dòng)態(tài)模型和功能模型之后,才可能最后確定類的操作。10.4面向?qū)ο蟮脑O(shè)計(jì)1.面向?qū)ο笤O(shè)計(jì)的概念OOA主要通過對(duì)類的認(rèn)定和劃分,以確定問題空間中存在的類、確定類和類的結(jié)構(gòu)等,然后建立一個(gè)完整的分析模型。OOD將面向?qū)ο蠓治鼋⒌姆治瞿P妥儞Q成設(shè)計(jì)模型。軟件設(shè)計(jì)人員需要發(fā)現(xiàn)相關(guān)的對(duì)象,將它們的因子化為適當(dāng)粒度的類、定義類的接口和繼承層次結(jié)構(gòu),并且建立它們之間的關(guān)系等。應(yīng)避免重復(fù)設(shè)計(jì),至少使重復(fù)設(shè)計(jì)降到最低程度。設(shè)計(jì)可重用的面向?qū)ο筌浖抢щy的,但是,人們總是在設(shè)計(jì)過程中充分利用重用技術(shù)。軟件設(shè)計(jì)完成后,設(shè)計(jì)人員都試圖重用它,并不斷地修改該設(shè)計(jì),使它不斷完善和成熟。OOD把主要的系統(tǒng)構(gòu)件組織為子系統(tǒng)的系統(tǒng)級(jí)“模塊”。數(shù)據(jù)和操作數(shù)據(jù)的方法被封裝為對(duì)象,對(duì)象(類)是OO系統(tǒng)的構(gòu)造積木塊。OOD必須具有描述對(duì)象屬性的特定數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)組織以及個(gè)體操作過程的細(xì)節(jié)。OOD為了實(shí)現(xiàn)軟件需求,可能引入其他類和對(duì)象,也可能為提高軟件設(shè)計(jì)質(zhì)量和效率而改進(jìn)類結(jié)構(gòu)。例如,重用類庫中的類,通過類的認(rèn)定和類層次結(jié)構(gòu)的組織,確定解空間中存在的類和類結(jié)構(gòu),并確定外部接口和主要數(shù)據(jù)結(jié)構(gòu)等。OOA和OOD很難截然分開,也就是說,面向?qū)ο蠓治雠c面向?qū)ο笤O(shè)計(jì)之間不會(huì)用階段和時(shí)序來區(qū)分。但是,OOD建造系統(tǒng)仍然基于軟件設(shè)計(jì)的基本概念——抽象、信息隱藏、功能獨(dú)立、模塊性等。在傳統(tǒng)方法和OOD方法中有10種設(shè)計(jì)建模的主要構(gòu)成成分,它們可以用于比較各種傳統(tǒng)方法和面向?qū)ο笤O(shè)計(jì)方法。這10種設(shè)計(jì)建模的主要構(gòu)成成分是:①模塊層次的表示;②數(shù)據(jù)定義的規(guī)格;③過程邏輯的規(guī)格;④端到端處理序列的說明;⑤對(duì)象狀態(tài)和變遷的表示;⑥類及層次的定義;⑦類中操作的表示;⑧操作的詳細(xì)定義;⑨消息連接的規(guī)格;⑩排他服務(wù)的標(biāo)識(shí)。2.面向?qū)ο笙到y(tǒng)設(shè)計(jì)模型傳統(tǒng)的設(shè)計(jì)方法有4個(gè)層次——體系結(jié)構(gòu)設(shè)計(jì)、數(shù)據(jù)設(shè)計(jì)、接口設(shè)計(jì)和構(gòu)件設(shè)計(jì)。OOD方法與傳統(tǒng)方法相比,也存在以下4個(gè)層次:(1)體系結(jié)構(gòu)設(shè)計(jì)(系統(tǒng)設(shè)計(jì));(2)數(shù)據(jù)設(shè)計(jì)(當(dāng)屬性被確定);(3)接口設(shè)計(jì)(當(dāng)消息模型被開發(fā));(4)構(gòu)件設(shè)計(jì)(當(dāng)對(duì)象被認(rèn)定后進(jìn)行對(duì)象設(shè)計(jì)等)。值得注意的是,OO設(shè)計(jì)的“體系結(jié)構(gòu)”更多的是關(guān)注對(duì)象之間的協(xié)助,而不是構(gòu)件間的功能控制流。系統(tǒng)模型設(shè)計(jì)過程如下:(1)子系統(tǒng)設(shè)計(jì)。一個(gè)軟件系統(tǒng)往往有幾個(gè)主要組成部分,可以按主題把主要的系統(tǒng)構(gòu)件組織為子系統(tǒng)。子系統(tǒng)是可以相對(duì)獨(dú)立運(yùn)作的,各子系統(tǒng)之間具有盡可能簡(jiǎn)單的明確的接口。子系統(tǒng)設(shè)計(jì)應(yīng)包括每一個(gè)子系統(tǒng)的表示,這些子系統(tǒng)能夠滿足用戶的軟件需求,并且實(shí)現(xiàn)支持用戶需求的技術(shù)設(shè)施。(2)類與對(duì)象設(shè)計(jì)。這里應(yīng)該包括每一個(gè)類與對(duì)象的表示和類結(jié)構(gòu)的創(chuàng)建。例如類的層次結(jié)構(gòu)的創(chuàng)建,可以用一般化類以及不斷逼近目標(biāo)的特殊化類的機(jī)制實(shí)現(xiàn);組裝結(jié)構(gòu)可以用分析類的聚集來實(shí)現(xiàn)。(3)消息設(shè)計(jì)。它包括每一個(gè)對(duì)象能夠與協(xié)作對(duì)象通信的設(shè)計(jì)細(xì)節(jié)。通過消息設(shè)計(jì)建立系統(tǒng)的內(nèi)部和外部接口。(4)責(zé)任設(shè)計(jì)。它包括每一個(gè)對(duì)象的所有屬性和操作的數(shù)據(jù)結(jié)構(gòu)以及算法設(shè)計(jì)(服務(wù)、方法的具體實(shí)現(xiàn)的細(xì)節(jié))。在面向?qū)ο笙到y(tǒng)中,存在著類和通信對(duì)象重復(fù)出現(xiàn)的模式,利用這些模式可以解決特定的問題,使得面向?qū)ο笤O(shè)計(jì)更靈活和重用性更好。設(shè)計(jì)模式是基于過去的經(jīng)驗(yàn)而幫助設(shè)計(jì)者重用成功的設(shè)計(jì),把設(shè)計(jì)模式應(yīng)用于設(shè)計(jì)問題中,就不需要重復(fù)設(shè)計(jì)。在面向?qū)ο笙到y(tǒng)中,設(shè)計(jì)模式可以通過應(yīng)用繼承和組合這兩種不同的機(jī)制被使用。使用繼承,現(xiàn)存的設(shè)計(jì)模式變成了新子類的模板,存在于模式中的屬性和操作也被子類所繼承而變成子類的一部分;組合導(dǎo)致對(duì)象的聚合概念。一個(gè)問題可能需要具有復(fù)雜功能的對(duì)象,復(fù)雜對(duì)象可以通過選擇一組設(shè)計(jì)模式并且聚合適當(dāng)?shù)膶?duì)象組裝而成。當(dāng)然可以考慮繼承和組合并存的方法,在實(shí)際設(shè)計(jì)中,往往組合要優(yōu)先于繼承。過分地使用繼承會(huì)導(dǎo)致類層次越來越龐大而變得難以管理,組合關(guān)注的目標(biāo)是小的類層次和對(duì)象,組合可以用不修改的方式使用現(xiàn)存的設(shè)計(jì)模式——重用構(gòu)件。每一個(gè)設(shè)計(jì)模式可以被處理為黑盒,在模式之間的通信僅僅通過良好的接口來實(shí)現(xiàn)。Rumbaugh方法中的對(duì)象建模技術(shù)提出的設(shè)計(jì)活動(dòng),有兩個(gè)不同抽象的級(jí)別,即系統(tǒng)設(shè)計(jì)和對(duì)象設(shè)計(jì)。(1)系統(tǒng)設(shè)計(jì)。它著重于構(gòu)造一個(gè)完整的軟件產(chǎn)品或者系統(tǒng)所有構(gòu)件的布局。具體來說,系統(tǒng)分析模型被劃分為若干個(gè)子系統(tǒng),然后被分配給處理器和任務(wù),實(shí)現(xiàn)數(shù)據(jù)管理的策略被定義,訪問它們所需要的全局資源和控制被標(biāo)識(shí)。(2)對(duì)象設(shè)計(jì)。它著重于個(gè)體對(duì)象的詳細(xì)布局。具體來說,從系統(tǒng)分析模型中,為對(duì)象選擇出操作,并且為每一個(gè)操作定義算法;適合于屬性和算法的數(shù)據(jù)結(jié)構(gòu)被表示;類和類屬性的設(shè)計(jì)應(yīng)該能夠優(yōu)化對(duì)數(shù)據(jù)的訪問,并提高計(jì)算的功效;消息模型被創(chuàng)建,用以實(shí)現(xiàn)對(duì)象關(guān)聯(lián)。由Coad/Yourdon提出的OOD模型如圖10.25所示。該模型表示系統(tǒng)由4個(gè)部件組成,即垂直分成4個(gè)部分:①主體部件(PDC)設(shè)計(jì)(問題領(lǐng)域部分);②用戶界面部件(HIC)設(shè)計(jì)(人機(jī)交互部分);③任務(wù)管理部件(TMC)設(shè)計(jì);④數(shù)據(jù)管理部件(DMC)設(shè)計(jì)。每一個(gè)部件又有5個(gè)層次,即水平切片分成5層:①主題層;②類與對(duì)象層;③結(jié)構(gòu)層(分類、聚集);④屬性層;⑤服務(wù)層。雖然有各種各樣的設(shè)計(jì)方法,每一種設(shè)計(jì)方法有各自不同的術(shù)語。但是,整體的OOD過程是基本一致的。為了完成面向?qū)ο笤O(shè)計(jì),軟件設(shè)計(jì)人員應(yīng)該完成下列步驟:(1)描述每個(gè)子系統(tǒng)并將其分配到處理器或任務(wù);(2)選擇實(shí)現(xiàn)數(shù)據(jù)管理、界面支持和任務(wù)管理的設(shè)計(jì)策略;(3)為系統(tǒng)設(shè)計(jì)合適的控制機(jī)制;(4)通過創(chuàng)建每個(gè)操作的過程表示和類屬性的數(shù)據(jù)結(jié)構(gòu),從而完成對(duì)象設(shè)計(jì);(5)使用對(duì)象間的協(xié)作和對(duì)象關(guān)系,完成消息設(shè)計(jì);(6)創(chuàng)建消息模型;(7)評(píng)審設(shè)計(jì)模型并在需要時(shí)迭代。3.面向?qū)ο笤O(shè)計(jì)原則在傳統(tǒng)設(shè)計(jì)中,有5種標(biāo)準(zhǔn)用于判斷設(shè)計(jì)方法的模塊化能力,它也可以用于面向?qū)ο笤O(shè)計(jì)中。(1)分解性(Decomposability):設(shè)計(jì)方法幫助設(shè)計(jì)者將一個(gè)大型問題分解為易于求解的子問題的程度。(2)組裝性(Composability):設(shè)計(jì)方法保證程序構(gòu)件(模塊)一旦被設(shè)計(jì)和建造后,可被重用創(chuàng)建其他系統(tǒng)的程度。(3)易理解性(Understandability):程序構(gòu)件在不參考其他信息或者其他模塊的情況下,易于理解的程度。(4)連貫性(Continuity):在程序中進(jìn)行小修改的能力,這些修改展示它們自己與一個(gè)或少數(shù)幾個(gè)模塊中對(duì)應(yīng)修改的能力。(5)保護(hù)性(Protection):如果一個(gè)錯(cuò)誤在特定的模塊中發(fā)生,將減少副作用傳播的能力。優(yōu)秀的面向?qū)ο笤O(shè)計(jì)應(yīng)該權(quán)衡各種因素,降低設(shè)計(jì)成本,提高軟件的可維護(hù)性。根據(jù)以上5個(gè)設(shè)計(jì)標(biāo)準(zhǔn)可導(dǎo)出以下的基本原則:(1)模塊化。與傳統(tǒng)的設(shè)計(jì)方法一樣,面向?qū)ο笤O(shè)計(jì)方法也支持系統(tǒng)分解和系統(tǒng)模塊化的設(shè)計(jì)原理。實(shí)際上對(duì)象就可以理解為構(gòu)件(模塊),它是把數(shù)據(jù)結(jié)構(gòu)和操作這些數(shù)據(jù)方法緊密地結(jié)合在一起的構(gòu)件(模塊)。(2)抽象。面向?qū)ο蠓椒ú粌H支持過程抽象,而且支持?jǐn)?shù)據(jù)抽象。類實(shí)際上就是一種抽象數(shù)據(jù)類型,類的公共接口構(gòu)成了類的規(guī)格說明,使用者通過類的接口就可以使用類中定義的數(shù)據(jù),無須知道類中具體算法的實(shí)現(xiàn)細(xì)節(jié)和數(shù)據(jù)元素表示方法,通常把這類抽象稱為規(guī)格說明抽象。有一些面向?qū)ο笳Z

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論