惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
量子位
博客园 - 聂微东
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
GbyAI
GbyAI
MyScale Blog
MyScale Blog
IT之家
IT之家
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
The Register - Security
The Register - Security
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
雷峰网
雷峰网
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
博客园 - 叶小钗
D
DataBreaches.Net
B
Blog
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
腾讯CDC
T
Threat Research - Cisco Blogs
SecWiki News
SecWiki News
Martin Fowler
Martin Fowler
D
Docker
Cisco Talos Blog
Cisco Talos Blog
T
Tenable Blog
Webroot Blog
Webroot Blog
宝玉的分享
宝玉的分享

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 实例带你学会简单的Java Thread多线程 - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野 Log-MySQL root用户登录后无法查看数据库全部表/正常访问数据库 Access denied for user 'root'@'localhost' to database - 技术改变视野 大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像 - 技术改变视野 Github仅保留指定文件/文件夹当前Commit,删除所有历史记录,清除「敏感信息」 - 技术改变视野 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 - 技术改变视野 Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法 - 技术改变视野 大白话之Java反射-初学最迷的概念:能干啥?咋用? - 技术改变视野 大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我! - 技术改变视野 大白话 | 课堂实践:使用Iterator对数组进行遍历 - 技术改变视野 大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用? - 技术改变视野 刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解! - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决? - 技术改变视野 随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用 - 技术改变视野 随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决 - 技术改变视野 大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率 - 技术改变视野 大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法 - 技术改变视野 大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解! - 技术改变视野 Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野
大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野
adlered · 2022-06-24 · via 技术改变视野

前言

如果你涉及软件开发,可能会经常听到“高内聚,低耦合”这种概念型词语。我在第一次接触这种词语时,也抱有很大的疑问,但我发现百度上大部分都是高大上的词汇解释。

仔细通读这篇文章,你就能理解耦合性和内聚性的概念与关系。

WHY?

Why?如果你使用过面向对象的编程语言,初学者很容易:

1把所有代码都写到一个方法里。

当我翻回到我曾经写过的代码后,我绝望了。

1比如我们要获取一个用户的信息,我们需要先:
21. 在代码中填写数据库的地址、用户名、密码、表名
32. 加载SQL驱动
43. 执行语句
54. 获得结果

如果你只需要在一个方法里调用用户的信息,你可以把这四步的代码全部写到那个方法中。

但是如果我们有多个方法都要调用数据库呢?

把这段语句写四五六七八九遍?

不不不。不但你会抓耳挠腮,IDE都看不下去了。

1如果我们新建一个方法,专门用于读取用户的信息呢?
2在这个方法中,是上方执行语句的代码,但不同的是,我们使用其它方法调用该查询方法的时候,传入查询语句,这个方法就能返回给我们想要的值。

你只要将查询代码单独写成一个方法,当其它方法需要查询的时候,只需要调用这个查询方法并传入想查询的数据就可以了。

DO!

由于我不会用其它语言,所以这里使用Java进行演示。

首先看下面这串代码:

 1public class SimpleDemo {
 2    //由姓名获取某个用户的全部信息
 3    public void byName() {
 4        //1.创建驱动程序类对象
 5        Driver driver = new com.mysql.jdbc.Driver();
 6
 7        //设置用户名和密码
 8        Properties props = new Properties();
 9        props.setProperty("user", "root");
10        props.setProperty("password", "toor");
11
12        //2.连接数据库,返回连接对象
13        Connection conn = driver.connect(url, props);
14
15        String sql="select * from users where name = 'lilei'";
16        Statement pstmt = conn.createStatement();
17        ResultSet rs=pstmt.executeQuery(sql);
18        
19        System.out.println("结果为:" + rs.next());
20    }
21    
22    //由ID获取某个用户的全部信息
23    public void byID() {
24        //1.创建驱动程序类对象
25        Driver driver = new com.mysql.jdbc.Driver();
26
27        //设置用户名和密码
28        Properties props = new Properties();
29        props.setProperty("user", "root");
30        props.setProperty("password", "toor");
31
32        //2.连接数据库,返回连接对象
33        Connection conn = driver.connect(url, props);
34
35        String sql="select * from users where id = 1";
36        Statement pstmt = conn.createStatement();
37        ResultSet rs=pstmt.executeQuery(sql);
38
39        System.out.println("结果为:" + rs.next());
40    }
41    
42    //由年龄获取某个用户的全部信息
43    public void byAge() {
44        //1.创建驱动程序类对象
45        Driver driver = new com.mysql.jdbc.Driver();
46
47        //设置用户名和密码
48        Properties props = new Properties();
49        props.setProperty("user", "root");
50        props.setProperty("password", "toor");
51
52        //2.连接数据库,返回连接对象
53        Connection conn = driver.connect(url, props);
54
55        String sql="select * from users where age = 18";
56        Statement pstmt = conn.createStatement();
57        ResultSet rs=pstmt.executeQuery(sql);
58
59        System.out.println("结果为:" + rs.next());
60    }
61}

我们使用用户名、ID、年龄读取了三次信息,你会发现一件事:

重复代码太多!

如果我们稍加修改:

 1public class SimpleDemo {
 2    //执行数据库语句
 3    public ResultSet doSQL(String sql) {
 4        //1.创建驱动程序类对象
 5        Driver driver = new com.mysql.jdbc.Driver();
 6
 7        //设置用户名和密码
 8        Properties props = new Properties();
 9        props.setProperty("user", "root");
10        props.setProperty("password", "toor");
11
12        //2.连接数据库,返回连接对象
13        Connection conn = driver.connect(url, props);
14        Statement pstmt = conn.createStatement();
15        ResultSet rs=pstmt.executeQuery(sql);
16
17        return rs;
18    }
19
20    public void byName() {
21        ResultSet rs = doSQL("select * from users where name = 'lilei'");
22        System.out.println("结果为:" + rs.next());
23    }
24
25    public void byID() {
26        ResultSet rs = doSQL("select * from users where id = 1");
27        System.out.println("结果为:" + rs.next());
28    }
29
30    public void byAge() {
31        ResultSet rs = doSQL("select * from users where age = 18");
32        System.out.println("结果为:" + rs.next());
33    }
34}

利用传值,我们将大部分冗余代码进行了清理。

后语

概念

讲了这么多,你大概猜到耦合是什么意思了:

将一串代码模块化(即封装为不同方法),每个模块(方法)都有自己的功能。封装方法越多耦合度越低模块模块之间接口的复杂程度,模块之间联系越复杂耦合度越高

那么内聚就是:

每个模块(方法)相互分离的情况下,修改了某模块(方法)其中的某些代码,但并不影响和其它模块的通讯(即高内聚)。每个模块尽可能独立完成自己的功能,不依赖于模块外部的代码。

总结

“高内聚,低耦合”是面向对象编程的基本原则,我们能获得更好的维护性和更佳的可读性。