談談高內聚低耦合

来源:https://www.cnblogs.com/JamesWang1993/archive/2018/04/21/8900155.html
-Advertisement-
Play Games

這個問題在本科的時候就接觸過了,這兩天做筆試題的時候又看到覺得有必要碼一下。 高內聚低耦合,是軟體工程中的概念,是判斷設計好壞的標準,主要是面向對象的設計,看類的內聚性是否高,耦合度是否低。 下文轉至 https://blog.csdn.net/walid1992/article/details/7 ...


這個問題在本科的時候就接觸過了,這兩天做筆試題的時候又看到覺得有必要碼一下。

高內聚低耦合,是軟體工程中的概念,是判斷設計好壞的標準,主要是面向對象的設計,看類的內聚性是否高,耦合度是否低。

下文轉至 https://blog.csdn.net/walid1992/article/details/73278304

概念

內聚關註模塊內部的元素結合程度,耦合關註模塊之間的依賴程度。

內聚性:
又稱塊內聯繫。指模塊的功能強度的度量,即一個模塊內部各個元素彼此結合的緊密程度的度量。若一個模塊內各元素(語名之間、程式段之間)聯繫的越緊密,則它的內聚性就越高。

所謂高內聚是指一個軟體模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。

耦合性:
也稱塊間聯繫。指軟體系統結構中各模塊間相互聯繫緊密程度的一種度量。模塊之間聯繫越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決於模塊間介面的複雜性、調用的方式及傳遞的信息。

對於低耦合,粗淺的理解是:一個完整的系統,模塊與模塊之間,儘可能的使其獨立存在。也就是說,讓每個模塊,儘可能的獨立完成某個特定的子功能。模塊與模塊之間的介面,儘量的少而簡單。如果某兩個模塊間的關係比較複雜的話,最好首先考慮進一步的模塊劃分。這樣有利於修改和組合。

內聚

內聚有如下的種類,它們之間的內聚度由弱到強排列如下:

一、偶然內聚:一個模塊內的各處理元素之間沒有任何聯繫,只是偶然地被湊到一起。這種模塊也稱為巧合內聚,內聚程度最低。

二、邏輯內聚:這種模塊把幾種相關的功能組合在一起, 每次被調用時,由傳送給模塊參數來確定該模塊應完成哪一種功能 。

三、時間內聚:把需要同時執行的動作組合在一起形成的模塊稱為時間內聚模塊。

四、過程內聚:構件或者操作的組合方式是,允許在調用前面的構件或操作之後,馬上調用後面的構件或操作,即使兩者之間沒有數據進行傳遞。簡單的說就是如果一個模塊內的處理元素是相關的,而且必須以特定次序執行則稱為過程內聚。

例如某要完成登錄的功能,前一個功能判斷網路狀態,後一個執行登錄操作,顯然是按照特定次序執行的。

五、通信內聚:指模塊內所有處理元素都在同一個數據結構上操作或所有處理功能都通過公用數據而發生關聯(有時稱之為信息內聚)。即指模塊內各個組成部分都使用相同的數據結構或產生相同的數據結構。

六、順序內聚:一個模塊中各個處理元素和同一個功能密切相關,而且這些處理必須順序執行,通常前一個處理元素的輸出時後一個處理元素的輸入。

例如某要完成獲取訂單信息的功能,前一個功能獲取用戶信息,後一個執行計算均價操作,顯然該模塊內兩部分緊密關聯。
順序內聚的內聚度比較高,但缺點是不如功能內聚易於維護。

七、功能內聚:模塊內所有元素的各個組成部分全部都為完成同一個功能而存在,共同完成一個單一的功能,模塊已不可再分。即模塊僅包括為完成某個功能所必須的所有成分,這些成分緊密聯繫、缺一不可。

功能內聚是最強的內聚,其優點是它的功能明確。判斷一個模塊是否功能內聚,一般從模塊名稱就能看出。如果模塊名稱只有一個動詞和一個特定的目標(單數名詞),一般來說就是功能內聚,如:“計算水費”、“計算產值”等模塊。功能內聚一般出現在軟體結構圖的較低層次上。
功能內聚模塊的一個重要特點是:他是一個“暗盒”,對於該模塊的調用者來說,只需要知道這個模塊能做什麼,而不需要知道這個模塊是如何做的。

耦合

耦合可以分為以下幾種,它們之間的耦合度由高到低排列如下:

一、 內容耦合:一個模塊直接訪問另一模塊的內容,則稱這兩個模塊為內容耦合。
若在程式中出現下列情況之一,則說明兩個模塊之間發生了內容耦合:
1. 一個模塊直接訪問另一個模塊的內部數據。
2. 一個模塊不通過正常入口而直接轉入到另一個模塊的內部。
3. 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。
4. 一個模塊有多個入口。
內容耦合可能在彙編語言中出現。大多數高級語言都已設計成不允許出現內容耦合。這種耦合的耦合性最強,模塊獨立性最弱。

二、公共耦合:一組模塊都訪問同一個全局數據結構,則稱之為公共耦合。公共數據環境可以是全局數據結構、共用的通信區、記憶體的公共覆蓋區等。如果模塊只是向公共數據環境輸入數據,或是只從公共數據環境取出數據,這屬於比較鬆散的公共耦合;如果模塊既向公共數據環境輸入數據又從公共數據環境取出數據,這屬於較緊密的公共耦合。
公共耦合會引起以下問題:
1. 無法控制各個模塊對公共數據的存取,嚴重影響了軟體模塊的可靠性和適應性。
2. 使軟體的可維護性變差。若一個模塊修改了公共數據,則會影響相關模塊。
3. 降低了軟體的可理解性。不容易清楚知道哪些數據被哪些模塊所共用,排錯困難。
一般地,僅當模塊間共用的數據很多且通過參數傳遞很不方便時,才使用公共耦合。

三、外部耦合:一組模塊都訪問同一全局簡單變數,而且不通過參數表傳遞該全局變數的信息,則稱之為外部耦合。

四、控制耦合:模塊之間傳遞的不是數據信息,而是控制信息例如標誌、開關量等,一個模塊控制了另一個模塊的功能。

五、標記耦合:調用模塊和被調用模塊之間傳遞數據結構而不是簡單數據,同時也稱作特征耦合。表就和的模塊間傳遞的不是簡單變數,而是像高級語言中的數據名、記錄名和文件名等數據結果,這些名字即為標記,其實傳遞的是地址。

六、數據耦合:調用模塊和被調用模塊之間只傳遞簡單的數據項參數。相當於高級語言中的值傳遞。

七、非直接耦合:兩個模塊之間沒有直接關係,它們之間的聯繫完全是通過主模塊的控制和調用來實現的。耦合度最弱,模塊獨立性最強。

分析

高內聚,低耦合的系統有什麼好處呢?

事實上,短期來看,並沒有很明顯的好處,甚至短期內會影響系統的開發進度,因為高內聚,低耦合的系統對開發設計人員提出了更高的要求。高內聚,低耦合的好處體現在系統持續發展的過程中,高內聚,低耦合的系統具有更好的重用性,維護性,擴展性,可以更高效的完成系統的維護開發,持續的支持業務的發展,而不會成為業務發展的障礙。

高內聚低耦合是否意味著內聚越高越好,耦合越低越好?

    1. 並不是內聚越高越好,耦合越低越好,真正好的設計是在高內聚和低耦合間進行平衡,也就是說高內聚和低耦合是衝突的。
    2. 最強的內聚莫過於一個類只寫一個函數,這樣內聚性絕對是最高的。但這會帶來一個
      明顯的問題:類的數量急劇增多,這樣就導致了其它類的耦合特別多,於是整個設計就變成了“高內聚高耦合”了。由於高耦合,整個系統變動同樣非常頻繁。
    3. 對於耦合來說,最弱的耦合是一個類將所有的函數都包含了,這樣類完全不依賴其它類,耦合性是最低的。但這樣會帶來一個明顯的問題:內聚性很低,於是整個設計就變成了“低耦合低內聚”了。由於低內聚,整個類的變動同樣非常頻繁。
    4. 真正做到高內聚、低耦合是很難的,很多時候未必一定要這樣,更多的時候“最適合”的才是最好的,不過、審時度勢、融會貫通、人盡其才、物盡其用,才是設計的王道。

軟體設計時,如何做好高內聚低耦合?

在模塊劃分時,要遵循“一個模塊,一個功能”的原則,儘可能使模塊達到功能內聚。
耦合是影響軟體複雜程度和設計質量的一個重要因素,為提高模塊的獨立性,應建立模塊間儘可能鬆散的系統,在設計上我們應採用以下原則:若模塊間必須存在耦合,應儘量使用數據耦合,少用控制耦合,慎用或有控制地使用公共耦合,並限制公共耦合的範圍,儘量避免內容耦合。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • input輸入框<div id="top-title" style="position: relative"> <img class="img-responsive center-block" alt="" src="" style="float:left;z-index: 999;position ...
  • 上周的某一天,和一位同樣是前端技術極度愛好的開發者朋友聊天,他在提出了一個問題,他寫的vue程式為什麼在dev模式運行良好,而在production模式就直接報錯了。這讓我感到驚訝,還有這麼神奇的事情。今就把這個歷險記道給大伙聽聽,看能從中學習到什麼? 一、還原現場 朋友在看到我的驚訝後,分分就把他 ...
  • 小程式項目別的頁面初始化拿到的值為兩種狀態,其他頁面拿不到app.js全局globalData下全局的cookie ...
  • 1.首先寫一個遮罩層div,然後再寫一個彈窗的div js代碼:(把jq引進來) 效果: ...
  • CH1 認識HTML HTML和CSS是我們用來創建網頁的語言:HTML是超文本標記語言(HyperText Markup Language)的縮寫,用來建立網頁的結構;CSS是層疊樣式表(Cascading Style Sheet)的縮寫,用來控制HTML的表現。 Web伺服器存儲並提供由HTML ...
  • ​ 前面在看題目的時候 偶然看到 使用parseInt 來進行整數判斷 但是這裡的parseInt是錯誤示範 之後瞭解了一下 發現這和函數 很有研究 先看看 w3c怎麼說這個的 說實話 雖然我沒有比較好的描述,但是覺的他的解釋並不好 看不懂 我們來看看當沒有 radix這個參數的時候 parseIn ...
  • 寫過jquery的可能都知道,jquery裡面可以很方便的使用以下代碼: 而jquery這種調用方式就是鏈式調用。我們可以從上述代碼看出來,如果不使用鏈式調用的話,那麼我們會增加很多重覆的代碼,而且特別冗餘。而通過鏈式調用,我們可以節省很多代碼,並且代碼看起來更加優雅和整潔。那麼,接下來,我們來 ...
  • 訪問者模式是一種將數據操作和數據結構分離的設計模式,可以說是面向數據密集型的一種設計方式,數據的結構相對穩定,有明顯的分層和分類,而對數據對象的相關操作進行分組、分析等二次加工,這些操作都是由訪問者來執行的,而不是將這些放到被訪問的數據對象中,方便了操作方法的擴展。 作用 封裝一些作用於某種數據結構 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...