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

推荐订阅源

IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
ThreatConnect
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
H
Help Net Security
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
A
Arctic Wolf
G
Google Developers Blog
量子位
U
Unit 42
I
InfoQ
V
V2EX
F
Fox-IT International blog
P
Privacy & Cybersecurity Law Blog
V
Visual Studio Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
C
CERT Recently Published Vulnerability Notes
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
The Hacker News
The Hacker News
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
月光博客
月光博客
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
C
Cisco Blogs
I
Intezer
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
Recorded Future
Recorded Future
T
Tenable Blog
W
WeLiveSecurity
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
T
The Blog of Author Tim Ferriss
www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
PCI Perspectives
PCI Perspectives

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 一个实例带你理解JavaBean WebFilter-SpringBoot过滤器注解实例讲解 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 实例带你学会简单的Java Thread多线程 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 一个实例理解Java Runnable多线程用处与用法 一个最简单的实例理解Semaphore在Java中的作用 从零开始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文件尾部多/少/缺字节解决方法 - 技术改变视野
大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野
adlered · 2019-12-09 · 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}

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

后语

概念

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

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

那么内聚就是:

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

总结

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