天天看點

用大白話告訴你什麼是低耦合|高内聚

1、高内聚

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

        我們在進行架構設計時的内聚高低是指,設計某個子產品或者關注點時,子產品或關注點内部的一系列相關功能的相關程度的高低。

        例如:下單子產品:

用大白話告訴你什麼是低耦合|高内聚

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

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

用大白話告訴你什麼是低耦合|高内聚

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

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

        下面我們來說下高内聚的簡單解釋:什麼樣的子產品算是高内聚,并且能夠在系統中很好的使用。

用大白話告訴你什麼是低耦合|高内聚

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

用大白話告訴你什麼是低耦合|高内聚

        以上基本上講述了高内聚的好處,并且闡述了如何實作高内聚的步驟和原則。下面我們來說說可能高内聚帶來的壞處。

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

      2、低耦合

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

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

用大白話告訴你什麼是低耦合|高内聚

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

用大白話告訴你什麼是低耦合|高内聚

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

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

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

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

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

用大白話告訴你什麼是低耦合|高内聚

        總結

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

       1、如何按功能進行子產品化的分離。

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

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

用大白話告訴你什麼是低耦合|高内聚

我們這裡簡單的分析下B2C應該具有的功能子產品,當然這些子產品的劃分中,有些子產品還可以繼續的分離,當然我這裡隻是執行個體分析出來。

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

用大白話告訴你什麼是低耦合|高内聚

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

       通常情況下我們在系統分離式隻是以接口的方式提供服務,供其他的子產品進行使用。在子產品内部有大量的資訊是不要向外部暴露的,是以子產品在設計時通路域的定義就要劃分好,防止因為通路域的定義而對子產品的資訊造成破壞。

1 public www.tianjiptzc.cn  www.zhuyngyule.cn class SomeController
 2 {
 3     private readonly ISomeService someService;
 4 
 5     public SomeController(www.feiyuptzc.cn ISomeService someService)
 6     {
 7         this.someService www.lecaixuanzc.cn= someService;
 8     }
 9 
10     [HttpPost("Create")www.huiyinpp3zc.cn]
11     public SomeDto CreateSomething(SomethingDto parameters)
12     {
13         return this.www.chaoyuepint.com someService.Create(new www.motianydl.cn  Something(www.moyouptzc.cn)
14         {
15             A =www.shentuylgw.cn paraeters.A
16             // and so on           

複制

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

用大白話告訴你什麼是低耦合|高内聚

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

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

用大白話告訴你什麼是低耦合|高内聚