編程之包的設(shè)計(jì)原則_第1頁
編程之包的設(shè)計(jì)原則_第2頁
編程之包的設(shè)計(jì)原則_第3頁
編程之包的設(shè)計(jì)原則_第4頁
編程之包的設(shè)計(jì)原則_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

包的設(shè)計(jì)原則1、重用發(fā)布等價(jià)原則前言RobertC.Martin氏為我們總結(jié)了在面向?qū)ο蟮脑O(shè)計(jì)(OOD)中應(yīng)該遵循的原則,這些原則被稱為“PrinciplesofOOD”,關(guān)于“PrinciplesofOOD”的相關(guān)文章可以從ObjectMenter得到。本文介紹TheReleaseReuseEquivalencyPrinciple(REP):重用發(fā)布等價(jià)原則。概要Thegranuleofreuseisthegranuleofrelease.重用粒度等價(jià)于發(fā)布粒度。重用的概念重用主要是從用戶的觀點(diǎn)來看的。對用戶來說,使用某個(gè)發(fā)布單位(組件,類,類群等),如果作者因?yàn)槟撤N原因?qū)ζ渥髁诵薷亩l(fā)布了一個(gè)新的版本,用戶會期望在升級為新版本之后,不會影響到原系統(tǒng)的正常運(yùn)作。也就是說,對于一個(gè)可重用(能供其它用戶或系統(tǒng)使用)的元素(組件,類,類群等),作者應(yīng)該承諾新版本能夠兼容舊版本。否則,用戶將拒絕使用該元素。RobertC.Martin氏給出的對重用的定義:Iprefertodefinereuseasfollows.Ireusecodeif,andonlyif,Ineverneedtolookatthesourcecode(otherthanthepublicportionsofheaderfiles).Ineedonlylinkwithstaticlibrariesorincludedynamiclibraries.Whenevertheselibrariesarefixedorenhanced,IreceiveanewversionwhichIcanthenintegrateintomysystemwhenopportunityallows.代碼可以看作為可重用的代碼,當(dāng)且僅當(dāng):-它的使用者(下稱用戶)無需看它的源代碼-用戶只需聯(lián)結(jié)靜態(tài)庫或包含動(dòng)態(tài)庫-當(dāng)庫發(fā)生改變(錯(cuò)誤糾正,功能增強(qiáng))時(shí),用戶只需要得到一個(gè)新的版本便能集成到原有的系統(tǒng)怎么做到重用呢?一個(gè)組件要做到能夠重用,它必須有一個(gè)得到良好設(shè)計(jì)的結(jié)構(gòu),它所包含所有元素必須也是可以重用的。因?yàn)槿绻粋€(gè)為重用而設(shè)計(jì)的發(fā)布單位里,包含了不可重用的元素,當(dāng)不可重用的元素發(fā)生改變時(shí),用戶也不得不改變原有系統(tǒng)以適應(yīng)新的版本。這顯然違反了重用的定義規(guī)則。也就是說,一個(gè)為重用目的而設(shè)計(jì)的發(fā)布單位里,不能包含不可重用的元素;如果包含了不可重用的元素,它將變得不可重用。發(fā)布單位當(dāng)用戶使用的重用組件被作者修改后,用戶希望得到通知,然后決定是否升級或升級的時(shí)機(jī)。為了能使升級后的系統(tǒng)也能正常運(yùn)作,用戶也希望作者有一個(gè)規(guī)范的發(fā)布,包括版本號,類庫的說明等等。一旦用戶決定升級新版本,不管這些修改是否影響到用戶,用戶也不得不包含新版本所包含的所有類庫。REP規(guī)定重用粒度不能小于發(fā)布粒度,所有重用元素也必須被一起發(fā)布。發(fā)布粒度可以為包(組件),或類等實(shí)體,但一個(gè)應(yīng)用往往包含了很多類,所以,具有更大的尺度的包(組件)更加適合作為發(fā)布粒度。重用發(fā)布等價(jià)原則為我們指明了包的設(shè)計(jì)方針:一個(gè)包中的元素(類)要么都可重用,要么都不可重用。小結(jié)重用發(fā)布等價(jià)原則(REP)從用戶觀點(diǎn)的角度上為我們規(guī)范了包設(shè)計(jì)的原則:在設(shè)計(jì)包時(shí),包中應(yīng)該包含的元素要么都可以重用,要么都不可以重用。參考資料GranularitybyRobertC.Martin。PrinciplesandPatternsbyRobertC.Martin。2、無環(huán)依賴原則前言RobertC.Martin氏為我們總結(jié)了在面向?qū)ο蟮脑O(shè)計(jì)(OOD)中應(yīng)該遵循的原則,這些原則被稱為“PrinciplesofOOD”,關(guān)于“PrinciplesofOOD”的相關(guān)文章可以從ObjectMentorr得到。本文介紹TheAcyclicDependenciesPrinciple(ADP):無環(huán)依賴原則,或者非循環(huán)依賴原則。概要Thedependencystructurebetweenpackagesmustbeadirectedacyclicgraph(DAG).Thatis,theremustbenocyclesinthedependencystructure.包之間的依賴結(jié)構(gòu)必須是一個(gè)直接的無環(huán)圖形(DAG)。也就是說,在依賴結(jié)構(gòu)中不允許出現(xiàn)環(huán)(循環(huán)依賴)。換成另一個(gè)說法是:Thedependenciesbetweenpackagesmustnotformcycles.包之間的依賴不能是一個(gè)環(huán)狀形式。包的依賴如果一個(gè)包A中的類引用了包B中的類,我們稱包A依賴包B?!耙蕾嚒痹诰唧w的程序語言中表現(xiàn)為,如果A依賴B,C/C++語言則在A包的文件/類中通過#include語句包含B包中的文件/類;Java語言則A包的類中通過import語句引入B包中的類。圖1(包A依賴包B)虛線表示一種依賴關(guān)系,箭頭表示依賴的方向,箭頭所在的一側(cè)就是被依賴的包。包的循環(huán)依賴我們上面討論了并用圖形表示了包之間的依賴關(guān)系。如果存在2個(gè)或2個(gè)以上的包,它們之間的依賴關(guān)系圖出現(xiàn)了環(huán)狀,我們就稱包之間存在循環(huán)依賴關(guān)系。

也就是說它們的依賴結(jié)構(gòu)圖根據(jù)箭頭的方向形成了一個(gè)環(huán)狀的閉合圖形。如圖:圖2:包的循環(huán)依賴如圖:A依賴B,B依賴C,C依賴A,形成了一個(gè)環(huán)狀依賴。包的非循環(huán)依賴原則包是一個(gè)比較合適的發(fā)布粒度,當(dāng)修改了包中的代碼(類,模塊等)并發(fā)布新的版本時(shí),我們需要把該包以及它所依賴的其它包一起發(fā)布。發(fā)布之后,還需要驗(yàn)證系統(tǒng)是否能在新發(fā)布的版本下正常運(yùn)作。如果多個(gè)包之間形成了循環(huán)依賴,比如如圖2,A依賴B,B依賴C,C依賴A,我們修改了B并需要發(fā)布B的一個(gè)新的版本,因?yàn)锽依賴C,所以發(fā)布時(shí)應(yīng)該包含C,但C同時(shí)又依賴A,所以又應(yīng)該把A也包含進(jìn)發(fā)布版本里。也就是說,依賴結(jié)構(gòu)中,出現(xiàn)在環(huán)內(nèi)的所有包都不得不一起發(fā)布。它們形成了一個(gè)高耦合體,當(dāng)項(xiàng)目的規(guī)模大到一定程度,包的數(shù)目變多時(shí),包與包之間的關(guān)系便變得錯(cuò)綜復(fù)雜,各種測試也將變得非常困難,常常會因?yàn)槟硞€(gè)不相關(guān)的包中的錯(cuò)誤而使得測試無法繼續(xù)。而發(fā)布也變得復(fù)雜,需要把所有的包一起發(fā)布,無疑增加了發(fā)布后的驗(yàn)證難度。循環(huán)依賴的打破方法如果包的依賴形成了環(huán)狀結(jié)構(gòu),怎么樣打破這種循環(huán)依賴呢?有2種方法可以打破這種循環(huán)依賴關(guān)系:第一種方法是創(chuàng)建新的包,第二種方法是使用DIP(依賴倒置原則)和ISP(接口分隔原則)設(shè)計(jì)原則。方法一:創(chuàng)建新的包比如對于圖2這種依賴結(jié)構(gòu):圖2:包的循環(huán)依賴包C要依賴包A,必定A中包含有A,C共通使用的類,把這些共同類抽出來放在一個(gè)新的包D里。這樣就把C依賴A變成了C依賴D以及A依賴D,從而打破了循環(huán)依賴關(guān)系。如圖:這樣,包的依賴關(guān)系就從A->B->C->A變成了:A->B->C->DA->D方法二:DIP與ISP設(shè)計(jì)原則ISP(接口分隔原則)可以剔除美用到的接口。DIP(依賴倒置原則)在類的調(diào)用之間引入抽象層。如圖,,包A依賴包B(因?yàn)榘麬中的類U使用了包B中的類X);反過來,包B又依賴包A(因?yàn)榘麭中的類Y使用了包A中的類V)包A,包B之間就形成了一種循環(huán)依賴。我們使用DIP設(shè)計(jì)原則為V抽象一個(gè)接口IVforY,并把該接口放在B包中。這樣就把Y對V的調(diào)用轉(zhuǎn)化為:V繼承IVforYY調(diào)用IVforY如圖:這樣一來,包B中的類就不依賴任何包A中的類了。小結(jié)無環(huán)依賴原則(ADP)為我們解決包之間的關(guān)系耦合問題。在設(shè)計(jì)包結(jié)構(gòu)時(shí),不能有循環(huán)依賴。參考資料GranularitybyRobertC.Martin。PrinciplesandPatternsbyRobertC.Martin。3、穩(wěn)定抽象等價(jià)原則前言RobertC.Martin氏為我們總結(jié)了在面向?qū)ο蟮脑O(shè)計(jì)(OOD)中應(yīng)該遵循的原則,這些原則被稱為“PrinciplesofOOD”,關(guān)于“PrinciplesofOOD”的相關(guān)文章可以從ObjectMentor得到。本文介紹TheStableAbstractionsPrinciple(SAP):穩(wěn)定抽象等價(jià)原則。概要Packagesthataremaximallystableshouldbemaximallyabstract.Instablepackagesshouldbeconcrete.Theabstractionofapackageshouldbeinproportiontoitsstability.最穩(wěn)定的包應(yīng)該是最抽象的包。不穩(wěn)定的包應(yīng)該是具體的包。包的抽象程度跟它的穩(wěn)定性成正比。換成另一個(gè)說法是:Stablepackagesshouldbeabstractpackages.穩(wěn)定的包應(yīng)該是抽象的包。包的穩(wěn)定抽象等價(jià)原則我們在TheStableDependenciesPrinciple(SDP)-OO設(shè)計(jì)的穩(wěn)定依賴原則一文中談到了包的穩(wěn)定性:不容易改變的包應(yīng)該具有更好的穩(wěn)定性。一個(gè)包的抽象程度越高,它的穩(wěn)定性就越高。反之,它的穩(wěn)定性就越低。一個(gè)穩(wěn)定的包必須是抽象的,反之,不穩(wěn)定的包必須是具體的。穩(wěn)定的包的構(gòu)成抽象類或接口通過子類繼承擴(kuò)展行為,這表示抽象類或接口比它們的子類更具有穩(wěn)定性??傊?,為了構(gòu)成穩(wěn)定的包,應(yīng)該提高包內(nèi)的抽象類或接口的比率;它們的子類可以放在另一個(gè)不穩(wěn)定的包內(nèi),該包依賴上述穩(wěn)定的包,從而遵循了穩(wěn)定依賴原則(SDP)。理想的體系結(jié)構(gòu)應(yīng)該是:不穩(wěn)定的(容易改變的)包處于上層-它們是具體的包實(shí)現(xiàn)穩(wěn)定的(不容易改變的)包處于下層-不容易改變,但容易擴(kuò)展-接口比實(shí)現(xiàn)(具體的運(yùn)行代碼)在內(nèi)在特性上更具有穩(wěn)定性圖1:遵循穩(wěn)定依賴原則(SDP)的理想的體系結(jié)構(gòu)小結(jié)穩(wěn)定抽象等價(jià)原則(SAP)為我們解決包之間的關(guān)系耦合問題。在設(shè)計(jì)包結(jié)構(gòu)時(shí),穩(wěn)定的包應(yīng)該是抽象的(由抽象類或接口構(gòu)成),不穩(wěn)定的包應(yīng)該是具體的(由具體的實(shí)現(xiàn)類構(gòu)成)。參考資料PrinciplesandPatternsbyRobertC.Martin。PrinciplesandPatterns4、穩(wěn)定依賴原則Thedependenciesbetweenpackagesinadesignshouldbeinthedirectionofthestabilityofthepackages.Apackageshouldonlydependuponpackagesthataremorestablethatitis.一個(gè)設(shè)計(jì)中的包之間的依賴應(yīng)該朝著穩(wěn)定的方向進(jìn)行。一個(gè)包只應(yīng)該依賴那些比自己更穩(wěn)定的包。前言RobertC.Martin氏為我們總結(jié)了在面向?qū)ο蟮脑O(shè)計(jì)(OOD)中應(yīng)該遵循的原則,這些原則被稱為“PrinciplesofOOD”,關(guān)于“PrinciplesofOOD”的相關(guān)文章可以從ObjectMentor得到。本文介紹TheStableDependenciesPrinciple(SDP):穩(wěn)定依賴原則,或稱安定依賴原則。概要Thedependenciesbetweenpackagesinadesignshouldbeinthedirectionofthestabilityofthepackages.Apackageshouldonlydependuponpackagesthataremorestablethatitis.一個(gè)設(shè)計(jì)中的包之間的依賴應(yīng)該朝著穩(wěn)定的方向進(jìn)行。一個(gè)包只應(yīng)該依賴那些比自己更穩(wěn)定的包。換成另一個(gè)說法是:Dependinthedirectionofstability.朝著穩(wěn)定的方向進(jìn)行依賴。包的依賴如果一個(gè)包A中的類引用了包B中的類,我們稱包A依賴包B?!耙蕾嚒痹诰唧w的程序語言中表現(xiàn)為,如果A依賴B,C/C++語言則在A包的文件/類中通過#include語句包含B包中的文件/類;Java語言則A包的類中通過import語句引入B包中的類。圖1(包A依賴包B)虛線表示一種依賴關(guān)系,箭頭表示依賴的方向,箭頭所在的一側(cè)就是被依賴的包。包的穩(wěn)定依賴原則包應(yīng)該依賴比自己更穩(wěn)定的包。因?yàn)槿绻蕾囈粋€(gè)不穩(wěn)定的包,那么當(dāng)這個(gè)不穩(wěn)定的包發(fā)生變化時(shí),本身穩(wěn)定的包也不得不發(fā)生變化,變得不穩(wěn)定了。所謂穩(wěn)定,在現(xiàn)實(shí)生活中是指一個(gè)物體具有穩(wěn)固不變的屬性使它很難發(fā)生變化。應(yīng)用到軟件概念上,我們認(rèn)為一個(gè)軟件是穩(wěn)定的,是因?yàn)檫@個(gè)軟件很難發(fā)生改變,或更確切地說,是不需要發(fā)生改變。一個(gè)設(shè)計(jì)良好,能應(yīng)對各種變化不需要修改的軟件當(dāng)然是穩(wěn)定的了,但事實(shí)上,往往一個(gè)軟件常常需要對應(yīng)某個(gè)事先沒有預(yù)測到的用戶需求而不得不發(fā)生改變,當(dāng)這種改變發(fā)生時(shí),能把修改控制在最小的范圍之內(nèi),并能穩(wěn)定的工作(包括軟件本身以及依賴它的其它軟件實(shí)體等),我們也會認(rèn)為該軟件是相對穩(wěn)定的。怎么樣讓一個(gè)軟件足夠穩(wěn)定呢?一個(gè)確切的方法是,讓大量其它軟件的包依賴它。一個(gè)包被很多其他包依賴是非常穩(wěn)定的,這是因?yàn)楸灰蕾嚨陌鼮榱藚f(xié)調(diào)其他包必須做很多的工作來對應(yīng)各種變化(責(zé)任的負(fù)擔(dān)者)。圖1:穩(wěn)定的包X我們認(rèn)為X是穩(wěn)定的,因?yàn)椋?X被很多其他包依賴。相當(dāng)于責(zé)任擔(dān)當(dāng)著。-X沒有依賴別的包,它是獨(dú)立的。相反,下面列出了一個(gè)非常不穩(wěn)定的包Y,如圖:圖2:不穩(wěn)定的包Y我們認(rèn)為Y是不穩(wěn)定的,因?yàn)椋?Y沒有被其他的包所依賴。不是責(zé)任的擔(dān)當(dāng)著。-Y依賴很多別的包。包的穩(wěn)定性的判斷原則可以通過下面的方法來判斷一個(gè)包的穩(wěn)定系數(shù):Ca:AfferentCoupling。向心耦合。依賴該包(包含的類)的外部包(類)的數(shù)目(i.e.incomingdependencies)。Ce:EfferentCoupling。離心耦合。被該包依賴的外部包的數(shù)目(i.e.outgoingdependencies)。I:Instability。不穩(wěn)定性。I=Ce/(Ce+Ca)。它的值處于[0,1]之間。如圖1,X的Ce=0,所以不穩(wěn)定性I=0,它是穩(wěn)定的。相反,如圖2,Y的Ce=3,Ca=0,所以它的不穩(wěn)定性I=1,它是不穩(wěn)定的。SDP要求一個(gè)包的不穩(wěn)定性I要大于它所依賴的包的不穩(wěn)定性?!癉ependuponpackageswhoseImetricislowerthanyours.”換句話說,沿著依賴的方向,包的不穩(wěn)定性應(yīng)該逐漸降低,穩(wěn)定性應(yīng)該逐漸升高。小結(jié)穩(wěn)定依賴原則(SDP)為我們解決包之間的關(guān)系耦合問題。在設(shè)計(jì)包結(jié)構(gòu)時(shí),包應(yīng)該只依賴比自己更穩(wěn)定的包。參考資料GranularitybyRobertC.Martin。PrinciplesandPatternsbyRobertC.Martin。5、共同封閉原則前言RobertC.Martin氏為我們總結(jié)了在面向?qū)ο蟮脑O(shè)計(jì)(OOD)中應(yīng)該遵循的原則,這些原則被稱為“PrinciplesofOOD”,關(guān)于“PrinciplesofOOD”的相關(guān)文章可以從ObjectMentor得到。本文介紹TheCommonClosurePrinciple(CCP):共同封閉原則。概要Theclassesinapackageshouldbeclosedtogetheragainstthesamekindsofchanges.achangethataffectsapackageaffectsalltheclassesinthatpackage.一個(gè)包中所有的類應(yīng)該對同一種類型的變化關(guān)閉。一個(gè)變化影響一個(gè)包,便影響了包中所有的類。一個(gè)更簡短的說法是:Classesthatchangetogether,belongtogether.一起修改的類,應(yīng)該組合在一起(同一個(gè)包里)。如果必須修改應(yīng)用程序里的代碼,我們希望所有的修改都發(fā)生在一個(gè)包里(修改關(guān)閉),而不是遍布在很多包里。CCP原則就是把因?yàn)槟硞€(gè)同樣的原因而需要修改的所有類組合進(jìn)一個(gè)包里。如果2個(gè)類從物理上或者從概念上聯(lián)系得非常緊密,它們通常一起發(fā)生改變,那么它們應(yīng)該屬于同一個(gè)包。CCP跟開閉原則(OCP:OpenClosedPrinciple)有著很深的淵源關(guān)系,CCP的“關(guān)閉”(closure)就是OCP所提倡的:classesshouldbeclosedformodificationbutopenforextension.類應(yīng)該對修改關(guān)閉,對擴(kuò)展開放。但我們知道,100%的“關(guān)閉”是不現(xiàn)實(shí)的,我們在設(shè)計(jì)系統(tǒng)時(shí),只能盡量地保持對大多數(shù)可預(yù)見的修改關(guān)閉。CCP延伸了OCP的“關(guān)閉”概念,當(dāng)因?yàn)槟硞€(gè)原因需要修改時(shí),把需要修改的范圍限制在一個(gè)最小范圍內(nèi)的包里。CCP原則幫助我們決定哪些類應(yīng)該被放到同一個(gè)包里。小結(jié)共同封閉原則(CCP)從軟件功能的角度上為我們規(guī)范了包設(shè)計(jì)的一個(gè)原則:在設(shè)計(jì)包時(shí),相互之間緊密關(guān)聯(lián)的類應(yīng)該放在同一包里。參考資料GranularitybyRobertC.Martin。PrinciplesandPatternsbyRobertC.Martin。6、全部重用原則前言RobertC.Martin氏為我們總結(jié)了在面向?qū)ο蟮脑O(shè)計(jì)(OOD)中應(yīng)該遵循的原則,這些原則被稱為“PrinciplesofOOD”,關(guān)于“PrinciplesofOOD”的相關(guān)文章可以從ObjectMentor得到。本文介紹TheTheCommonReusePrinciple(CRP):全部重用原則。概要Theclassesinapackagearereusedtogether.Ifyoureuseoneoftheclassesinapackage,youreusethemall.包的所有類被一起重用。如果你重用了其中的一個(gè)類,就重用全部。換成另一個(gè)比較淺顯易懂的

溫馨提示

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

評論

0/150

提交評論