前言
如果你涉及软件开发,可能会经常听到“高内聚,低耦合”这种概念型词语。我在第一次接触这种词语时,也抱有很大的疑问,但我发现百度上大部分都是高大上的词汇解释。
仔细通读这篇文章,你就能理解耦合性和内聚性的概念与关系。
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());
}
}
利用传值,我们将大部分冗余代码进行了清理。
后语
概念
讲了这么多,你大概猜到耦合是什么意思了:
将一串代码模块化(即封装为不同方法),每个模块(方法)都有自己的功能。封装方法越多,耦合度越低。模块与模块之间接口的复杂程度,模块之间联系越复杂,耦合度越高。
那么内聚就是:
每个模块(方法)相互分离的情况下,修改了某模块(方法)其中的某些代码,但并不影响和其它模块的通讯(即高内聚)。每个模块尽可能独立完成自己的功能,不依赖于模块外部的代码。
总结
“高内聚,低耦合”
是面向对象编程的基本原则,我们能获得更好的维护性和更佳的可读性。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于