前言
如果你涉及軟件開發,可能會經常聽到“高內聚,低耦合”這種概念型詞語。我在第一次接觸這種詞語時,也抱有很大的疑問,但我發現百度上大部分都是高大上的詞彙解釋。
仔細通讀這篇文章,你就能理解耦合性和內聚性的概念與關係。
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/