軟件工程概念:高內聚.低耦合
高內聚.低耦合,是軟件工程中的概念,是判斷軟件設計好壞的標准,主要用於程序的面向對象的設計,主要看類的內聚性是否高,耦合度是否低。目的是使程序模塊的可重用性、移植性大大增強。通常程序結構中各模塊的內聚程度越高,模塊間的耦合程度就越低。內聚是從功能角度來度量模塊內的聯系,一個好的內聚模塊應當恰好做一件事,它描述的是模塊內的功能聯系;耦合是軟件結構中各模塊之間相互連接的一種度量,耦合強弱取決於模塊間接口的復雜程度、進入或訪問一個模塊的點以及通過接口的數據。
- 中文名:高內聚低耦合
- 外文名:High cohesion & Low coupling
- 范 圍:計算機科學
- 應 用:程序的面向對象
- 設計目的:增強可重用性、移植性
- 組 成:內聚、耦合
1、簡介
在軟件設計中通常用耦合度和內聚度作為衡量模塊獨立程度的標准。划分模塊的一個准則是高內聚低耦合。
- 從模塊粒度來看,高內聚:盡可能類的每個成員方法只完成一件事(最大限度的聚合); 低耦合:減少類內部,一個成員方法調用另一個成員方法。
- 從類角度來看, 高內聚低耦合:減少類內部,對其他類的調用;從功能塊來看 高內聚低耦合:減少模塊之間的交互復雜度(接口數量,參數數據)即橫向:類與類之間、模塊與模塊之間;縱向:層次之間;盡可能,內容內聚,數據耦合。
降低耦合度的方法:
- 1、少使用類的繼承,多用接口隱藏實現的細節。 Java面向對象編程引入接口除了支持多態外, 隱藏實現細節也是其中一個目的。
- 2、模塊的功能化分盡可能的單一,道理也很簡單,功能單一的模塊供其它模塊調用的機會就少。(其實這是高內聚的一種說法,高內聚低耦合一般同時出現)。
- 3、遵循一個定義只在一個地方出現。
- 4、少使用全局變量。
- 5、類屬性和方法的聲明少用public,多用private關鍵字。
- 6、多用設計模式,比如采用MVC的設計模式就可以降低界面與業務邏輯的耦合度。
- 7、盡量不用“硬編碼”的方式寫程序,同時也盡量避免直接用SQL語句操作數據庫。
- 8、最后當然就是避免直接操作或調用其它模塊或類(內容耦合);如果模塊間必須存在耦合,原則上盡量使用數據耦合,少用控制耦合,限制公共耦合的范圍,避免使用內容耦合。
增強內聚度方法:
- 1、模塊只對外暴露最小限度的接口,形成最低的依賴關系。
- 2、只要對外接口不變,模塊內部的修改,就不得影響其他模塊。
- 3、刪除一個模塊,應當只影響有依賴關系的其他模塊,而不應該影響其他無關部分。
2、架構設計
- 架構是指可以預制和重構的軟件框架結構。
- 普遍指通過某種特定平台,而達到完成整體軟件的功能。
- 架構設計是指對軟件、硬件、網絡、運營、政策等軟件設計中的需求和要素進行決策,主要包括體系結構設計和各個層的模塊設計。
- 架構設計目標有個能夠最大化的重用。
- 首先,要在架構的設計中靈活地使用各種共享的,特別是開源的框架技術因為共享的架構可以方便開發組分解問題,從而對項目中的功能模塊分為需要內部解決和使用已有外部服務兩類,避免了重復開發實現。
- 其次,盡量使用成熟的框架。由於服務器端軟件系統的開發,涉及的知識、內容、要解決的技術問題很多,在某些方面使用第三方成熟的框架,相當於讓別人幫助開發者完成了一些基礎性的工作,此時開發者只需要集中精力完成系統業務邏輯的設計和實現。使軟件系統實現可擴展性在技術上靈活地使用各種架構模式和代碼設計模式,並且在使用代碼設計模式的同時,使用其所提倡的面向接口編程,會對軟件系統的可擴展性和可移植性的提高有所幫助。
- 希望能夠設計出“高內聚、低耦合”的應用系統。
- 這是架構設計最主要的目標,實現系統的高內聚、低耦合遵從以下原則:
- 利用分層架構實現系統在縱向上的低藕合;
- 利用開源框架進一步確保縱向分層的具體實現;
- 按照功能划分子系統來實現橫向上的低偶合;
- 利用包結構確保橫向上低耦合的具體實現 。
3、內聚與耦合
耦合性:也稱塊間聯系。指軟件系統結構中各模塊間相互聯系緊密程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性則越差。
模塊間耦合高低取決於模塊間接口的復雜性、調用的方式及傳遞的信息內聚性:又稱塊內聯系。指模塊的功能強度的度量,即一個模塊內部各個元素彼此結合的緊密程度的度量。若一個模塊內各元素(語句之間、程序段之間)聯系的越緊密,則它的內聚性就越高。
3.1 內聚 (模塊內部,粒度可大可小, 可以是函數, 類, 功能塊等)
內聚:故名思議,表示內部間聚集、關聯的程度,那么高內聚就是指要高度的聚集和關聯。高內聚是指類與類之間的關系而定,高,意思是他們之間的關系要簡單明了,不要有很強的關系,不然,運行起來就會出問題。一個類的運行影響到其他的類。由於高內聚具備可靠性,可重用性,可讀性等優點,模塊設計推薦采用高內聚。內聚標志一個模塊內各個元素彼此結合的緊密程度,它是信息隱蔽和局部化概念的自然擴展。內聚是從功能角度來度量模塊內的聯系,一個好的內聚模塊應當恰好做一件事。它描述的是模塊內的功能聯系。
- 偶然內聚:一個模塊內的各處理元素之間沒有任何聯系,只是偶然地被湊到一起。這種模塊也稱為巧合內聚,內聚程度最低。
- 邏輯內聚:這種模塊把幾種相關的功能組合在一起, 每次被調用時,由傳送給模塊參數來確定該模塊應完成哪一種功能 。
- 時間內聚:把需要同時執行的動作組合在一起形成的模塊稱為時間內聚模塊。
- 過程內聚:構件或者操作的組合方式是,允許在調用前面的構件或操作之后,馬上調用后面的構件或操作,即使兩者之間沒有數據進行傳遞。簡單的說就是如果一個模塊內的處理元素是相關的,而且必須以特定次序執行則稱為過程內聚。例如某要完成登錄的功能,前一個功能判斷網絡狀態,后一個執行登錄操作,顯然是按照特定次序執行的。
- 通信內聚:指模塊內所有處理元素都在同一個數據結構上操作或所有處理功能都通過公用數據而發生關聯(有時稱之為信息內聚)。即指模塊內各個組成部分都使用相同的數據結構或產生相同的數據結構。
- 順序內聚:一個模塊中各個處理元素和同一個功能密切相關,而且這些處理必須順序執行,通常前一個處理元素的輸出時后一個處理元素的輸入。例如某要完成獲取訂單信息的功能,前一個功能獲取用戶信息,后一個執行計算均價操作,顯然該模塊內兩部分緊密關聯。順序內聚的內聚度比較高,但缺點是不如功能內聚易於維護。
- 功能內聚:模塊內所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模塊已不可再分。即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯系、缺一不可。
模塊內部的元素, 關聯性越強, 則內聚越高, 模塊單一性更強。 一個模塊應當盡可能獨立完成某個功能, 如果有各種場景需要被引入到當前模塊, 代碼質量將變得非常脆弱, 這種情況建議拆分為多個模塊。低內聚的模塊代碼, 不管是維護, 擴展還是重構都相當麻煩, 難以下手
3.2 耦合 (模塊之間的關系)
耦合:是對模塊間關聯程度的度量。耦合的強弱取決與模塊間接口的復雜性、調用模塊的方式以及通過界面傳送數據的多少。 模塊間的耦合度是指模塊之間的依賴關系,包括控制關系、調用關系、數據傳遞關系。模塊間聯系越多,其耦合性越強,同時表明其獨立性越差。降低模塊間的耦合度能減少模塊間的影響,防止對某一模塊修改所引起的“牽一發動全身”的水波效應,保證系統設計順利進行。 耦合度就是某模塊(類)與其它模塊(類)之間的關聯、感知和依賴的程度,是衡量代碼獨立性的一個指標。
- 非直接耦合:兩個模塊之間沒有直接關系,它們之間的聯系完全是通過主模塊的控制和調用來實現的。耦合度最弱,模塊獨立性最強。
- 數據耦合:調用模塊和被調用模塊之間只傳遞簡單的數據項參數。相當於高級語言中的值傳遞。
- 標記耦合:調用模塊和被調用模塊之間傳遞數據結構而不是簡單數據,同時也稱作特征耦合。表就和的模塊間傳遞的不是簡單變量,而是像高級語言中的數據名、記錄名和文件名等數據結果,這些名字即為標記,其實傳遞的是地址。
- 控制耦合:模塊之間傳遞的不是數據信息,而是控制信息例如標志、開關量等,一個模塊控制了另一個模塊的功能。
- 外部耦合:一組模塊都訪問同一全局簡單變量,而且不通過參數表傳遞該全局變量的信息,則稱之為外部耦合。
- 公共耦合:一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。公共數據環境可以是全局數據結構、共享的通信區、內存的公共覆蓋區等。如果模塊只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬於比較松散的公共耦合;如果模塊既向公共數據環境輸入數據又從公共數據環境取出數據,這屬於較緊密的公共耦合。
- 公共耦合會引起以下問題:
- 1. 無法控制各個模塊對公共數據的存取,嚴重影響了軟件模塊的可靠性和適應性。
- 2. 使軟件的可維護性變差。若一個模塊修改了公共數據,則會影響相關模塊。
- 3. 降低了軟件的可理解性。不容易清楚知道哪些數據被哪些模塊所共享,排錯困難。
- 一般地,僅當模塊間共享的數據很多且通過參數傳遞很不方便時,才使用公共耦合。
- 公共耦合會引起以下問題:
- 內容耦合:一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。
- 若在程序中出現下列情況之一,則說明兩個模塊之間發生了內容耦合:
- 1. 一個模塊直接訪問另一個模塊的內部數據。
- 2. 一個模塊不通過正常入口而直接轉入到另一個模塊的內部。
- 3. 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。
- 4. 一個模塊有多個入口。
- 內容耦合可能在匯編語言中出現。大多數高級語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模塊獨立性最弱。
- 若在程序中出現下列情況之一,則說明兩個模塊之間發生了內容耦合:
模塊之間存在依賴, 導致改動可能會互相影響, 關系越緊密, 耦合越強, 模塊獨立性越差。比如模塊A直接操作了模塊B中數據, 則視為強耦合, 若A只是通過數據與模塊B交互, 則視為弱耦合。獨立的模塊便於擴展, 維護, 寫單元測試, 如果模塊之間重重依賴, 會極大降低開發效率.
創建時間:2021.09.06 更新時間: