我也来通俗地讲一讲,说的不好请勿喷。

简单概括:耦合就是程序中的一部分跟其他部分之间的关系。解耦合就是把必要的耦合理顺,同时尽量减少不必要的耦合(这一句其实就是高内聚低耦合的通俗解释)。

如何看待耦合取决于你是从什么视角和层次看待一个程序。如果你正在关注的是一个函数或一个类的内部实现,这个粒度就很细。这个时候你关注的可能是如何把函数/类写的漂亮,让它在功能正确的同时又容易理解。你可以通过改善代码的排版、优化算法、将重复的操作封装为一个新的函数、给变量或函数取更有意义的名字等方法来改善它。

这些方法可以说都跟“高内聚低耦合”有关系。改善代码排版:让代码更有代码的样子,让人更容易看清每句代码的作用和意图。合适的名字:如果你给变量取个名字叫variable,从语意上讲它可以存储任意的值,它的模棱两可的名字让人难以分清它和其他代码的关系(与其他部分有了不必要的耦合),这就会让阅读代码的人茫然不知所措。让变量名字更有意义实际上是高内聚的一种体现,即这个变量你是想让它干嘛的,别人一眼就能看出来。提取函数就更不用说了。

如果你正在设计一个模块,你关注的可能是模块中的类和对象,也就是如何让模块中的类和对象之间的关系更加简单和清楚。四人帮的《设计模式》这本书主要就是讲这个的,其中的每一个模式都是想办法降低类和对象之间的耦合性。

那如果你正在设计一个系统呢,你可能就不关心其中的类了(至少一开始不应该关心),你应该将精力集中到这个系统可以分成几个模块、各个模块怎样组合到一起(术语称为“协作”)构成整个系统等问题上。如果你设计的模块还要去关注其他模块的实现细节,那你的系统就太失败了。

所以,不管你的角度如何,关注的层次高低,降低复杂度都是必要的。这就是耦合和解耦合的核心理念。

据说任何比喻都是蹩脚的,但我还是想举一个现实中极其高效与低耦合的例子,那就是军队。一个国家的军队少则数万人,多则数百万人,这么庞大的一个系统,它的效率却是惊人的高。为什么?简单来说这要归功于它的几个行事原则:

纪律严明,令行禁止

不会出现上级发出命令后找不到人执行,或找到人却不愿意做的尴尬情况(很内聚有木有)

命令不跨级

除非特殊情况,否则命令都是通过直接上级传达的,司令很少会单独找小兵做事(每一级在上一级看来都高内聚的,同时连长、班长、团长这些头头充当了本级的一个接口,上一级仅通过接口来向下级发命令)

有人说,如果司令直接找小兵给他做事不是比一级一级传达效率更高吗?no!为什么?原因有几条(注意看,都能跟我们编程时的道理联系上,所以说万物都是想通的)

司令发出的命令通常都是很大的任务,往往要跨越很多部队甚至兵种,如果让司令一个一个通知不是要累死?(高层抽象不应该直接与底层实现耦合)

如果允许任意的跨级下达命令,那就很有可能导致多个上级同时给一个士兵下达不同的命令,那这个士兵不是要累死?(导致系统状态不一致、或分布式系统的忙闲不一等情况)

士兵与直接上级之间的沟通通常是无障碍的,但跨级就难说了。哪个士兵擅长做什么事只有他的直接上级最清楚,跨级下达命令时可能会导致任务完成效率下降、甚至任务无法完成的后果(高层抽象往往难以驾驭底层细节,进而导致使用不当甚至误用)

职能划分明确

部队会按地域、时域、部门、兵种等来划分整个部队的职责,这样一层一层、一块一块地把整个部队分成职责明确的一个个小部分,各个部分相对独立又是一个有机整体,因此想不高效都很难啊。

java 耦合性_软件工程中的耦合性和解耦合性是什么意思?相关推荐

  1. 手机屏幕xy坐标软件_软件工程中的xy问题

    手机屏幕xy坐标软件 XY problem is classified as a communication problem in which the person who asks the ques ...

  2. 软件项目中的决策分析_软件工程中的决策管理

    软件项目中的决策分析 Every day we make a lot of decisions. I always wonder why, in so much companies, there is ...

  3. java 线程亲缘性_线程的调度、优先级和亲缘性

    每隔20ms左右,Windows要查看当前存在的所有线程内核对象.在这些对象中,只有某些对象被视为可以调度的对象.Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上 ...

  4. 怎样增加混凝土粘聚性_如何改善中低强度等级混凝土粘聚性? 这篇文章一定要看...

    原标题:如何改善中低强度等级混凝土粘聚性? 这篇文章一定要看 引言: 混凝土的工作性包含了流动性.粘聚性等多个指标,混凝土生产实践常常会中遇到中低强度等级混凝土粘聚性差的问题.常常表现为露石.浆石分离 ...

  5. 怎样增加混凝土粘聚性_如何改良中低强度等级混凝土粘聚性?看了这篇文章不用愁!...

    混凝土的工作性包含流动性.粘聚性等多个指标,混凝土生产实践常常会中遇到中低强度等级混凝土粘聚性差的问题.常常表现为露石.浆石分离,保水性差.有时在正常减水剂掺量时,混凝土无离析现象,但露石现象比较明显 ...

  6. 软件工程学完java后干_软件工程学习后的一些体会--------两周

    软件工程这门课在印象中就是一门理论课,因为以前没有接触过,想象中的场景是:老师打开ppt,然后照本宣科的开始念经.在第一节课上,作为见面礼,老师开场赠送的一波营养丰富的鸡汤确实很是鲜美,听后信誓旦旦的 ...

  7. 软件工程 c java的联系_软件工程—WC功能实现 (JAVA)

    软件工程-WC功能实现(JAVA) 项目要求 ​ wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某 ...

  8. java美元兑换_代码中的美元$

    这个题目其实有点标题党了,其实本篇文章主要内容应该是说"代码中的美元符号(dollar sign)".想总结一下我所看到的美元符号在代码中的起到的作用,当然了并不是说它作为格式化字 ...

  9. java 初始化系统参数_系统中参数的初始化 参数在系统中配置

    1.我们来看这个需求,例如:我们上传图片.上传附件 需要放在服务器上的一个目录上,该目录在不同的操作系统下是不同的.因为我们在写java代码的时候就不能写死. 这个时候我们就要用到系统参数.在界面上自 ...

最新文章

  1. RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)
  2. python3 将unicode转中文
  3. div盒子水平垂直居中的方法
  4. JSOI 2008 【魔兽地图】
  5. 推荐方法-1:UserCFItemCF
  6. 想搬去苏州生活了。。
  7. 关于BigDecimal.ROUND_HALF_EVEN银行家算法
  8. 用antv-G2实现雷达图
  9. Office Tips 3 - 如何设置电脑屏幕背景色为淡绿色
  10. 深度学习 卷积神经网络-Pytorch手写数字识别
  11. 计算机网络学习笔记(详尽版)
  12. java工程师待遇_Java程序员的薪资水平如何?
  13. 7-2 列出连通集 (25分)
  14. QML 信号与响应方法的总结
  15. 数据库中char和nchar的区别
  16. 千年服务器经验怎么修改,千年服务端加入江湖等级的脚本
  17. 电子日志 android、,eDiary电子日记本 3.0 beta2:新增天气对话框
  18. 2023年Mathorcup高校数学建模挑战赛ABCD题思路资料汇总贴
  19. 十个计算机函数,十个常用函数套路
  20. IFE斌斌学院-JS总结(2)

热门文章

  1. iOS备忘录之iOS目录位置
  2. 新手怎么入门人工智能(AI,深度学习,机器学习,神经网络)
  3. 小米智能家庭网关(一代)配置不成功(4d41)排查情况
  4. 地图与地理坐标可视化
  5. 非参数统计的Python实现—— Mann-Whitney 秩和检验
  6. php设置curl gzip,curl配置CURLOPT_ENCODING选项解压缩gzip文件响应
  7. php smtp 抄送,php带抄送和密件抄送的邮件发送方法_PHP教程
  8. W10安装Hyper-V
  9. python 爬虫-爬取学堂在线合作院校
  10. 如何压缩图片文件大小到20K,一招搞定