1. 程式人生 > 其它 >軟體工程概念:高內聚.低耦合

軟體工程概念:高內聚.低耦合

軟體工程概念:高內聚.低耦合

高內聚.低耦合,是軟體工程中的概念,是判斷軟體設計好壞的標準,主要用於程式的面向物件的設計,主要看類的內聚性是否高,耦合度是否低。目的是使程式模組的可重用性、移植性大大增強。通常程式結構中各模組的內聚程度越高,模組間的耦合程度就越低。內聚是從功能角度來度量模組內的聯絡,一個好的內聚模組應當恰好做一件事,它描述的是模組內的功能聯絡;耦合是軟體結構中各模組之間相互連線的一種度量,耦合強弱取決於模組間介面的複雜程度、進入或訪問一個模組的點以及通過介面的資料。

  • 中文名:高內聚低耦合
  • 外文名: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. 一個模組有多個入口。
    • 內容耦合可能在組合語言中出現。大多數高階語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模組獨立性最弱。

建立時間:2021.09.06  更新時間:

部落格園 滔Roy https://www.cnblogs.com/guorongtao 希望內容對你所有幫助,謝謝!