0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

图解高内聚与低耦合

马哥Linux运维 来源:博客园-大道方圆 2023-03-08 17:25 次阅读

模块

模块就是从逻辑上将系统分解为更细微的部分, 分而治之, 复杂问题拆解为若干简单问题, 逐个解决.

耦合主要描述模块之间的关系, 内聚主要描述模块内部. 模块的粒度可大可小, 可以是函数, 类, 功能块等等.

耦合

模块之间存在依赖, 导致改动可能会互相影响, 关系越紧密, 耦合越强, 模块独立性越差.

比如模块A直接操作了模块B中数据, 则视为强耦合, 若A只是通过数据与模块B交互, 则视为弱耦合.

独立的模块便于扩展, 维护, 写单元测试, 如果模块之间重重依赖, 会极大降低开发效率.

1a42c608-a2f7-11ed-bfe3-dac502259ad0.gif

内聚

模块内部的元素, 关联性越强, 则内聚越高, 模块单一性更强. 一个模块应当尽可能独立完成某个功能,

如果有各种场景需要被引入到当前模块, 代码质量将变得非常脆弱, 这种情况建议拆分为多个模块.

低内聚的模块代码, 不管是维护, 扩展还是重构都相当麻烦, 难以下手.

1a580716-a2f7-11ed-bfe3-dac502259ad0.gif

接口设计原则

好的接口应当满足设计模式六大原则, 很多设计模式, 框架都是基于高内聚低耦合这个出发点的.

单一职责原则: 一个类只负责一个功能领域中的相应职责.

开闭原则: 一个软件实体应当对扩展开放,对修改关闭.

里氏代换原则: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.

依赖倒转原则: 抽象不应该依赖于细节, 细节应当依赖于抽象. 换言之, 要针对接口编程, 而不是针对实现编程.

接口隔离原则: 使用多个专门的接口, 而不使用单一的总接口, 即客户端不应该依赖那些它不需要的接口.

迪米特法则: 一个软件实体应当尽可能少地与其他实体发生相互作用, 例如外观模式, 对外暴露统一接口.

举几个栗子

外观模式

为系统中多个子系统提供一致的对外调用, 对客户端隐藏子系统细节, 降低其与子系统的耦合.

1a697604-a2f7-11ed-bfe3-dac502259ad0.png

桥接模式

JDBC中的把面向厂商的接口(Driver)和面向使用者的API(DriverManager)做了拆分隔离.

//开发者只需要关注JDBCAPI,无需关注不同数据库Driver接口实现
Class.forName("com.mysql.jdbc.Driver");
Connectionconn=DriverManager.getConnection(url,username,password);

1adf5914-a2f7-11ed-bfe3-dac502259ad0.png

适配器模式

引入第三方库(hibernate, log4j), 不应该直接在代码中继承或者使用其实体类.

需要抽出上层统一接口, 然后增加实现类, 对外暴露接口.

//代码与log4j强耦合,不推荐
org.apache.log4j.Logger.getRootLogger().info("info");
//底层可以随意更换log框架
FRLoggerFactory.getLogger().info("info");

1b097ec4-a2f7-11ed-bfe3-dac502259ad0.png

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2710

    浏览量

    47483
  • 耦合
    +关注

    关注

    13

    文章

    582

    浏览量

    100878
  • 接口
    +关注

    关注

    33

    文章

    8605

    浏览量

    151180
  • API
    API
    +关注

    关注

    2

    文章

    1501

    浏览量

    62029
  • 内聚
    +关注

    关注

    0

    文章

    2

    浏览量

    1324

原文标题:图解高内聚与低耦合

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    cpost的使用及原理解析

    嵌入式编程的需求千变万化,要做到系统稳定,又要代码可复用,就要做到耦合
    发表于 08-08 11:01 1271次阅读

    使用C语言实现耦合

    编程时,我们讲究的是耦合,在协同开发、代码移植、维护等环节都起到很重要的作用。
    发表于 09-21 11:33 1175次阅读

    如何实现代码的耦合

    大家在谈到面向对象编程的时候基本都是讨论软件的“耦合”的特点,这6个字也是算是成为了大部分评判代码质量的一个标准,所以很多小伙伴一
    发表于 10-13 08:57 1057次阅读

    浅析模块化编程思路

    好久没更新播客了,最新想写些自己的编程方面想法。也就是些自己的想法,不一定准确,在这希望能和大家分享下。相信大家在大学的时候都学过程序遵循的标准是“
    发表于 12-20 06:52

    如何去实现模块设计中的耦合

    耦合分别是什么意思?有何作用?如何去实现模块设计中的
    发表于 02-25 07:05

    怎么把硬件操作和APP软件耦合起来?

    你们写嵌入式都是怎么把硬件操作和APP软件耦合起来的,怎样达到耦合的效果
    发表于 11-06 07:57

    基于最优投影的半监督类算法

    (semi-su-pervised spectral clustering based on the optimal projection,SSOP)。该算法从高耦合
    发表于 01-14 11:54 0次下载

    宽带频率范围的定向和双向耦合

    MCLI在无源元件方面的专业知识还扩展到宽带频率范围的定向和双向耦合器,具有插入损耗、指向性和驻波比的特点。MCLI所有定向
    发表于 11-10 10:24 1058次阅读

    C语言中的耦合讲解

    编程时,我们讲究的是耦合,在协同开发、代码移植、维护等环节都起到很重要的作用。 一、原理篇而
    的头像 发表于 08-16 14:06 2327次阅读

    C语言--“耦合”编程思想

    1、定义耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否
    发表于 01-13 13:43 3次下载
    C语言--“<b class='flag-5'>高</b><b class='flag-5'>内</b><b class='flag-5'>聚</b>,<b class='flag-5'>低</b><b class='flag-5'>耦合</b>”编程思想

    很强大!耦合的MCU实用软件框架

    一个模块内部各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,也就是
    发表于 02-08 15:56 3次下载
    很强大!<b class='flag-5'>低</b><b class='flag-5'>耦合</b><b class='flag-5'>高</b><b class='flag-5'>内</b><b class='flag-5'>聚</b>的MCU实用软件框架

    手把手带小白做MODBUS通讯实验

    我们做程序库封装的基本要义是耦合, 而评价低耦合的终极体现则是使用实现过程的优雅程度。
    的头像 发表于 08-06 17:05 1604次阅读
    手把手带小白做MODBUS通讯实验

    电路耦合效应分析 耦合好还是

    电路耦合效应分析 耦合好还是好 电路耦合效应是指两个或更多电路之间存在的相互影响的现象。在电路中,一个信号的变化可能会引起另一个信号的
    的头像 发表于 09-22 12:47 4397次阅读

    编程如何做到耦合呢?

    耦合,是指模块之间尽可能的使其独立存在,模块之间不产生联系不可能,但模块与模块之间的接口应该尽量少而简单。
    的头像 发表于 12-06 09:20 1026次阅读

    Java 枚举与策略模式、函数式接口的结合:实现耦合的设计

    中,通常会使用枚举来定义业务上的一组常量,那除了简单地定义常量之外,我们如何利用枚举来实现耦合的设计呢?下面介绍下枚举和策略模式、
    的头像 发表于 11-21 14:06 212次阅读