如何理解低耦合AND高內聚?[轉]

来源:https://www.cnblogs.com/astech/archive/2018/08/22/9519624.html
-Advertisement-
Play Games

1、高內聚 首先我們來看看內聚的含義:軟體含義上的內聚其實是從化學中的分子的內聚演變過來的,化學中的分子間的作用力,作用力強則表現為內聚程度高。在軟體中內聚程度的高低,標識著軟體設計的好壞。 我們在進行架構設計時的內聚高低是指,設計某個模塊或者關註點時,模塊或關註點內部的一系列相關功能的相關程度的高 ...


 1、高內聚

        首先我們來看看內聚的含義:軟體含義上的內聚其實是從化學中的分子的內聚演變過來的,化學中的分子間的作用力,作用力強則表現為內聚程度高。在軟體中內聚程度的高低,標識著軟體設計的好壞。

        我們在進行架構設計時的內聚高低是指,設計某個模塊或者關註點時,模塊或關註點內部的一系列相關功能的相關程度的高低。

        例如:下單模塊:

        image 

一般情況下,下單模塊都會有如下的信息,訂單的信息,產品的信息及誰下的單(買家信息)。這是基本的,那麼我們設計的時候就要把相關的功能內聚到一起。當然這是從大功能(下單管理)上來說,當然這些模塊還可以再細化分成產品、訂單、會員等子模塊。

        例如我們在設計資料庫操作輔助類提供的方法有:

        image 

通過這樣的方式,那麼這個組件只負責資料庫操作。這樣帶來的好處也是顯而易見的。高內聚提供了更好的可維護性和可復用性。而低內聚的模塊則表名模塊直接的依賴程度高,那麼一旦修改了該模塊依賴的對象則無法使用該模塊,必須也進行相應的修改才可以繼續使用。

        低內聚的模塊設計的壞處有:首先模塊的功能不單一,模塊的職責不明確,比較鬆散,更有甚者是完成不相關的功能。這樣的設計往往是不可取的。可以通過重構來完善。

        下麵我們來說下高內聚的簡單解釋:什麼樣的模塊算是高內聚,並且能夠在系統中很好的使用。

        image

        那麼我們在設計的過程中如何去完成高內聚呢?

        image

        以上基本上講述了高內聚的好處,並且闡述瞭如何實現高內聚的步驟和原則。下麵我們來說說可能高內聚帶來的壞處。

        高內聚有時候也不是說所有的情況都採用這樣的原則,當然高內聚還是要適度的,下麵來舉例說明:例如內聚性要求強的話就像Windows32中系統提供的API,裡面的函數太多了,都放在一個Dll中,那麼每個函數完成一個功能。這樣強大的功能,會比較複雜,所以並不是完全的高內聚越高越好,還是要看實際的需要。當然維護起來也不是特別的方便。

      2、低耦合

         首先我們來看看低耦合的定義:低耦合是用來度量模塊與模塊直接的依賴關係。耦合當然也可以這樣簡單的理解,我想懂電腦的應該都知道,CPU與主板之間的關係,CPU如果是特殊的CPU必須使用特殊的主板來支持,那麼如果說這個CPU不唯一依賴唯一主板,那麼就認為這個CPU與主板的關係是低耦合的關係。

         下麵我們來舉例說明低耦合的設計與高耦合的設計:

          image 

這是一個簡單的低耦合的設計,電器與插座之間是低耦合的關係,就算我替換了不同的插座,電器依然可以正常的工作。因此簡單的描述如下,就是A模塊與B模塊存在依賴關係,那麼當B發生改變時,A模塊仍然可以正常工作,那麼就認為A與B是低耦合的。

         image

         1、筆記本接音響可以正常的使用。

                 2、筆記本接專配耳機正常的使用。       

         對應一般的音響來說,筆記本是通用的,音響和筆記本直接的關係是低耦合的,但是筆記本和耳機卻是高耦合的,只有專配的耳機才能和筆記本互聯使用,而不

是通用的,所以說筆記本和專配耳機存在著較強的依賴關係。當然最簡單的方式就是筆記本提供統一的耳機介面,可以滿足一般性的需求。

         下麵我們將來分析如何構建低耦合的設計。

         image

        總結

          上面我們已經講解了低耦合和高內聚的二個原則,通過這2個原則我們知道,滿足這2個原則是衡量一個架構設計好壞的一個參考標準。下麵我們將來講解通過功能分離的方式來滿足上面的2個原則。

 

       1、如何按功能進行模塊化的分離。

       我們在將一個系統進行功能劃分時,首先我們先把功能職責劃分成獨立的單元。

       例如現在有個B2C系統,那麼我們按照B2C的需求,如下分析:

       image 

我們這裡簡單的分析下B2C應該具有的功能模塊,當然這些模塊的劃分中,有些模塊還可以繼續的分離,當然我這裡只是實例分析出來。

      2、對分離出來的模塊化進行抽象,例如我們以支付為例。

          image 

這裡通過支付介面向外提供服務。那麼外界模塊不關心支付系統模塊的變化,只需要調用介面即可,如果具體的支付方式,比如支付寶的方式發生改變,在調用支付服務的模塊中也不需要做任何的修改就可以正常的提供服務。顯然這樣的方式是不錯的實現方式。

 

       通常情況下我們在系統分離式只是以介面的方式提供服務,供其他的模塊進行使用。在模塊內部有大量的信息是不要向外部暴露的,所以模塊在設計時訪問域的定義就要劃分好,防止因為訪問域的定義而對模塊的信息造成破壞。

       下麵我們來看下功能分離在不同的設計理念下都是什麼樣的表現:

       image

       上面只是實體性的分析了功能分離的好處及應用的廣度,當然我們在後續會結合實例來講解如何來實現這樣的軟體設計模式。當然這隻是軟體的架構設計,那麼如

果細化到具體的實現呢?我們如何去設計每個功能點呢?這就是下章我們要講解的內容了,那麼本文先列出二種常見的方式。

        image

        下篇我們將針對設計原則中的實現方式,進行詳細的剖析與具體實現進行舉例講解,希望大家多提意見。


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

-Advertisement-
Play Games
更多相關文章
  • 作為前端最火的構建工具,是前端自動化工具鏈 最重要的部分 ,使用門檻較高。本系列是筆者自己的學習記錄,比較基礎,希望通過 問題 + 解決方式 的模式,以前端構建中遇到的具體需求為出發點,學習 工具中相應的處理辦法。(本篇中的參數配置及使用方式均基於 ) 一. CSS文件基本處理需求 假設項目中的CS ...
  • 很多人不明白這個display:flex是到底是什麼東西,如何使用的 。 1.什麼是display:flex呢? 答:flex是 flexible box的縮寫,意為彈性佈局 ;這個東西的引入,為盒模型提供了最大的靈活性!可以相應式的實現各種頁面的佈局。 基本概念 採用flex佈局的元素,稱為fle ...
  • wxSearch優雅的微信小程式搜索框 一、功能 支持自定義熱門key 支持搜索歷史 支持搜索建議 支持搜索歷史(記錄)緩存 二、使用 1、將wxSearch文件夾整個拷貝到根目錄下 2、引入 3、使用3.1 wxml文件這裡有兩種模板:一種為wxSearch作者提供的模板,另一種是weui提供的模 ...
  • 在ES6中我們有兩種定義變數的方式:let const let特點: 1.let定義時不會進行變數聲明提升 2.變數不允許被重覆定義 3.變數不可以被刪除 4.在for迴圈當中用let定義i 迴圈時可以保存 i 的值 5.在塊級元素中用let定義的變數只能在當前塊級作用域中使用(註:凡是用{}包裹的 ...
  • 1. 2.在項目根目錄新建postcss.config.js文件,並對postcss進行配置: webpack編譯時如果出現No PostCSS Config的時候可以嘗試用這兩個方法來試試 ...
  • if (window["context"] == undefined) { if (!window.location.origin) { window.location.origin = window.location.protocol + "//" + window.location.hostna... ...
  • 一、新建項目使用scss 使用ng new 項目名稱創建項目的時候 ng new my-app --skip-install --prefix mpr --style=scss 二、已有項目使用scss 首先,安裝node-sass包 npm install node-sass --save-dev ...
  • docker與虛擬機有何不同 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。 容器技術有很多種,Docker是目前最流行的一種,網易雲也在使用Docker。伺服器虛擬化解決的核心問題是資源 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...