软件工程中的耦合类型
耦合性(Coupling),也叫耦合度,是對模塊間關(guān)聯(lián)程度的度量。耦合的強弱取決與模塊間接口的復(fù)雜性、調(diào)用模塊的方式以及通過界面?zhèn)魉蛿?shù)據(jù)的多少。模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強,同時表明其獨立性越差。軟件設(shè)計中通常用耦合度和內(nèi)聚度作為衡量模塊獨立程度的標(biāo)準(zhǔn)。劃分模塊的一個準(zhǔn)則就是高內(nèi)聚低耦合。
一般模塊之間可能的連接方式有七種,構(gòu)成耦合性的七種類型。它們之間的關(guān)系為(耦合性性由強到弱):
內(nèi)容耦合(Content Coupling)?
如果發(fā)生下列情形,兩個模塊之間就發(fā)生了內(nèi)容耦合。- 一個模塊直接訪問另一個模塊的內(nèi)部數(shù)據(jù);
- 一個模塊不通過正常入口轉(zhuǎn)到另一模塊內(nèi)部;
- 兩個模塊有一部分程序代碼重疊(只可能出現(xiàn)在匯編語言中);
- 一個模塊有多個入口。
公共耦合(Common Coupling)?
若一組模塊都訪問同一個公共數(shù)據(jù)環(huán)境,則它們之間的耦合就稱為公共耦合。公共的數(shù)據(jù)環(huán)境可以是全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等。外部耦合(External Coupling)?
一組模塊都訪問同一全局簡單變量而不是同一全局?jǐn)?shù)據(jù)結(jié)構(gòu),而且不是通過參數(shù)表傳遞該全局變量的信息,則稱之為外部耦合。控制耦合(Control Coupling)?
如果一個模塊通過傳送開關(guān)、標(biāo)志、名字等控制信息,明顯地控制選擇另一模塊的功能,就是控制耦合。標(biāo)記耦合(Stamp Coupling)?
如果一組模塊通過參數(shù)表傳遞記錄信息,就是標(biāo)記耦合。它是某一數(shù)據(jù)結(jié)構(gòu)的子結(jié)構(gòu),而不是簡單變量。數(shù)據(jù)耦合(Data Coupling)?
如果一個模塊訪問另一個模塊時,彼此之間是通過數(shù)據(jù)參數(shù)(不是控制參數(shù)、公共數(shù)據(jù)結(jié)構(gòu)或外部變量)來交換輸入、輸出信息的,則稱這種耦合為數(shù)據(jù)耦合。非直接耦合(Nondirect Coupling)?
如果兩個模塊之間沒有直接關(guān)系,它們之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實現(xiàn)的,這就是非直接耦合。這種耦合的模塊獨立性最強。
高內(nèi)聚低耦合
目錄
定義
編輯高內(nèi)聚低耦合,是軟件工程中的概念,是判斷設(shè)計好壞的標(biāo)準(zhǔn),主要是面向?qū)ο蟮脑O(shè)計,主要是看類的內(nèi)聚性是否高,耦合度是否低。概念
編輯耦合性:也稱塊間聯(lián)系。指軟件系統(tǒng)結(jié)構(gòu)中各模塊間相互聯(lián)系緊密程度的一種度量。模塊之間聯(lián)系越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決于模塊間接口的復(fù)雜性、調(diào)用的方式及傳遞的信息內(nèi)聚性:又稱塊內(nèi)聯(lián)系。指模塊的功能強度的度量,即一個模塊內(nèi)部各個元素彼此結(jié)合的緊密程度的度量。若一個模塊內(nèi)各元素(語名之間、程序段之間)聯(lián)系的越緊密,則它的內(nèi)聚性就越高。所謂高內(nèi)聚是指一個軟件模塊是由相關(guān)性很強的代碼組成,只負(fù)責(zé)一項任務(wù),也就是常說的單一責(zé)任原則。耦合:一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量。對于低耦合,粗淺的理解是:一個完整的系統(tǒng),模塊與模塊之間,盡可能的使其獨立存在。也就是說,讓每個模塊,盡可能的獨立完成某個特定的子功能。模塊與模塊之間的接口,盡量的少而簡單。如果某兩個模塊間的關(guān)系比較復(fù)雜的話,最好首先考慮進(jìn)一步的模塊劃分。這樣有利于修改和組合。[1]知識
編輯軟件架構(gòu)設(shè)計的目的簡單說就是在保持軟件內(nèi)在聯(lián)系的前提下,分解軟件系統(tǒng),降低軟件系統(tǒng)開發(fā)的復(fù)雜性,而分解軟件系統(tǒng)的基本方法無外乎分層和分割。但是在保持軟件內(nèi)在聯(lián)系的前提下,如何分層分割系統(tǒng),分層分割到什么樣的粒度,并不是一件容易的事,這方面有各種各樣的分解方法,比如:關(guān)注點分離,面向方面,面向?qū)ο?#xff0c;面向接口,面向服務(wù),依賴注入,以及各種各樣的設(shè)計原則等,耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:(1) 內(nèi)容耦合:一個模塊直接訪問另一模塊的內(nèi)容,則稱這兩個模塊為內(nèi)容耦合。若在程序中出現(xiàn)下列情況之一,則說明兩個模塊之間發(fā)生了內(nèi)容耦合:1. 一個模塊直接訪問另一個模塊的內(nèi)部數(shù)據(jù)。2. 一個模塊不通過正常入口而直接轉(zhuǎn)入到另一個模塊的內(nèi)部。3. 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。4. 一個模塊有多個入口。內(nèi)容耦合可能在匯編語言中出現(xiàn)。大多數(shù)高級語言都已設(shè)計成不允許出現(xiàn)內(nèi)容耦合。這種耦合的耦合性最強,模塊獨立性最弱。(2) 公共耦合:一組模塊都訪問同一個全局?jǐn)?shù)據(jù)結(jié)構(gòu),則稱之為公共耦合。公共數(shù)據(jù)環(huán)境可以是全局?jǐn)?shù)據(jù)結(jié)構(gòu)、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等。如果模塊只是向公共數(shù)據(jù)環(huán)境輸入數(shù)據(jù),或是只從公共數(shù)據(jù)環(huán)境取出數(shù)據(jù),這屬于比較松散的公共耦合;如果模塊既向公共數(shù)據(jù)環(huán)境輸入數(shù)據(jù)又從公共數(shù)據(jù)環(huán)境取出數(shù)據(jù),這屬于較緊密的公共耦合。公共耦合會引起以下問題:1. 無法控制各個模塊對公共數(shù)據(jù)的存取,嚴(yán)重影響了軟件模塊的可靠性和適應(yīng)性。2. 使軟件的可維護(hù)性變差。若一個模塊修改了公共數(shù)據(jù),則會影響相關(guān)模塊。3. 降低了軟件的可理解性。不容易清楚知道哪些數(shù)據(jù)被哪些模塊所共享,排錯困難。一般地,僅當(dāng)模塊間共享的數(shù)據(jù)很多且通過參數(shù)傳遞很不方便時,才使用公共耦合。(3) 外部耦合:一組模塊都訪問同一全局簡單變量,而且不通過參數(shù)表傳遞該全局變量的信息,則稱之為外部耦合。(4) 控制耦合:模塊之間傳遞的不是數(shù)據(jù)信息,而是控制信息例如標(biāo)志、開關(guān)量等,一個模塊控制了另一個模塊的功能。(5) 標(biāo)記耦合:調(diào)用模塊和被調(diào)用模塊之間傳遞數(shù)據(jù)結(jié)構(gòu)而不是簡單數(shù)據(jù),同時也稱作特征耦合。表就和的模塊間傳遞的不是簡單變量,而是像高級語言中的數(shù)據(jù)名、記錄名和文件名等數(shù)據(jù)結(jié)果,這些名字即為標(biāo)記,其實傳遞的是地址。(6) 數(shù)據(jù)耦合:調(diào)用模塊和被調(diào)用模塊之間只傳遞簡單的數(shù)據(jù)項參數(shù)。相當(dāng)于高級語言中的值傳遞。(7) 非直接耦合:兩個模塊之間沒有直接關(guān)系,它們之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實現(xiàn)的。耦合度最弱,模塊獨立性最強。總結(jié):耦合是影響軟件復(fù)雜程度和設(shè)計質(zhì)量的一個重要因素,為提高模塊的獨立性,應(yīng)建立模塊間盡可能松散的系統(tǒng),在設(shè)計上我們應(yīng)采用以下原則:若模塊間必須存在耦合,應(yīng)盡量使用數(shù)據(jù)耦合,少用控制耦合,慎用或有控制地使用公共耦合,并限制公共耦合的范圍,盡量避免內(nèi)容耦合。內(nèi)聚有如下的種類,它們之間的內(nèi)聚度由弱到強排列如下:(1) 偶然內(nèi)聚:一個模塊內(nèi)的各處理元素之間沒有任何聯(lián)系,只是偶然地被湊到一起。這種模塊也稱為巧合內(nèi)聚,內(nèi)聚程度最低。(2) 邏輯內(nèi)聚:這種模塊把幾種相關(guān)的功能組合在一起, 每次被調(diào)用時,由傳送給模塊參數(shù)來確定該模塊應(yīng)完成哪一種功能 。(3) 時間內(nèi)聚:把需要同時執(zhí)行的動作組合在一起形成的模塊稱為時間內(nèi)聚模塊。?(4) 過程內(nèi)聚:構(gòu)件或者操作的組合方式是,允許在調(diào)用前面的構(gòu)件或操作之后,馬上調(diào)用后面的構(gòu)件或操作,即使兩者之間沒有數(shù)據(jù)進(jìn)行傳遞。簡單的說就是如果一個模塊內(nèi)的處理元素是相關(guān)的,而且必須以特定次序執(zhí)行則稱為過程內(nèi)聚。
(5) 通信內(nèi)聚:指模塊內(nèi)所有處理元素都在同一個數(shù)據(jù)結(jié)構(gòu)上操作或所有處理功能都通過公用數(shù)據(jù)而發(fā)生關(guān)聯(lián)(有時稱之為信息內(nèi)聚)。即指模塊內(nèi)各個組成部分都使用相同的數(shù)據(jù)數(shù)據(jù)或產(chǎn)生相同的數(shù)據(jù)結(jié)構(gòu)。
(6) 順序內(nèi)聚:一個模塊中各個處理元素和同一個功能密切相關(guān),而且這些處理必須順序執(zhí)行,通常前一個處理元素的輸出時后一個處理元素的輸入。例如某模塊完成工業(yè)產(chǎn)值求值的功能,前一個功能元素求總產(chǎn)值,后一個功能元素求平均產(chǎn)值,顯然該模塊內(nèi)兩部分緊密關(guān)聯(lián)。順序內(nèi)聚的內(nèi)聚度比較高,但缺點是不如功能內(nèi)聚易于維護(hù)。(7) 功能內(nèi)聚:模塊內(nèi)所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模塊已不可再分。即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯(lián)系、缺一不可。功能內(nèi)聚是最強的內(nèi)聚,其優(yōu)點是它的功能明確。判斷一個模塊是否功能內(nèi)聚,一般從模塊名稱就能看出。如果模塊名稱只有一個動詞和一個特定的目標(biāo)(單數(shù)名詞),一般來說就是功能內(nèi)聚,如:“計算水費”、“計算產(chǎn)值”等模塊。功能內(nèi)聚一般出現(xiàn)在軟件結(jié)構(gòu)圖的較低層次上。功能內(nèi)聚模塊的一個重要特點是:他是一個“暗盒”,對于該模塊的調(diào)用者來說,只需要知道這個模塊能做什么,而不需要知道這個模塊是如何做的。總結(jié):在模塊劃分時,要遵循“一個模塊,一個功能”的原則,盡可能使模塊達(dá)到功能內(nèi)聚。高內(nèi)聚,低耦合的系統(tǒng)有什么好處呢?事實上,短期來看,并沒有很明顯的好處,甚至短期內(nèi)會影響系統(tǒng)的開發(fā)進(jìn)度,因為高內(nèi)聚,低耦合的系統(tǒng)對開發(fā)設(shè)計人員提出了更高的要求。高內(nèi)聚,低耦合的好處體現(xiàn)在系統(tǒng)持續(xù)發(fā)展的過程中,高內(nèi)聚,低耦合的系統(tǒng)具有更好的重用性,維護(hù)性,擴展性,可以更高效的完成系統(tǒng)的維護(hù)開發(fā),持續(xù)的支持業(yè)務(wù)的發(fā)展,而不會成為業(yè)務(wù)發(fā)展的障礙。
總結(jié)
以上是生活随笔為你收集整理的软件工程中的耦合类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 合宙Air103|射频读写器|RC522
- 下一篇: 一个上班可以偷偷看小说的阅读器