浅谈面向对象开发原则:高内聚,低耦合
這是軟件工程中的概念,是判斷設(shè)計好壞的標(biāo)準(zhǔn),主要是面向OO的設(shè)計,主要是看類的內(nèi)聚性是否高,偶合度是否低.
每一個類完成特定的獨立的功能,這個就是高內(nèi)聚。耦合就是類之間的互相調(diào)用關(guān)系,如果耦合很強(qiáng),互相牽扯調(diào)用很多,那么會牽一發(fā)而動全身,不利于維護(hù)和擴(kuò)展。
類之間的設(shè)置應(yīng)該要低耦合,但是每個類應(yīng)該要高內(nèi)聚.耦合是類之間相互依賴的尺度.如果每個對象都有引用其它所有的對象,那么就有高耦合,這是不合乎要求的,因為在兩個對象之間,潛在性地流動了太多信息.低耦合是合乎要求的:它意味著對象彼此之間更獨立的工作.低耦合最小化了修改一個類而導(dǎo)致也要修改其它類的”連鎖反應(yīng)”. 內(nèi)聚是一個類中變量與方法連接強(qiáng)度的尺度.高內(nèi)聚是值得要的,因為它意味著類可以更好地執(zhí)行一項工作.低內(nèi)聚是不好的,因為它表明類中的元素之間很少相關(guān).成分之間相互有關(guān)聯(lián)的模塊是合乎要求的.每個方法也應(yīng)該高內(nèi)聚.大多數(shù)的方法只執(zhí)行一個功能.不要在方法中添加’額外’的指令,這樣會導(dǎo)致方法執(zhí)行更多的函數(shù).
推廣開來說,這個思想并不限于類與類之間的關(guān)系。模塊和模塊,子系統(tǒng)之間也都要遵守這個原則,才可以設(shè)計出延展性比較強(qiáng)的系統(tǒng)。
什么是耦合
定義
耦合性也稱塊間聯(lián)系。指軟件系統(tǒng)結(jié)構(gòu)中各模塊間相互聯(lián)系緊密程度的一種度量。模塊之間聯(lián)系越緊密,其耦合性就越強(qiáng),模塊的獨立性則越差。模塊間耦合高低取決于模塊間接口的復(fù)雜性、調(diào)用的方式及傳遞的信息。
耦合度就是某模塊(類)與其它模塊(類)之間的關(guān)聯(lián)、感知和依賴的程度,是衡量代碼獨立性的一個指標(biāo),也是軟件工程設(shè)計 及編碼質(zhì)量評價的一個標(biāo)準(zhǔn)。耦合的強(qiáng)度依賴于以下幾個因素: (1)一個模塊對另一個模塊的調(diào)用; (2)一個模塊向另一個模塊傳遞的數(shù)據(jù)量; (3)一個模塊施加到另一個模塊的控制的多少; (4)模塊之間接口的復(fù)雜程度。
耦合分類
耦合按從強(qiáng)到弱的順序可分為以下幾種類型: a)非直接耦合:兩模塊間沒有直接關(guān)系,之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實現(xiàn)的 b)數(shù)據(jù)耦合:指兩個模塊之間有調(diào)用關(guān)系,傳遞的是簡單的數(shù)據(jù)值,相當(dāng)于高級語言的值傳遞; c)標(biāo)記耦合:指兩個模塊之間傳遞的是數(shù)據(jù)結(jié)構(gòu),如高級語言中的數(shù)組名、記錄名、文件名等這些名字即標(biāo)記,其實傳遞的是這個數(shù)據(jù)結(jié)構(gòu)的地址; d)控制耦合:一指一個模塊調(diào)用另一個模塊時,傳遞的是控制變量(如開關(guān)、標(biāo)志等),被調(diào)模塊通過該控制變量的值有選擇地執(zhí)行塊內(nèi)某一功能; e)外部耦合:一組模塊都訪問同一全局簡單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)傳遞該全局變量的信息 f)公共耦合:一組模塊都訪問同一個公共數(shù) 據(jù)環(huán)境。該公共數(shù)據(jù)環(huán)境可以是全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等。 g)內(nèi)容耦合:這是最高程度的耦合,也是最差的耦合。當(dāng)一個模塊直接使用另一個模塊的內(nèi)部數(shù)據(jù),或通過非正常入口而轉(zhuǎn)入另一個模塊內(nèi)部。
為什么要低耦合(解耦合)
??在面向?qū)ο缶幊讨?#xff0c;對象自身是內(nèi)聚的,是保管好自己的數(shù)據(jù),完成好自己的操作的,而對外界呈現(xiàn)出自己的狀態(tài)和行為。但是,沒有絕對的自力更生,對外開放也是必要的!一個對象,往往需要跟其他對象打交道,既包括獲知其他對象的狀態(tài),也包括仰賴其他對象的行為,而一旦這樣的事情發(fā)生時,我們便稱該對象依賴于另一對象。只要兩個對象之間存在一方依賴一方的關(guān)系,那么我們就稱這兩個對象之間存在耦合。 比如媽媽和baby,媽媽要隨時關(guān)注baby的睡、醒、困、哭、尿等等狀態(tài),baby則要仰賴媽媽的喂奶、哄睡、換紙尿褲等行為,從程序的意義上說,二者互相依賴,因此也存在耦合。首先要說,耦合是必要的。
??耦合的程度就是耦合度,也就是雙方依賴的程度。上文所說的媽媽和baby就是強(qiáng)耦合。而你跟快遞小哥之間則是弱耦合。一般來說耦合度過高并不是一件好事。就拿作為IT精英的你來說吧,上級隨時敦促你的工作進(jìn)度,新手頻繁地需要你指導(dǎo)問題,隔三差五還需要參加酒局飯局,然后還要天天看領(lǐng)導(dǎo)的臉色、關(guān)注老婆的心情,然后你還要關(guān)注代碼中的bug 、bug、bug,和需求的變化、變化、變化,都夠焦頭爛額了,還猝不及防的要關(guān)注眼睛、頸椎、前列腺和頭發(fā)的狀態(tài),然后你再炒個股,這些加起來大概就是個強(qiáng)耦合了。從某種意義上來說,耦合天生就與自由為敵,無論是其他對象依賴于你,還是你依賴其他對象。比如有人嗜煙、酗酒,你有多依賴它們就有多不自由;比如有人家里生了七八個娃,還有年邁的父母、岳父母,他們有多依賴你,你就有多不自由。所以老子這樣講:“五音令人耳聾,五色令人目盲,馳騁狩獵令人心發(fā)狂,難得之貨令人行妨。”盧梭也是不無悲涼的說“人生而自由,卻又無往而不在枷鎖中”。因此,要想自由,就必須要降低耦合,而這個過程就叫做解耦和。
??耦合度很高的情況下,維護(hù)代碼時修改一個地方會牽連到很多地方,如果修改時沒有理清這些耦合關(guān)系,那么帶來的后果 可能會是災(zāi)難性的,特別是對于需求變化較多以及多人協(xié)作開發(fā)維護(hù)的項目,修改一個地方會引起本來已經(jīng)運行穩(wěn)定的模塊錯誤,嚴(yán)重時會導(dǎo)致惡性循環(huán),問題永遠(yuǎn)改不完,開發(fā)和測試都在各種問題之間奔波勞累,最后導(dǎo)致項目延期,用戶滿意度降低,成本也增加了,這對用戶和開發(fā)商影響都是很惡劣的,各種風(fēng)險也就不言而喻了。
如何降低耦合(解耦合)
少使用類的繼承,多用接口隱藏實現(xiàn)的細(xì)節(jié)。 Java面向?qū)ο缶幊桃虢涌诔酥С侄鄳B(tài)外, 隱藏實現(xiàn)細(xì)節(jié)也是其中一個目的。
模塊的功能化分盡可能的單一,道理也很簡單,功能單一的模塊供其它模塊調(diào)用的機(jī)會就少。(其實這是高內(nèi)聚的一種說法,高內(nèi)聚低耦合一般同時出現(xiàn),為了限制篇幅,我們將在以后的版期中討論)。
遵循一個定義只在一個地方出現(xiàn)。
少使用全局變量。
類屬性和方法的聲明少用public,多用private關(guān)鍵字,
多用設(shè)計模式,比如采用MVC的設(shè)計模式就可以降低界面與業(yè)務(wù)邏輯的耦合度。
盡量不用“硬編碼”的方式寫程序,同時也盡量避免直接用SQL語句操作數(shù)據(jù)庫。
最后當(dāng)然就是避免直接操作或調(diào)用其它模塊或類(內(nèi)容耦合);如果模塊間必須存在耦合,原則上盡量使用數(shù)據(jù)耦合,少用控制耦合, 限制公共耦合的范圍,避免使用內(nèi)容耦合。
什么是內(nèi)聚
??內(nèi)聚,通俗的來講,就是自己的東西自己保管,自己的事情自己做。每個模塊盡可能獨立完成自己的功能,不依賴于模塊外部的代碼。
??對象是什么?對象就是保管好自己的東西,做好自己的事情的程序模塊——這就是內(nèi)聚!當(dāng)然,對象的內(nèi)聚只是內(nèi)聚的一個層次,在不同的尺度下其實都有內(nèi)聚的要求,比如方法也要講內(nèi)聚,架構(gòu)也要講內(nèi)聚。
內(nèi)聚: 內(nèi)聚性又稱塊內(nèi)聯(lián)系。指模塊的功能強(qiáng)度的度量,即一個模塊內(nèi)部各個元素彼此結(jié)合的緊密程度的度量。若一個模塊內(nèi)各元素(語名之間、程序段之間)聯(lián)系的越緊密,則它的內(nèi)聚性就越高。
高內(nèi)聚:類與類之間的關(guān)系而定,高,意思是他們之間的關(guān)系要簡單,明了,不要有很強(qiáng)的關(guān)系,不然,運行起來就會出問題。一個類的運行影響到其他的類。由于高內(nèi)聚具備魯棒性,可靠性,可重用性,可讀性等優(yōu)點,模塊設(shè)計推薦采用高內(nèi)聚。
內(nèi)聚度是指內(nèi)部各元素之間聯(lián)系的緊密程度,模塊的內(nèi)聚種類通常可分為7種,按其內(nèi)聚度從低 到高的次序依此為:偶然內(nèi)聚、邏輯內(nèi)聚、瞬時內(nèi)聚、過程內(nèi)聚、通信內(nèi)聚、順序內(nèi)聚、功能內(nèi)聚。
1 偶然內(nèi)聚: 指一個模塊內(nèi)的各處理元素之間沒有任何聯(lián)系。 2 邏輯內(nèi)聚: 指模塊內(nèi)執(zhí)行幾個邏輯上相似的功能,通過參數(shù)確定該模塊完成哪一個功能。 3 時間內(nèi)聚: 把需要同時執(zhí)行的動作組合在一起形成的模塊為時間內(nèi)聚模塊。 4 通信內(nèi)聚: 指模塊內(nèi)所有處理元素都在同一個數(shù)據(jù)結(jié)構(gòu)上操作(有時稱之為信息內(nèi)聚),或者指各處理使用相同的輸入數(shù)據(jù)或者產(chǎn)生相同的輸出數(shù)據(jù)。 5 順序內(nèi)聚: 指一個模塊中各個處理元素都密切相關(guān)于同一功能且必須順序執(zhí)行,前一功能元素輸出就是下一功能元素的輸入。 6 功能內(nèi)聚: 這是最強(qiáng)的內(nèi)聚,指模塊內(nèi)所有元素共同完成一個功能,缺一不可。與其他模塊的耦合是最弱的。
轉(zhuǎn)載于:https://www.cnblogs.com/taosiyu/p/11072110.html
總結(jié)
以上是生活随笔為你收集整理的浅谈面向对象开发原则:高内聚,低耦合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PL/SQL Developer连接Or
- 下一篇: ShowDoc 软件开发团队接口文档管理