耦合度

一、什么是耦合度

软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分摸块的一个准则就是高内聚低耦合。 耦合度(Coupling)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。 模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行。 内聚和耦合密切相关,同其它模块存在强耦合关系的模块常意味这弱内聚,强内聚常意味着弱耦合。

耦合度就是某模块(类)与其它模块(类)之间的关联、感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计

及编码质量评价的一个标准。耦合的强度依赖于以下几个因素:

(1)一个模块对另一个模块的调用;

(2)一个模块向另一个模块传递的数据量;

(3)一个模块施加到另一个模块的控制的多少;

(4)模块之间接口的复杂程度。

耦合按从强到弱的顺序可分为以下几种类型:

a)非直接耦合:两模块间没有直接关系,之间的联系完全是通过主模块的控制和调用来实现的   

b)数据耦合:一个模块访问另一模块,彼此间通过简单数据参数来交换输入、输出信息。这里的简单数据参数不同于控制参数、公共数据结构或外部变量。   

c)标记耦合:如一组模块通过参数表传递记录信息,就是标记耦合。这个记录是某一数据结构的子结构,不是简单变量。   

d)控制耦合:一个模块通过传递开关、标志、名字等控制信息,明显的控制选择另一模块的功能   

e)外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数传递该全局变量的信息   

f)公共耦合:一组模块都访问同一个公共数

据环境。该公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。   

g)内容耦合:一个模块直接修改另一个模块的数据,或直接转入另一个模块   

内聚度是指内部各元素之间联系的紧密程度,模块的内聚种类通常可分为7种,按其内聚度从低

到高的次序依此为:偶然内聚、逻辑内聚、瞬时内聚、过程内聚、通信内聚、顺序内聚、功能内聚。

二、为什么要低耦合

了解什么是耦合及耦合的分类后,我想大家对为什么要降低耦合度已经有一定的认识,并且多数开发人员也大概尝尽了高耦合带来的苦

头。道理很简单,耦合度很高的情况下,维护代码时修改一个地方会牵连到很多地方,如果修改时没有理清这些耦合关系,那么带来的后果

可能会是灾难性的,特别是对于需求变化较多以及多人协作开发维护的项目,修改一个地方会引起本来已经运行稳定的模块错误,严重时会

导致恶性循环,问题永远改不完,开发和测试都在各种问题之间奔波劳累,最后导致项目延期,用户满意度降低,成本也增加了,这对用户

和开发商影响都是很恶劣的,各种风险也就不言而喻了。

为了预防这些问题的发生,其中一个重要手段就是降低代码的耦合度。但也不可能有绝对的零耦合,比如基于J2EE编程那就必须和JDK

耦合,而且高耦合也不是一无是处,如果在设计前期预料到某功能后期基本不用修改,那么即使高耦合了也关系不大。但是,在还没有能力

设计出基本不用修改的代码前,还得要求以低耦合为标准。那么怎样才能最大限度地降低耦合度呢?下面介绍降低耦合度的几种方法。

三、降低耦合度的方法

1、少使用类的继承,多用接口隐藏实现的细节。 Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的。

2、模块的功能化分尽可能的单一,道理也很简单,功能单一的模块供其它模块调用的机会就少。(其实这是高内聚的一种说法,高内聚低

耦合一般同时出现,为了限制篇幅,我们将在以后的版期中讨论)。

3、遵循一个定义只在一个地方出现。

4、少使用全局变量。

5、类属性和方法的声明少用public,多用private关键字,

6、多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度。

7、尽量不用“硬编码”的方式写程序,同时也尽量避免直接用SQL语句操作数据库。

8、最后当然就是避免直接操作或调用其它模块或类(内容耦合);如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合,

限制公共耦合的范围,避免使用内容耦合。

内聚: 故名思议,表示内部间聚集、关联的长度,那么高内聚就是指要高度的聚集和关联。

高内聚:类与类之间的关系而定,高,意思是他们之间的关系要简单,明了,不要有很强的关系,不然,运行起来就会出问题。一个类的运行影响到其他的类。由于高内聚具备鲁棒性,可靠性,可重用性,可读性等优点,模块设计推荐采用高内聚。

这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低

“高内聚,低耦合”,首先要知道一个软件是由多个子程序组装而成,

而一个程序由多个模块(方法)构成!

“高内聚,低耦合”主要是阐述的面向对象系统中,各个类需要职责分离的思想。

每一个类完成特定的独立的功能,这个就是高内聚。耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展。

类之间的设置应该要低耦合,但是每个类应该要高内聚.耦合是类之间相互依赖的尺度.如果每个对象都有引用其它所有的对象,那么就有高耦合,这是不合乎要求的,因为在两个对象之间,潜在性地流动了太多信息.低耦合是合乎要求的:它意味着对象彼此之间更独立的工作.低耦合最小化了修改一个类而导致也要修改其它类的"连锁反应". 内聚是一个类中变量与方法连接强度的尺度.高内聚是值得要的,因为它意味着类可以更好地执行一项工作.低内聚是不好的,因为它表明类中的元素之间很少相关.成分之间相互有关联的模块是合乎要求的.每个方法也应该高内聚.大多数的方法只执行一个功能.不要在方法中添加'额外'的指令,这样会导致方法执行更多的函数.

推广开来说,这个思想并不限于类与类之间的关系。模块和模块,子系统之间也都要遵守这个原则,才可以设计出延展性比较强的系统。

软件设计之——高内聚低耦合相关推荐

  1. 软件设计之——“高内聚低耦合”

    耦合度 一.什么是耦合度 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 耦合度(Coupling)是对模块间关联程度的度量.耦合的强弱取决与模块间接口 ...

  2. python模块化设计耦合度_模块化开发——高内聚低耦合

    前言:emmm最近都在赶进度,已经好久没输出了,接下来都使用MakeDown文档写文,推荐大家使用VsCode编译工具,加入Markdown Preview Enhanced插件,创建一个MD文件,复 ...

  3. 耦合关系从强到弱顺序_软件设计要求—“高内聚低耦合”

    耦合度 一.什么是耦合度 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 耦合度(Coupling)是对模块间关联程度的度量.耦合的强弱取决与模块间接口 ...

  4. 软件开发及过程管理——理解高内聚-低耦合

    目录 一. 低耦合(Low Coupling) 二. 哪些是耦合 三. 高内聚-低耦合的作用 3.1 根据可能的变化设计软件 3.2 合理的职责划分 3.3 使用接口而不是继承 四. 设计模式专栏 一 ...

  5. 高内聚低耦合设计原则

    高内聚低耦合 高内聚低耦合是模块设计的基本原则.模块设计就像四世同堂居家过日子,妯娌婆媳吃大锅饭.柴米油盐不分你我很容易伤和气:如果亲兄弟明算账,每顿饭都AA又太显得生分,不利于和谐,因此把握好一个度 ...

  6. 8.18 模块设计原则:高内聚低耦合

    8.18 模块设计原则:高内聚低耦合 模块内聚 定义(软考) 块内联系:模块内各元素的关联.交互程度 从功能角度:自己的功能自己实现,不麻烦其它模块 如何实现高内聚 功能内聚:模块的功能尽可能单一 模 ...

  7. 浅谈面向对象开发原则:高内聚,低耦合

    软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低 ...

  8. 高内聚低耦合通俗理解_带你从入门到精通——「高内聚低耦合」

    如果这是第二次看到我的文章,欢迎订阅z哥的公号(跨界架构师)哦~ 本文长度为2871字,建议阅读8分钟. 坚持原创,每一篇都是用心之作- 下面的这个场景你可能会觉得很熟悉(Z哥我又要出演了): Z哥: ...

  9. 最简单理解高内聚低耦合

    低耦合: 耦合就是元素与元素之间的连接,感知和依赖量度.这里说的元素即是功能,对象,系统,子系统.模块. 例如:现在有方法A和方法B 我们在A元素去调用B元素,当B元素有问题或者不存在的时候,A元素就 ...

最新文章

  1. tcmalloc mysql 缓存_Tcmalloc优化Mysql内存管理
  2. [转]SQL 约束讲解
  3. C#——一个简单的文件管理器
  4. ELK之收集haproxy日志
  5. javaIO流实现文件拷贝
  6. Vue+百度地图api
  7. C28x FIR - Filter 示例汇编代码解读
  8. 计算机wifi共享怎么设置,电脑怎么共享wifi热点 电脑设置wifi热点教程
  9. html5做九九乘法表,利用JavaScript制作九九乘法表实例教程
  10. 邱跃鹏:互联网下半场,腾讯云要做信息能源发动机
  11. ansys安装注意事项
  12. 陆奇加入拼多多,担任技术委员会主席!
  13. 牛客HTML专项练习【错题+知识点辨析】(持续更新中)
  14. js数组的多条件筛选
  15. zabbix告警列队清理
  16. 软件测试工程师的简历项目经验该怎么写?
  17. 手机搜狐 html5,手机搜狐网计划改版,将利用HTML5技术
  18. 财务流程自动化?难点是什么?
  19. 计算机认知矫正发展史,计算机认知矫正疗法对儿童认知功能的影响.pdf
  20. mysql数据库 菜鸟_数据库-MySQL入门

热门文章

  1. 命令模式--把需求记录在案,让事务灵活可变(行为模式02)
  2. DDD部分应用之项目重构demo
  3. mysql数据库导出select数据到excel打开发现身份证后几位变成0解决办法
  4. maven三种打包方式详解
  5. [Elasticsearch] Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters
  6. 发现一个非常好用的RTC(实时音视频通信)方案,做直播和视频通话都很牛
  7. 湖北省专利申请指南,申请专利10大要点
  8. 你对本届学生会换届候选人有什么意见?请在下面留言
  9. git处理冲突三步曲
  10. Git 中的stash功能