什麼是耦合性和內聚性?

前言

如果你涉及軟件開發,可能會經常聽到“高內聚,低耦合”這種概念型詞語。我在第一次接觸這種詞語時,也抱有很大的疑問,但我發現百度上大部分都是高大上的詞彙解釋。

仔細通讀這篇文章,你就能理解耦合性和內聚性的概念與關係。

WHY?

Why?如果你使用過面向對象的編程語言,初學者很容易:

把所有代碼都寫到一個方法裏。

當我翻回到我曾經寫過的代碼後,我絕望了。

比如我們要獲取一個用戶的信息,我們需要先:

1. 在代碼中填寫數據庫的地址、用戶名、密碼、表名
2. 加載SQL驅動
3. 執行語句
4. 獲得結果

如果你只需要在一個方法裏調用用戶的信息,你可以把這四步的代碼全部寫到那個方法中。

但是如果我們有多個方法都要調用數據庫呢?

把這段語句寫四五六七八九遍?

不不不。不但你會抓耳撓腮,IDE都看不下去了。

如果我們新建一個方法,專門用於讀取用戶的信息呢?

在這個方法中,是上方執行語句的代碼,但不同的是,我們使用其它方法調用該查詢方法的時候,傳入查詢語句,這個方法就能返回給我們想要的值。

你只要將查詢代碼單獨寫成一個方法,當其它方法需要查詢的時候,只需要調用這個查詢方法並傳入想查詢的數據就可以了。

DO!

由於我不會用其它語言,所以這裏使用Java進行演示。

首先看下面這串代碼:

public class SimpleDemo {
    //由姓名獲取某個用戶的全部信息
    public void byName() {
        //1.創建驅動程序類對象
        Driver driver = new com.mysql.jdbc.Driver();
 
        //設置用戶名和密碼
        Properties props = new Properties();
        props.setProperty("user", "root");
        props.setProperty("password", "toor");
 
        //2.連接數據庫,返回連接對象
        Connection conn = driver.connect(url, props);
 
        String sql="select * from users where name = 'lilei'";
        Statement pstmt = conn.createStatement();
        ResultSet rs=pstmt.executeQuery(sql);
        
        System.out.println("結果爲:" + rs.next());
    }
    
    //由ID獲取某個用戶的全部信息
    public void byID() {
        //1.創建驅動程序類對象
        Driver driver = new com.mysql.jdbc.Driver();
 
        //設置用戶名和密碼
        Properties props = new Properties();
        props.setProperty("user", "root");
        props.setProperty("password", "toor");
 
        //2.連接數據庫,返回連接對象
        Connection conn = driver.connect(url, props);
 
        String sql="select * from users where id = 1";
        Statement pstmt = conn.createStatement();
        ResultSet rs=pstmt.executeQuery(sql);
 
        System.out.println("結果爲:" + rs.next());
    }
    
    //由年齡獲取某個用戶的全部信息
    public void byAge() {
        //1.創建驅動程序類對象
        Driver driver = new com.mysql.jdbc.Driver();
 
        //設置用戶名和密碼
        Properties props = new Properties();
        props.setProperty("user", "root");
        props.setProperty("password", "toor");
 
        //2.連接數據庫,返回連接對象
        Connection conn = driver.connect(url, props);
 
        String sql="select * from users where age = 18";
        Statement pstmt = conn.createStatement();
        ResultSet rs=pstmt.executeQuery(sql);
 
        System.out.println("結果爲:" + rs.next());
    }

}

我們使用用戶名、ID、年齡讀取了三次信息,你會發現一件事:

重複的代碼太多!

如果我們稍加修改:

public class SimpleDemo {
    //執行數據庫語句
    public ResultSet doSQL(String sql) {
        //1.創建驅動程序類對象
        Driver driver = new com.mysql.jdbc.Driver();
 
        //設置用戶名和密碼
        Properties props = new Properties();
        props.setProperty("user", "root");
        props.setProperty("password", "toor");
 
        //2.連接數據庫,返回連接對象
        Connection conn = driver.connect(url, props);
        Statement pstmt = conn.createStatement();
        ResultSet rs=pstmt.executeQuery(sql);
 
        return rs;
    }
 
    public void byName() {
        ResultSet rs = doSQL("select * from users where name = 'lilei'");
        System.out.println("結果爲:" + rs.next());
    }
 
    public void byID() {
        ResultSet rs = doSQL("select * from users where id = 1");
        System.out.println("結果爲:" + rs.next());
    }
 
    public void byAge() {
        ResultSet rs = doSQL("select * from users where age = 18");
        System.out.println("結果爲:" + rs.next());
    }

}

利用傳值,我們將大部分冗餘代碼進行了清理。
後語
概念

講了這麼多,你大概猜到耦合是什麼意思了:

將一串代碼模塊化(即封裝爲不同方法),每個模塊(方法)都有自己的功能。
封裝方法越多,耦合度越低。模塊與模塊之間接口的複雜程度和聯繫越複雜,
耦合度越高。

那麼內聚就是:

每個模塊(方法)相互分離的情況下,修改了某模塊(方法)其中的某些代碼,
但並不影響和其它模塊的通訊(即高內聚)。每個模塊儘可能獨立完成自己的功能,
不依賴於模塊外部的代碼。

總結

“高內聚,低耦合”是面向對象編程的基本原則,
我們能獲得更好的維護性和更佳的可讀性。

如轉載請在文章尾部添加:

 原作者來自AdlerED個人技術博客:https://www.stackoverflow.wiki/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章