《現(xiàn)代軟件工程》_第1頁(yè)
《現(xiàn)代軟件工程》_第2頁(yè)
《現(xiàn)代軟件工程》_第3頁(yè)
《現(xiàn)代軟件工程》_第4頁(yè)
《現(xiàn)代軟件工程》_第5頁(yè)
已閱讀5頁(yè),還剩108頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《現(xiàn)代軟件工程》第六部分系統(tǒng)詳細(xì)設(shè)計(jì)與軟件實(shí)現(xiàn)

結(jié)構(gòu)化程序的詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)-1面向?qū)ο蠛蜆?gòu)件的系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)-2系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)規(guī)范及管理-3第六部分系統(tǒng)詳細(xì)設(shè)計(jì)與軟件實(shí)現(xiàn)第二章面向?qū)ο蠛蜆?gòu)件的系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)面向?qū)ο蟮南到y(tǒng)詳細(xì)設(shè)計(jì)任務(wù)和原則-2.1面向?qū)ο筌浖膶?shí)現(xiàn)-2.2基于構(gòu)件的系統(tǒng)詳細(xì)設(shè)計(jì)方法-2.3面向?qū)ο蠛蜆?gòu)件的系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)-2.4第六部分系統(tǒng)詳細(xì)設(shè)計(jì)與軟件實(shí)現(xiàn)2.1面向?qū)ο蟮南到y(tǒng)詳細(xì)設(shè)計(jì)任務(wù)和原則在設(shè)計(jì)方法上,不論是傳統(tǒng)、還是面向?qū)ο?,都首先是粗框的、整體的、總體的進(jìn)行設(shè)計(jì),然后才是精細(xì)的、具體的設(shè)計(jì)。因此,OOA也分為總體(概要)設(shè)計(jì)和詳細(xì)設(shè)計(jì)概要設(shè)計(jì):將分析模型映射為具體的軟件結(jié)構(gòu)詳細(xì)設(shè)計(jì):把概要設(shè)計(jì)具體化設(shè)計(jì)階段產(chǎn)生的結(jié)果:數(shù)據(jù)(對(duì)象)設(shè)計(jì)體系結(jié)構(gòu)(子系統(tǒng))設(shè)計(jì)接口(消息)設(shè)計(jì)過(guò)程(方法)設(shè)計(jì)面向?qū)ο蟮脑O(shè)計(jì)在詳細(xì)設(shè)計(jì)階段的任務(wù)消息設(shè)計(jì)方法設(shè)計(jì)數(shù)據(jù)設(shè)計(jì)(對(duì)象設(shè)計(jì)):結(jié)構(gòu)化方法:從分析階段得到的數(shù)據(jù)模型和數(shù)據(jù)字典出發(fā),設(shè)計(jì)出相應(yīng)的數(shù)據(jù)結(jié)構(gòu)面向?qū)ο蠓椒ǎ簲?shù)據(jù)作為類(lèi)的一個(gè)屬性,設(shè)計(jì)合適的數(shù)據(jù)結(jié)構(gòu)來(lái)表示這個(gè)屬性體系結(jié)構(gòu)(子系統(tǒng))設(shè)計(jì):定義系統(tǒng)的主要結(jié)構(gòu)元素及相互的關(guān)系結(jié)構(gòu)化方法:從數(shù)據(jù)流圖出發(fā)對(duì)數(shù)據(jù)流圖進(jìn)行分析,得出軟件的層次化的模塊結(jié)構(gòu)圖面向?qū)ο蠓椒ǎ簭姆治瞿P蛣澐肿酉到y(tǒng),在考慮通信、并發(fā)、部署、復(fù)用等問(wèn)題的基礎(chǔ)上,建立系統(tǒng)層次結(jié)構(gòu)OOA的任務(wù)接口(消息)設(shè)計(jì):描述系統(tǒng)內(nèi)部、系統(tǒng)與系統(tǒng)之間以及系統(tǒng)與用戶之間如何通信,接口包括了信息交互和特定的行為,因此,數(shù)據(jù)流和控制是接口設(shè)計(jì)的基礎(chǔ)面向?qū)ο蠓椒ǎ航涌谠O(shè)計(jì)主要是消息設(shè)計(jì)過(guò)程設(shè)計(jì)(方法設(shè)計(jì)):將軟件體系結(jié)構(gòu)的結(jié)構(gòu)元素變化為對(duì)軟件構(gòu)件的過(guò)程性描述結(jié)構(gòu)化方法:從分析階段獲得的過(guò)程規(guī)格說(shuō)明、控制規(guī)格說(shuō)明和狀態(tài)圖出發(fā),得到系統(tǒng)各個(gè)功能的過(guò)程化描述面向?qū)ο蠓椒ǎ簭南到y(tǒng)功能模型和行為模型出發(fā),得到各個(gè)類(lèi)的方法以及實(shí)現(xiàn)細(xì)節(jié)的描述OOA的任務(wù)在OOA的詳細(xì)設(shè)計(jì)階段,我們追求:可復(fù)用性在詳細(xì)設(shè)計(jì)階段的可復(fù)用性是代碼級(jí)的可復(fù)用代碼級(jí)的可復(fù)用,體現(xiàn)在:本項(xiàng)目?jī)?nèi)部的代碼復(fù)用:內(nèi)部復(fù)用新老項(xiàng)目之間的代碼復(fù)用:外部復(fù)用可擴(kuò)展性可擴(kuò)展是軟件質(zhì)量的重要指標(biāo),面向?qū)ο蟮睦^承和多態(tài)性,使系統(tǒng)具有很好的可擴(kuò)展可能健壯性健壯性是指在錯(cuò)誤的輸入或?qū)ο鬆顟B(tài)時(shí),仍保持方法不會(huì)出錯(cuò)的能力,當(dāng)然,健壯是相對(duì)的,是與系統(tǒng)開(kāi)銷(xiāo)相平衡的協(xié)作性系統(tǒng)開(kāi)發(fā)支持更好的項(xiàng)目協(xié)作OOA的設(shè)計(jì)原則復(fù)用方法:內(nèi)部復(fù)用的方法:找出設(shè)計(jì)中的相同或相似部分,應(yīng)用繼承機(jī)制復(fù)用外部復(fù)用的方法:經(jīng)過(guò)長(zhǎng)期的積累,以體系結(jié)構(gòu)為核心,獲得復(fù)用可能設(shè)計(jì)原則:方法的內(nèi)聚:類(lèi)的一種方法只能完成一種功能,如有不相關(guān)的方法,應(yīng)進(jìn)行分解減少代碼的規(guī)模:代碼過(guò)長(zhǎng),應(yīng)進(jìn)行分解保持對(duì)外接口的一致性:相同或相似的方法,應(yīng)保持名稱(chēng)、參數(shù)、返回值和條件的基本一致分離策略和實(shí)現(xiàn):把判斷、選擇和具體實(shí)現(xiàn)分離,前者檢查狀態(tài)、做出選擇。它依賴(lài)具體的應(yīng)用邏輯,后者針對(duì)數(shù)據(jù)進(jìn)行確定的操作,不做出選擇,甚至出錯(cuò)只報(bào)告,也不做出處理方法覆蓋所有操作數(shù)據(jù):對(duì)同一個(gè)數(shù)據(jù)的相同操作,應(yīng)在統(tǒng)一的方法內(nèi)實(shí)現(xiàn)加強(qiáng)封裝性:只操作對(duì)象內(nèi)部的數(shù)據(jù),避免操作全局?jǐn)?shù)據(jù)減少方法的偶合性:多利用繼承機(jī)制:繼承是實(shí)現(xiàn)共享和提高復(fù)用的主要方法為實(shí)現(xiàn)可復(fù)用的設(shè)計(jì)原則設(shè)計(jì)原則:封裝數(shù)據(jù):類(lèi)的內(nèi)部數(shù)據(jù)必須是隱蔽的,其他類(lèi)只有通過(guò)方法,才能訪問(wèn)該數(shù)據(jù)封裝方法內(nèi)部的數(shù)據(jù)結(jié)構(gòu):內(nèi)部結(jié)構(gòu)只為方法實(shí)現(xiàn)所用,外部不可直接使用避免情況分支語(yǔ)句:情況分支語(yǔ)句可用來(lái)測(cè)試對(duì)象內(nèi)部的屬性,但不能用來(lái)根據(jù)對(duì)象類(lèi)型選擇相應(yīng)的行為。因?yàn)槿绻@樣,在增加新類(lèi)時(shí),將不得不修改原有的代碼區(qū)分公有和私有方法:公有方法是對(duì)象的對(duì)外接口,其他對(duì)象只能使用公有方法訪問(wèn)該對(duì)象。公有方法通常不能草率地被修改和刪除,否則會(huì)導(dǎo)致整個(gè)系統(tǒng)的全面修改私有方法是對(duì)象內(nèi)部的方法,通常用來(lái)輔助實(shí)現(xiàn)公有方法,對(duì)外是不可見(jiàn)的,因此,相對(duì)修改和變化的靈活性可以大一些區(qū)分公有和私有方法的目的,是保證建立一個(gè)系統(tǒng)內(nèi)部和外部的合適邊界為實(shí)現(xiàn)可擴(kuò)展的設(shè)計(jì)原則健壯性:友好地對(duì)待用戶的輸入錯(cuò)誤,采用提示和輔導(dǎo)操作把握代碼優(yōu)化時(shí)機(jī)選擇合適的實(shí)現(xiàn)方法檢查參數(shù)的合法性協(xié)作性:在程序設(shè)計(jì)開(kāi)始之前,進(jìn)行周密的考慮盡量使代碼易于理解在對(duì)象模型中使用相同的名稱(chēng)把類(lèi)打包成模塊對(duì)類(lèi)進(jìn)行詳細(xì)的文檔化公開(kāi)公共的設(shè)計(jì)說(shuō)明為實(shí)現(xiàn)健壯性和協(xié)作性的設(shè)計(jì)原則2.2面向?qū)ο筌浖脑敿?xì)設(shè)計(jì)在開(kāi)發(fā)過(guò)程中,類(lèi)的實(shí)現(xiàn)是核心問(wèn)題。在采用面向?qū)ο箫L(fēng)格所寫(xiě)的軟件系統(tǒng)中,所有的數(shù)據(jù)都被封裝在類(lèi)的實(shí)例中,而整個(gè)應(yīng)用則被封裝在一個(gè)更高級(jí)的類(lèi)中。這種封裝和類(lèi)提供的標(biāo)準(zhǔn)界面很容易把類(lèi)所表達(dá)的特性嵌入到應(yīng)用中去。這種特性,就是類(lèi)的三個(gè)基本屬性:封裝性繼承性多態(tài)性類(lèi)間關(guān)系當(dāng)我們實(shí)現(xiàn)類(lèi)的時(shí)候就會(huì)遇到類(lèi)級(jí)的關(guān)系。一個(gè)類(lèi)的實(shí)現(xiàn)常常在某些方面依賴(lài)于其它類(lèi)的實(shí)例。類(lèi)級(jí)關(guān)系可以是應(yīng)用級(jí)關(guān)系的實(shí)現(xiàn),也可以是類(lèi)內(nèi)屬性的實(shí)現(xiàn)。

消息組裝繼承消息(messaging)在應(yīng)用程序中,應(yīng)用級(jí)關(guān)系大多是以類(lèi)的實(shí)例之間的消息連接方式實(shí)現(xiàn)通信的。在消息的參數(shù)表中指定消息的接受者(一個(gè)類(lèi)的實(shí)例)。還可以通過(guò)參數(shù)表向接收者提供信息。消息指定一個(gè)屬于接收者的服務(wù),這個(gè)服務(wù)必須對(duì)應(yīng)到該類(lèi)共有界面規(guī)定的行為。Dictionary類(lèi)設(shè)計(jì)的例子一個(gè)Dictionary是包含一些可按關(guān)鍵碼的值排序和檢索對(duì)象的部件。對(duì)于要存儲(chǔ)在Dictionary內(nèi)的一個(gè)實(shí)例來(lái)說(shuō), 類(lèi)必須提 供一個(gè)操 作來(lái)取得 關(guān)鍵碼。關(guān)系refersto

表示了“一個(gè)類(lèi)引用另一個(gè)類(lèi)”,后者的實(shí)例可當(dāng)作參數(shù)由前者在消息中使用。由消息構(gòu)成的流圖形成了面向?qū)ο笙到y(tǒng)結(jié)構(gòu)的核心。例如,Dictionary類(lèi)有一個(gè)操作add,該操作將把一個(gè)屬于Item類(lèi)的對(duì)象item當(dāng)作參數(shù),把這個(gè)對(duì)象加入到Dictionary中。具體地,add操作首先發(fā)送一個(gè)消息給做為參數(shù)的對(duì)象item,再利用它的關(guān)鍵碼,到該對(duì)象所在的Item類(lèi)中引用(refersto)相應(yīng)的實(shí)例,把它加入到詞典中去。在設(shè)計(jì)階段,在這樣兩個(gè)類(lèi)之間消息關(guān)系的建立要求協(xié)調(diào)這些類(lèi)的共有界面的定義。組裝(Composition)組裝關(guān)系是一個(gè)實(shí)現(xiàn)級(jí)關(guān)系,它對(duì)應(yīng)于應(yīng)用級(jí)的聚合關(guān)系。它也叫做component(部件)或叫做ispartof(是…的一部分)。組裝與消息兩者都是類(lèi)間的關(guān)系,在這種關(guān)系中,一個(gè)類(lèi)的實(shí)例將是另一個(gè)類(lèi)的實(shí)現(xiàn)的一部分。考慮Dictionary類(lèi)的實(shí)現(xiàn)。在Dictionary中存儲(chǔ)item的一種數(shù)據(jù)表示是使用散列表(HashTable)。進(jìn)行Dictionary類(lèi)的低層設(shè)計(jì)時(shí),要指明在Dictionary類(lèi)和HashTable類(lèi)之間的一個(gè)ispartof關(guān)系。在實(shí)現(xiàn)時(shí),應(yīng)當(dāng)在Dictionary類(lèi)的定義中聲明這個(gè)HashTable的實(shí)例。繼承(Inheritance)繼承允許在既存類(lèi)的基礎(chǔ)上定義新的類(lèi)。一個(gè)新類(lèi)B繼承了既存類(lèi)A,則B包括了A定義的某些行為,以及它自定義的某些附加行為。有多少種面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,就有多少種不同的繼承實(shí)現(xiàn)方式。繼承圖①針對(duì)實(shí)現(xiàn)的繼承兩個(gè)類(lèi)之間“針對(duì)實(shí)現(xiàn)”的繼承關(guān)系的建立指的是使用既存類(lèi)的內(nèi)部表示來(lái)做為新類(lèi)的內(nèi)部表示的一部分。我們不推薦這種繼承方式??紤]使用繼承來(lái)實(shí)現(xiàn)一個(gè)Circle類(lèi),為了定義一個(gè)圓,需要定義一個(gè)點(diǎn)和一個(gè)值,做為圓的圓心和半徑。因此,Point類(lèi)可支持Circle類(lèi)的一部分實(shí)現(xiàn)。把Point當(dāng)做派生類(lèi)。如果Circle類(lèi)直接使用Point的數(shù)據(jù)成員x和y,將失去抽象。而且失去做為一個(gè)點(diǎn)的圓心的標(biāo)識(shí)。針對(duì)實(shí)現(xiàn)的繼承一般在原型開(kāi)發(fā)中使用。②針對(duì)特殊化的繼承這種繼承的使用適合于大多數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言所提供的關(guān)系,是針對(duì)一般化-特殊化關(guān)系的。這種繼承使用isa關(guān)系。類(lèi)B的一個(gè)實(shí)例是(isa)類(lèi)A的一個(gè)實(shí)例。在使用中,繼承將使得既存類(lèi)的界面成為新類(lèi)的界面。這表明新類(lèi)具有它的基類(lèi)的所有行為。為了定義Dictionary類(lèi),應(yīng)當(dāng)首先查找既存的抽象,看Dictionary類(lèi)會(huì)是哪個(gè)既存抽象的特殊情況。Dictionary應(yīng)是一個(gè)有序表,但具有它自己特有的操作,如使用關(guān)鍵碼進(jìn)行搜索等。既存的OrderedList類(lèi)可以提供Dictionary類(lèi)的某些行為,但不是全部。還要確認(rèn),在OrderedList中是否有的行為在Dictionary中是不需要的。如果有,可能需要重新組織層次或者開(kāi)發(fā)某些附加的抽象。iskindof

(是一種…)繼承這種繼承允許有選擇地包含既存類(lèi)的屬性,從而建立新的定義。一個(gè)鳥(niǎo)類(lèi)可能有一個(gè)關(guān)于飛行的屬性。一個(gè)鴕鳥(niǎo)派生類(lèi)在模型化時(shí)可能就不選擇這個(gè)屬性,因?yàn)轼r鳥(niǎo)不會(huì)飛。鴕鳥(niǎo)是一種(iskindof)鳥(niǎo),但具有的屬性與鳥(niǎo)不完全相同。iskindof繼承是不嚴(yán)格繼承。類(lèi)的實(shí)現(xiàn)一種方案是先開(kāi)發(fā)一個(gè)比較小的比較簡(jiǎn)單的類(lèi),做為開(kāi)發(fā)比較大的比較復(fù)雜的類(lèi)的基礎(chǔ)。即從簡(jiǎn)單到復(fù)雜的開(kāi)發(fā)方案。在這種方案中,類(lèi)的開(kāi)發(fā)是分層的。一個(gè)類(lèi)建立在一些既存的類(lèi)的基礎(chǔ)上,而這些既存的類(lèi)又是建立在其它既存的類(lèi)的基礎(chǔ)上。通過(guò)諸如“isa”或“ispartof”之類(lèi)的關(guān)系,利用既存代碼就能著手建立新的類(lèi)。(1)軟件庫(kù)(SoftwareBase)建立軟件庫(kù)的目的是為了引用既存的部件。存儲(chǔ)在軟件庫(kù)中的類(lèi)以多種途徑發(fā)生關(guān)聯(lián),同時(shí),庫(kù)可以追蹤這些關(guān)聯(lián)。軟件庫(kù)工具利用這些關(guān)聯(lián)可以有效地進(jìn)行開(kāi)發(fā)。(2)復(fù)用(Reuse)伴隨著類(lèi)的設(shè)計(jì),應(yīng)當(dāng)從復(fù)用開(kāi)始著手類(lèi)的實(shí)現(xiàn)。類(lèi)的設(shè)計(jì)可以使用各種抽象的類(lèi)。在類(lèi)設(shè)計(jì)期間,我們必須開(kāi)發(fā)這些類(lèi)中的“具體的”對(duì)象。一旦一個(gè)數(shù)據(jù)對(duì)象被確認(rèn)是應(yīng)用所需求的,則必須把它組織成類(lèi),以便有效地提交所需要的模型。產(chǎn)生所需功能的次序?qū)ふ摇霸獠粍?dòng)(As_is)”使用的既存類(lèi),提供所需要的特性;尋找可以用做開(kāi)發(fā)新類(lèi)的基礎(chǔ)的既存的類(lèi);不用任何復(fù)用,開(kāi)發(fā)一個(gè)新類(lèi)。-“原封不動(dòng)”復(fù)用所需要的類(lèi)已經(jīng)存在,我們建立它的一個(gè)實(shí)例,用以提供所需要的特性。這個(gè)實(shí)例可直接被應(yīng)用利用,或者它可以用來(lái)做另一個(gè)類(lèi)的實(shí)現(xiàn)部分。通過(guò)復(fù)用一個(gè)既存類(lèi),我們可得到不加修改就能工作的已測(cè)試的代碼。-進(jìn)化性復(fù)用一個(gè)能夠完全符合要求特性的類(lèi)可能并不存在。但具有類(lèi)似功能的類(lèi)存在,則可以通過(guò)繼承,由既存的類(lèi)漸增地設(shè)計(jì)新類(lèi)。如果新類(lèi)將要成為一個(gè)既存類(lèi)的派生類(lèi),它應(yīng)當(dāng)繼承這個(gè)既存類(lèi)的所有特性。然后新類(lèi)可以對(duì)需要追加的數(shù)據(jù)及必需的功能做局部定義。

還可以將幾個(gè)既存類(lèi)的特性混合起來(lái)開(kāi)發(fā)出新的類(lèi)。每個(gè)既存類(lèi)是某些概念的模型?;旌掀饋?lái)則產(chǎn)生了一個(gè)為特定目標(biāo)軟件所用的具有多重概念的類(lèi)。有時(shí),一個(gè)既存的類(lèi)可能會(huì)提供某些在我們的新類(lèi)中需要的特性以及某些新類(lèi)中不需要的特性。因此,我們先建立一個(gè)新的更抽象的類(lèi),使之成為我們要設(shè)計(jì)的類(lèi)的基類(lèi),然后,修改既存類(lèi)以繼承新的基類(lèi)。既存類(lèi)A的某些特性成為新類(lèi)B的一個(gè)部分,同時(shí)被類(lèi)A'和類(lèi)C繼承。類(lèi)A的某些特性保留在類(lèi)A'中,它不被類(lèi)C繼承。-“廢棄性”開(kāi)發(fā)在新類(lèi)的實(shí)現(xiàn)時(shí),通過(guò)說(shuō)明一些既存類(lèi)的實(shí)例,可以加快一個(gè)類(lèi)的實(shí)現(xiàn)。像表格、硬件接口,或其它某些能力都可以用來(lái)作為一個(gè)新類(lèi)的局部。(3)斷言(Asserttions)實(shí)現(xiàn)類(lèi)的一個(gè)主動(dòng)方法是把來(lái)自類(lèi)的設(shè)計(jì)信息直接納入代碼。特別要求把參數(shù)約束、循環(huán)執(zhí)行等編入到代碼中。這可以通過(guò)某些表示斷言的語(yǔ)言機(jī)制來(lái)實(shí)現(xiàn)。一個(gè)斷言就是一個(gè)語(yǔ)句,它表達(dá)了對(duì)一個(gè)過(guò)程、一個(gè)值,甚至一段代碼的約束。在棧的描述中,可以使用斷言來(lái)控制進(jìn)棧和退棧功能的操作:procedure

push(var

S:Stack_Type;

New_Item:Item_Type);

assert:ThestackSisnotfull…………

assert:ThetopofstackScontainsNew_Itemend;procedure

pop

(var

S

:Stack_Type)returnItem_Type;

assert:

ThestackSisnotempty…………

assert:

ThestackShasonefeweritemsthatitdidonentryend;

先決條件后置條件在C與C++中有一種頭文件,叫做“assert.h”,它支持?jǐn)嘌缘母袷?。例如,?shí)現(xiàn)者可以針對(duì)pop操作,作出斷言如下:

assert(TOP>0)這樣,宏就會(huì)檢查在試圖從棧中退出一項(xiàng)之前棧是否空。如果條件測(cè)試失敗,則會(huì)打印出一條消息,報(bào)告源文件名及在文件中發(fā)生失效的行號(hào)。(4)調(diào)試(Debugging)數(shù)據(jù)封裝限定了許多用以修改數(shù)據(jù)值的手段,也限定了對(duì)錯(cuò)誤的數(shù)據(jù)值進(jìn)行調(diào)查以找出真正原因的功能。某些面向?qū)ο蟮某绦蛟O(shè)計(jì)環(huán)境支持使用交互工具進(jìn)行調(diào)試。工具包括斷點(diǎn)的設(shè)置、訪問(wèn)源代碼、檢查對(duì)象(包括修改數(shù)據(jù)值和表達(dá)式求值)及編輯源代碼。標(biāo)準(zhǔn)UNIX調(diào)試工具DBX已經(jīng)做了擴(kuò)充,可用于調(diào)試C++程序。(5)錯(cuò)誤處理(ErrorHandling)我們期望一個(gè)類(lèi)能夠自負(fù)錯(cuò)誤處理的責(zé)任。類(lèi)的實(shí)例負(fù)責(zé)定位和報(bào)告錯(cuò)誤。C在錯(cuò)誤處理中使用狀態(tài)碼方法。各種不同的狀態(tài)碼的值能夠指明任務(wù)的執(zhí)行是成功還是失敗,若是失敗又是哪種程度的失敗。例如,C中函數(shù)“fopen”返回的狀態(tài)碼。如果打開(kāi)失敗,則返回零值;如果打開(kāi)成功,則返回文件的標(biāo)志。使用狀態(tài)碼方法的難點(diǎn)在于:各層程序必須知道該層所調(diào)用函數(shù)的狀態(tài)碼,并且檢驗(yàn)這些狀態(tài)碼及采用行動(dòng)。問(wèn)題在比它發(fā)生的那一層更高的一層進(jìn)行處理,這將產(chǎn)生比預(yù)想更高程度的耦合。問(wèn)題盡可能在它發(fā)生的那一層進(jìn)行處理。例如,在fopen打開(kāi)文件失敗時(shí),如果當(dāng)前的文件名不存在,軟件可以要求用戶鍵入另一個(gè)文件名。(6)內(nèi)建錯(cuò)誤處理(Built_InErrorHandling)Ada程序員可以利用語(yǔ)言所提供的例外處理機(jī)制幫助做錯(cuò)誤處理。一個(gè)“例外”所要做的事情是與眾不同的處理?!袄馓幚砥鳌笔且欢未a,一個(gè)特定的例外出現(xiàn)時(shí)調(diào)用。它可以是終止軟件的執(zhí)行,可以是發(fā)信號(hào)給一個(gè)更高層的例外處理器,還可以是對(duì)問(wèn)題進(jìn)行定位處理。packageSIMPLEis

EQUAL:

exception;

functionmax(a

:inINTEGER;

b

:inINTEGER)returnINTEGER;--返回a

與b

中的最大值

--如果a

=b,則出現(xiàn)例外EQUAL.endSIMPLE;packagebodySIMPLEisfunction

max(a

:inINTEGER;

b

:inINTEGER)returnINTEGERis

beginifa=b

thenraiseEQUAL;elseif

a<b

thenreturn

b;elsereturna;endmax;endSIMPLE;withSIMPLE;procedureMAINisx:INTEGER;begin

begin x:=SIMPLE.max(7,7); --將會(huì)出現(xiàn)例外

exception

whenSIMPLE.EQUAL=>x:=7;

--處理例外

end;--處理例外并給x賦值?endMAIN;(7)用戶定義的錯(cuò)誤處理

(User_DefinedErrorHandling)有兩種相對(duì)簡(jiǎn)單的錯(cuò)誤處理技術(shù),它們提供了打印出錯(cuò)信息和終止軟件執(zhí)行的能力。它們都不允許嵌套的錯(cuò)誤處理。第一種技術(shù)使用了一個(gè)全局錯(cuò)誤處理器對(duì)象。每一個(gè)類(lèi)都能對(duì)這個(gè)全局對(duì)象進(jìn)行存取。當(dāng)在一個(gè)用戶對(duì)象中檢測(cè)出一個(gè)錯(cuò)誤的時(shí)候,就把一個(gè)消息發(fā)送給這個(gè)全局對(duì)象。這個(gè)消息運(yùn)載了一個(gè)字符串,它就是要被打印的出錯(cuò)信息,消息中還有一個(gè)整數(shù),它指出錯(cuò)誤的嚴(yán)重程度。消息格式為:

ERROR_HANDLER.handle

("Messagetobeprinted",1);ERROR_HANDLER將打印消息并終止應(yīng)用的執(zhí)行。第二種用戶定義錯(cuò)誤處理的技術(shù)要求每個(gè)類(lèi)都定義或再定義一個(gè)命名為error的操作。這個(gè)操作不應(yīng)是類(lèi)的共有界面部分,它應(yīng)是一個(gè)隱蔽的實(shí)現(xiàn)部分,可以被一些公共操作調(diào)用以檢測(cè)錯(cuò)誤。這種error操作可以打印消息,在適當(dāng)時(shí)候請(qǐng)求一些額外輸入,在必要時(shí)終止軟件的執(zhí)行。(8)多重實(shí)現(xiàn)

(MultipleImplementation)同一個(gè)類(lèi)可以多種方式實(shí)現(xiàn)。為此,軟件庫(kù)必須對(duì)庫(kù)中的每一部分都能保留充足的信息,使得定義能同時(shí)關(guān)聯(lián)到不止一個(gè)實(shí)現(xiàn)。為了定義連接到幾個(gè)實(shí)現(xiàn)所使用的關(guān)系。程序員應(yīng)能指出要求的實(shí)例所在的類(lèi),并確定所期待的特定實(shí)現(xiàn)。應(yīng)用的實(shí)現(xiàn)應(yīng)用的實(shí)現(xiàn)是在所有的類(lèi)都被實(shí)現(xiàn)之后的事情。實(shí)際上,當(dāng)把類(lèi)開(kāi)發(fā)出來(lái)時(shí)就已經(jīng)實(shí)現(xiàn)了應(yīng)用。每個(gè)類(lèi)提供了完成應(yīng)用所需要的某種功能。在C++和C中有一個(gè)main()函數(shù)。可以使用這個(gè)過(guò)程來(lái)說(shuō)明構(gòu)成應(yīng)用的主要對(duì)象的那些類(lèi)的實(shí)例。C++系統(tǒng)中主過(guò)程的兩個(gè)主要職責(zé)就是建立實(shí)例和通過(guò)指針建立對(duì)象之間的通信。以圖形系統(tǒng)為例,首先建立一個(gè)用戶界面的單一實(shí)例。一旦它建立起來(lái),就發(fā)送一個(gè)消息,啟動(dòng)繪圖程序的命令循環(huán)。然后,這個(gè)對(duì)象擔(dān)負(fù)起在系統(tǒng)壽命的其余時(shí)期協(xié)調(diào)通信關(guān)系和對(duì)象建立的責(zé)任。對(duì)于純面向?qū)ο蟮恼Z(yǔ)言,在系統(tǒng)中的每個(gè)“事物”都是對(duì)象。在這些語(yǔ)言中沒(méi)有“主過(guò)程”。用戶建立起一個(gè)類(lèi)的實(shí)例,然后,通過(guò)實(shí)例接受控制和執(zhí)行服務(wù),產(chǎn)生實(shí)例輸出的結(jié)果或接收由用戶發(fā)送來(lái)的消息。由那些原始消息而產(chǎn)生的消息序列就成為目標(biāo)軟件的功能。詳細(xì)設(shè)計(jì)有關(guān)的問(wèn)題探討再回顧一下面向?qū)ο蟮脑O(shè)計(jì)模式,在詳細(xì)設(shè)計(jì)階段,我們要大量的用到它們?cè)敿?xì)設(shè)計(jì)有關(guān)的問(wèn)題探討對(duì)象創(chuàng)建型模型工廠方法FactoryMethod本質(zhì):用一個(gè)virtualmethod完成創(chuàng)建過(guò)程抽象工廠AbstractFactory一個(gè)product族的factorymethod構(gòu)成了一個(gè)factory接口原型Prototype通過(guò)product原型來(lái)構(gòu)造product,Clone+prototypemanager生成器Builder通過(guò)一個(gè)構(gòu)造算法和builder接口把構(gòu)造過(guò)程與客戶隔離開(kāi)單件Singleton單實(shí)例類(lèi)型,如何構(gòu)造這單個(gè)實(shí)例?如何訪問(wèn)這單個(gè)實(shí)例?結(jié)構(gòu)型模式適配器Adapter、橋接bridge、外觀facadeadapter用于兩個(gè)不兼容接口之間的轉(zhuǎn)接bridge用于將一個(gè)抽象與多個(gè)可能的實(shí)現(xiàn)連接起來(lái)facade用于為復(fù)雜的子系統(tǒng)定義一個(gè)新的簡(jiǎn)單易用的接口組合composite、裝飾decorator和代理proxycomposite用于構(gòu)造對(duì)象組合結(jié)構(gòu)decorator用于為對(duì)象增加新的職責(zé)proxy為目標(biāo)對(duì)象提供一個(gè)替代者享元flyweight針對(duì)細(xì)粒度對(duì)象的一種全局控制手段行為模式命令Command用對(duì)象封裝命令,使得命令可以被傳遞、記錄、排隊(duì)等迭代器Iterator把對(duì)聚合體對(duì)象的訪問(wèn)封裝起來(lái)觀察者Observer建立起一對(duì)多的通信模型,特別適合于更新通知和事件模型策略Strategy把一個(gè)對(duì)象或者類(lèi)的某些行為封裝到另一個(gè)單獨(dú)的對(duì)象中訪問(wèn)者Visitor把對(duì)一個(gè)結(jié)構(gòu)模型的操作單獨(dú)組織到一個(gè)類(lèi)中責(zé)任鏈ChainofResponsibility請(qǐng)求的處理過(guò)程,沿著鏈傳遞,decouple發(fā)送方和接收方解釋器Interpreter在類(lèi)層次結(jié)構(gòu)中,在特定環(huán)境的“interpret”過(guò)程中介者M(jìn)ediator用一個(gè)mediator來(lái)decouple各同等單元備忘錄Memento在對(duì)象之外保存對(duì)象的內(nèi)部狀態(tài)狀態(tài)State把一個(gè)對(duì)象的狀態(tài)獨(dú)立出來(lái),動(dòng)態(tài)可變換狀態(tài)對(duì)象的類(lèi)型模板方法TemplateMethod在基類(lèi)中定義算法的骨架,把某些細(xì)節(jié)延遲到子類(lèi)中策略Strategy、迭代器Iterator、中介者M(jìn)ediator、狀態(tài)State和命令用一個(gè)對(duì)象來(lái)封裝某些特性,比如變化、交互、狀態(tài)、行為、命令中介者M(jìn)ediator和觀察者ObserverObserver建立起subject和observer之間的松耦合連接mediator把約束限制集中起來(lái)-〉中心控制命令command、責(zé)任鏈ChainofResponsibility、解釋器interpretercommand模式側(cè)重于命令的總體管理ChainofResponsibility側(cè)重于命令被正確處理interpreter用于復(fù)合結(jié)構(gòu)中操作的執(zhí)行過(guò)程面向?qū)ο蟮某绦蛟O(shè)計(jì):GenericProgramming思想:“通過(guò)參數(shù)化技術(shù)達(dá)到重用的目的(reusethroughparameterization)”,使得組件更容易被定制。實(shí)現(xiàn)靜態(tài)配置代碼,從而獲得很高的效率。

GenericProgramming可以消除類(lèi)型和算法之間本來(lái)不必要的相依性STL是成功的genericprogramming典型genericprogramming限制代碼產(chǎn)生的方式:用實(shí)體類(lèi)型代替類(lèi)型參數(shù),使這些預(yù)先編制好的代碼模型成為真正的代碼,無(wú)法產(chǎn)生完全新的代碼。相關(guān)的programmingAspect-OrientedProgramming(AOP)Anaspectisamodularunitthatcross-cutsthestructureofothermodularunits

Aspectsexistinbothdesignandimplementation.Adesignaspectisamodularunitofthedesignthatcross-cutsthestructureofotherpartsofthedesign.Aprogramorcodeaspectisamodularunitoftheprogramthatcross-cutsothermodularunitsoftheprogram.把問(wèn)題分解為功能單元(組件)和aspect在AOP系統(tǒng)中,組件和aspects(交織)組合起來(lái)得到一個(gè)系統(tǒng)的具體實(shí)現(xiàn)。交織組合既可以在compile-time,也可以在runtimeAOSD,參考:/generativeprogrammingGenerativeProgramming建立起一族軟件系統(tǒng)的模型,在特定的要求下,利用一些基本的、可重用的組件,通過(guò)配置,能夠自動(dòng)根據(jù)需要產(chǎn)生一個(gè)高度定制和優(yōu)化的軟件系統(tǒng)實(shí)例一些原則用參數(shù)化技術(shù)來(lái)概括出差異性對(duì)于相依性和交互進(jìn)行分析和建模通過(guò)靜態(tài)鏈接(compile-time)消除不必要的開(kāi)銷(xiāo),以及執(zhí)行與特定領(lǐng)域相關(guān)的優(yōu)化將問(wèn)題空間和方案空間分離,通過(guò)配置建立兩者的映射關(guān)系Separationofconcerns:borrowedfromAOP特點(diǎn)GenerativeProgramming涉及到軟件開(kāi)發(fā)過(guò)程的各個(gè)階段與DomainEngineering結(jié)合AModel-BasedApproach:/domain-engineering/domain_engineering.htmlActiveLibrariesC++GenericProgrammingTemplate技術(shù)使C++成為two-levellanguagemetaprogram從科學(xué)計(jì)算用途-〉一般性的抽象,

即genericprogramming對(duì)于編譯器代碼產(chǎn)生、優(yōu)化在編譯時(shí)刻,實(shí)現(xiàn)靜態(tài)綁定——partialevaluation對(duì)于庫(kù)開(kāi)發(fā)人員Activelibraries,提供一種抽象的功能,并且控制優(yōu)化過(guò)程許多技術(shù),如policy(traits)、編譯時(shí)刻計(jì)算功能對(duì)于應(yīng)用開(kāi)發(fā)人員定制templateclass或者templatefunctionC++GenericProgramming(續(xù))設(shè)計(jì)思想編譯時(shí)刻程序設(shè)計(jì),類(lèi)似于logic-programming

即,在compile-time讓編譯器完成一些功能,例如靜態(tài)的計(jì)算功能if/else,loop,switch對(duì)type進(jìn)行一些基本的邏輯操作(編程)保證類(lèi)型安全寧可要compile-timeerror,也不要runtimeerror盡可能地泛化——抽象性跟傳統(tǒng)的設(shè)計(jì)方法結(jié)合起來(lái),比如利用patternsTemplate基礎(chǔ)——classtemplatetemplate<typenameT,size_tMAX_ELEMS=8>classArray{ public:T&operator[](size_tn){if(n<0||n>=MAX_ELEMS)throw"Outofbounds!";returnm_rg[n];}protected:Tm_rg[MAX_ELEMS];};使用:

Array<long,8>a1; Array<char,200>a2;Template基礎(chǔ)——模板特化

templatespecializationtemplate<>classArray<char,256>{public: char&operator[](size_tn){ if(n<0||n>=256)throw"Outofbounds!"; returnm_sz[n]; } booloperator==(constArray<char,256>&rhs){ returnstrcmp(m_sz,rhs.m_sz)==0; }protected: charm_sz[256];};Template基礎(chǔ)——部分模板特化

partialtemplatespecializationtemplate<size_tMAX_ELEMS>classArray<char,MAX_ELEMS>{public: T&operator[](size_tn){ if(n<0||n>=MAX_ELEMS)throw"Outofbounds!"; returnm_sz[n]; } booloperator==(constArray<char,MAX_ELEMS>&rhs){ returnstrcmp(m_sz,rhs.m_sz)==0; }protected: Tm_sz[MAX_ELEMS];};*VisualC++6不支持部分模板特化Template基礎(chǔ)——函數(shù)模板

functiontemplatetemplate<classT>voidSwap(T&a,T&b){Ttemp=a;a=b;b=temp;}template<classT>T&min(T&a,T&b){returna<b?a:b;}模板參數(shù),compile-

time起作用函數(shù)參數(shù),runtime

起作用Template基礎(chǔ)——函數(shù)對(duì)象泛化

generalizedfunctors(functionobjects)functor:重載了operator()的C++對(duì)象,擴(kuò)展了函數(shù)指針的概念,可以增加內(nèi)部狀態(tài),可以被當(dāng)作對(duì)象來(lái)傳遞,具有值語(yǔ)義(valuesemantic)。它可以是templateclass,也可以不是template<typenameResultType>classFunctor{public: ResultTypeoperator()(); //othermemberfunctionprivate: //implementation};用法:Functor<int>MyFunctor(val1);intResult=MyFunctor();Template技術(shù)——

代替runtime的if/else//Classdeclarationstemplate<boolC>classConditionProcess{};classConditionProcess<true>{public:staticinlinevoidf(){statement1;}//truecase};classConditionProcess<false>{public:staticinlinevoidf(){statement2;}//falsecase};//Replacementfor'if/else'statement:ConditionProcess<condition>::f();if(condition)statement1;elsestatement2;Compile-time能夠確

定condition的值Template技術(shù)——

代替runtime的switch//Classdeclarationstemplate<intI>classSwitchProcess{public:staticinlinevoidf(){default-statement;}};classSwitchProcess<value1>{public:staticinlinevoidf(){statement1;}};classSwitchProcess<value2>{public:staticinlinevoidf(){statement2;}};//Replacementforswitch(i)statementSwitchProcess<I>::f();inti;switch(i){casevalue1:statement1;break;casevalue2:statement2;break;default:default-statement;break;}Template技術(shù)——

代替runtime的do循環(huán)template<intI>classDoProcess{private:enum{go=(I-1)!=0};public:staticinlinevoidf(){statement; DoProcess<go?(I-1):0>::f();}};//SpecializationprovidesbasecaseforrecursionclassDoProcess<0>{public:staticinlinevoidf(){}};//EquivalentloopcodeDoProcess<N>::f();inti=N;do{statement;}while(--i>0);Template技術(shù)——

代替runtime的臨時(shí)變量template<intN>classcountBits{enum{bit3=(N&0x08)?1:0,bit2=(N&0x04)?1:0,bit1=(N&0x02)?1:0,bit0=(N&0x01)?1:0};public:enum{nbits=bit0+bit1+bit2+bit3};};inti=countBits<13>::nbits;intcountBits(intN){intbit3=(N&0x08)?1:0,bit2=(N&0x04)?1:0,bit1=(N&0x02)?1:0,bit0=(N&0x01)?1:0;returnbit0+bit1+bit2+bit3;}inti=countBits(13);Template技術(shù)——計(jì)算

Compile-timefunctions一般原則:局部變量用enum類(lèi)型循環(huán)轉(zhuǎn)化為遞歸,結(jié)束條件為一個(gè)特化版本也可以是多重循環(huán),需要用到部分特化特性條件分支用模板特化解決效果:以類(lèi)型為基礎(chǔ),實(shí)現(xiàn)各種操作例如sinx=x-x^3/3!+x^5/5!-x^7/7!+…在編譯時(shí)刻求pow(x,y),即x的y次方Template技術(shù)——計(jì)算pow(x,y)template<intX,intY>structctime_pow{ enum{result=X*ctime_pow<X,Y-1>::result};};template<intX>structctime_pow<X,0>{ enum{result=1}; };

用法:constintz=ctime_pow<5,3>::result;Trait技術(shù)定義一些“函數(shù)”,這些函數(shù)的參數(shù)和返回值都是類(lèi)型(type),而不是數(shù)據(jù)(data)例如:對(duì)于一個(gè)數(shù)組類(lèi),它的元素類(lèi)型和平均數(shù)的類(lèi)型不一定相同,可以用一個(gè)traitclass來(lái)建立這種映射關(guān)系對(duì)應(yīng)關(guān)系A(chǔ)verage_type(T)->TAverage_type(int)->floatTrait的使用:Average的實(shí)現(xiàn)Partialevaluation一個(gè)程序的計(jì)算分為兩個(gè)部分靜態(tài)計(jì)算:在編譯時(shí)刻執(zhí)行動(dòng)態(tài)計(jì)算:在運(yùn)行時(shí)刻執(zhí)行例如,計(jì)算立方體的體積Template技術(shù)——模板類(lèi)作為基類(lèi)某種程度上可以代替模板特化template<size_tMAX_LEN>classString:publicArray<char,MAX_LEN+1>{public: //additionalfunctionality booloperator==(constString<MAX_LEN>&rhs) { returnstrcmp(m_rg,rhs.m_rg)==0;}}Template技術(shù)——以模板參數(shù)作為基類(lèi)允許用戶把自己的類(lèi)插入到類(lèi)層次的中間用戶提供基類(lèi),類(lèi)庫(kù)使用基類(lèi)template<typenameBase,typenamePolicy1>classDeriving:publicBase<Policy1>{……}C++asatwo-levellanguage將type當(dāng)作first-classvalue來(lái)對(duì)待例如一種做法:下面的句子

typedefTT_average;相當(dāng)于

typedefT_average=T;實(shí)現(xiàn)了類(lèi)型的賦值Template技術(shù)——typelist

from《ModernC++Design》以類(lèi)型作為元素構(gòu)成鏈

template<classT,classU>structTypelist{typedefTHead;typedefUTail;};例如Length操作

template<classTList>structLength;template<>structLength<NullType>{enum{value=0};};

template<classT,classU>structLength<Typelist<T,U>>{enum{value=1+Length<U>::value};};typelist各種操作LengthTypeAtIndexOfAppendEraseReplaceMostDerived…...Template技術(shù)——typelist(續(xù)一)typelist用法#defineTYPELIST_1(T1)Typelist<T1,NullType>#defineTYPELIST_2(T1,T2)Typelist<T1,TYPELIST_1(T2)>#defineTYPELIST_3(T1,T2,T3)Typelist<T1,TYPELIST_2(T2,T3)>template<classT1,classT2,template<class>classUnit>classGenScatterHierarchy<Typelist<T1,T2>,Unit>:publicGenScatterHierarchy<T1,Unit>,publicGenScatterHierarchy<T2,Unit>{};template<classAtomicType,template<class>classUnit>classGenScatterHierarchy:publicUnit<AtomicType>{};template<template<class>classUnit>classGenScatterHierarchy<NullType,Unit>{};Template技術(shù)——typelist(續(xù)二)GenScatterHierarchy用法template<classT>classHolder{ Tm_value;};typedefGenScatterHierarchy< TYPELIST_3(int,string,CustomClass), Holder>MyTypeTreeMyTypeTreeGenScatterHierarchy<int,Holder>GenScatterHierarchy<TYPELIST_2(string,CustomClass),Holder>GenScatterHierarchy<TYPELIST_1(CustomClass),Holder>GenScatterHierarchy<string,Holder>GenScatterHierarchy<NullType,Holder>GenScatterHierarchy<CustomClass,Holder>

Holder<CustomClass>

Holder<string>

Holder<int>Template技術(shù):動(dòng)態(tài)綁定

——模擬虛函數(shù)多態(tài)性template<typenameT>classArray{public: …… virtualintCompare(constArray<T>&rhs)=0; booloperator<(constArray<T>&rhs) {returnthis->Compare(rhs)<0;} booloperator>(constArray<T>&rhs) {returnthis->Compare(rhs)>0;} booloperator==(constArray<T>&rhs) {returnthis->Compare(rhs)==0;}}template<typenameT,typenameDeriving>classArray{public: …... booloperator<(constArray<T>&rhs) {returnstatic_cast<Deriving*>(this)-> Compare(rhs)<0; } booloperator>(constArray<T>&rhs) {returnstatic_cast<Deriving*>(this)-> Compare(rhs)>0; } booloperator==(constArray<T>&rhs) {returnstatic_cast<Deriving*>(this)-> Compare(rhs)==0; }}policyAliases:strategy,behaviorclass,trait,aspect在設(shè)計(jì)供重用的類(lèi)或者組件的時(shí)候,盡可能地把細(xì)節(jié)抽象出來(lái),雖然這些細(xì)節(jié)遍布各處,但它們本身并不構(gòu)成耦合對(duì)問(wèn)題的垂直分解和水平分解policy1policy2Policy(續(xù)一)想法:用policy來(lái)配置一個(gè)類(lèi)或者組件把影響問(wèn)題的因素分解成幾個(gè)不相關(guān)的方面,并且用policyclass來(lái)表達(dá),例如創(chuàng)建策略線程模型policy之間盡可能不相關(guān)一旦有關(guān)聯(lián),就可能產(chǎn)生一些制約因素,例如引用計(jì)數(shù)策略(RefCountPolicy)和存儲(chǔ)策略(StoragePolicy)policy類(lèi)與host類(lèi)之間可以在runtime進(jìn)行組合,也可以在compile-time進(jìn)行組合Policy(續(xù)二)用模板參數(shù)作為policyclass編譯器在compile-time對(duì)hostclass進(jìn)行配置例如:template<typenameThreadingModel=SingleThreaded>classWidget……template<template<classCreated>classCreationPoly>classWidgetManager……Policy(續(xù)三)Policy組合,用m+n個(gè)類(lèi)組合成n*m種可能,例如:template< classT, template<class>classCheckingPolicy, template<class>ThreadingModel>classSmartPtr;……typedefSmartPtr<Widget,EnsureNotNull,SingleThreaded>SafeWidgetPtr;template<classT>structEnsureNotNull{ staticvoidCheck(T*&ptr) {if(!ptr)ptr=GetDefaultValue();}}Policy(續(xù)四)用模板實(shí)現(xiàn)Policy的意義在compile-time配置hostclass,有助于產(chǎn)生更為高效的代碼,更加generic以類(lèi)為基礎(chǔ)配置一個(gè)類(lèi),所以policy往往包含靜態(tài)方法,即class-level的方法在設(shè)計(jì)可重用類(lèi)或者組件的時(shí)候,根據(jù)需要提取出policy,并確定policy的接口實(shí)現(xiàn)類(lèi)似hook的思想,由用戶提供具體的policyclass,從而把有些行為往后延遲缺點(diǎn):要求使用者對(duì)于policy有非常的了解,知道每一種策略會(huì)影響到問(wèn)題的哪些方面Visitor模式(GoF)Visitor模式改進(jìn)ElementAccept(Visitor)ConcreteElementAAccept(EleVisitor)OperationAConcreteElementBAccept(EleVisitor)OperationBEleVisitorElementAVisitorElementBVisitorMyConcreteVisitor信息結(jié)構(gòu)Visitor結(jié)構(gòu)Lazy技術(shù)LazyInitialization,第一次被訪問(wèn)時(shí)初始化Singleton&Singleton::Instance(){ if(!pInstance) { pInstance=newSingleton; } return*pInstance;}COW(Copyonwrite),第一次被寫(xiě)入時(shí)才拷貝LazyProtocol:DCOM協(xié)議Double-CheckedLockingPattern假設(shè)mutex是一個(gè)Mutex對(duì)象,現(xiàn)在需要對(duì)pInstance的訪問(wèn)進(jìn)行同步,一種方案是Singleton&Singleton::Instance(){ Lockguard(mutex); if(!pInstance) { pInstance=newSingleton; } return*pInstance;}Double-CheckedLockingPattern(續(xù)一)前述的方案效率比較低,只有一次new操作需要保護(hù),其他的只讀訪問(wèn)不必同步保護(hù),改進(jìn):Singleton&Singleton::Instance(){ if(!pInstance) {Lockguard(mutex); pInstance=newSingleton; } return*pInstance;}線程1線程2問(wèn)題:racecondition又出現(xiàn)了Double-CheckedLockingPattern(續(xù)二)Double-CheckedLockingPattern

:Singleton&Singleton::Instance(){ if(!pInstance) {Lockguard(mutex);if(!pInstance){ pInstance=newSingleton;} } return*pInstance;}Table-drivenpattern代替runtimeswitch問(wèn)題:從文件中讀入一組以CShape為基類(lèi)的對(duì)象,傳統(tǒng)的做法:ReadWord(stream,&typeid);switch(typeid){caseLine_ID:pObj=(CShape*)newCLine;pObj->Load(stream);break;casePoly_ID: ……}pDoc.Add(pObj);Table-drivenpattern(續(xù))維護(hù)一張表(typeid,fnCreator)根據(jù)typeid查找到創(chuàng)建函數(shù),然后創(chuàng)建對(duì)象,示例代碼如下:ReadWord(stream,&

溫馨提示

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

評(píng)論

0/150

提交評(píng)論