`
yeelor
  • 浏览: 416642 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]浅谈聚合与耦合

阅读更多
 在面向对象的设计中,我们经常会听到或用到聚合、耦合的概念。面向对象的目标就是设计出高聚合、低耦合的程序。然而,究竟什么是聚合、什么是耦合,恐怕每个人都有自己的答案,换句话说,大多数人对聚合和耦合的概念是模糊的。小弟我今天就在此抛砖引玉,希望能给新入行的朋友和在校的学生一点帮助。声明一下,本文是我个人对聚合与耦合的理解,部分内容摘抄于互联网,不当之处还肯请各位高手指正。

  因为聚合与耦合这两个概念一直都是以“高聚合、低耦合”的形式出现的,刚刚开始接触面向对象设计时,我一直认为聚合和耦合是一对相反的概念,也就是说:只要做到了高聚合,那么自然而然就做到了低耦合。虽然这样的理解并不是错误的,但我并没有思考过原因。

  先来看看聚合的定义:聚合(Cohesion)是一个模块内部各成分之间相关联程度的度量。

  这里有多个含义值得考虑。首先,聚合是对一个模块内部的度量,这也是许多情况下我们把聚合称之为内聚的原因。第二,这里出现的模块是广义的模块,它可能是子系统,可能是功能模块,也可能是功能模块中的某一个类。从不同的层次看,聚合的程度也会有所不同。至于为什么不同,后面会有解释。第三,模块的成分包括模块的行为和状态。要做到高聚合,那么模块内部的行为必须要与模块的内部状态紧密关联。通俗来讲,一个模块仅完成一个独立的功能,模块内部不存在与该功能无关的操作或状态。

  举一个生活中的例子(本例来源于《The Practical Guide to Structured Systems Design》)

  有两座城市Sidtown和Fredborough,连接两座城市的公路一天到晚总是拥堵不堪。经过“有关部门”调查之后发现,这两座城市中有两家公司Better Mousetrap和 Zokko Soda,Better Mousetrap的工厂建造在Sidtown,而该工厂的员工都居住在Fredborough,所以每天早上大批员工从Fredborough出发前往Sidtown,并在傍晚返回;类似的,Zokko Soda公司的运输车在每天的工作时间都需要在制瓶工厂和灌装工厂穿梭来往。

    

  很明显,如果Better Mousetrap的工厂和员工居住地都在同一城市,而Zokko Soda的两座工厂都建造在另一座城市,那么城市之间的交通状况将会明显改善。


  对比两图,上面两座城市间之所以出现交通的问题,是因为每座城市的“聚合性”都比较低:不相关的两个公司出现在了同一座城市,使得城市内部交通的利用率比较低,而城市之间的交通出现了超负荷。

  再来看看耦合的定义:耦合(Couping)是模块之间相关联程度的度量。相对于聚合的内向性,耦合关注的是某一模块和其他模块之间的关联性。其实从前面的例子里,我们已经不可避免的提到了耦合的问题:由于两座城市之间的相互联系过于紧密,导致了城市之间的交通拥堵。另外一个潜在的问题就是,如果其中一座城市内部的交通出现了问题,另一座城市也会受到影响。我们所追求的低耦合,就是将两个模块之间的关联尽可能的降低,一个模块发生变化对于其他模块的影响尽可能的小。

  再讲一个生活中的例子,相信大部分的80后小的时候都玩过一种掌上游戏机,这种游戏机内含一个俄罗斯方块的游戏。这种游戏机虽然风靡一时,但是不多久就渐渐淡出了市场,因为这种游戏机只有俄罗斯方块可以玩儿,当我们玩儿腻了的时候,这个游戏机也就如同废物一个了。



  同期,任天堂推出一款后来风靡了将近20年的红白机,这种游戏机市场寿命如此之长并非游戏机本身质量有多好,而是因为基于红白机开发的游戏层出不穷,经典无数。魂斗罗、超级玛丽在当时哪怕是现在也是无人不知。红白机的游戏本身并不存储在游戏机当中,每当有新游戏推出的时候,只需要购买新的卡带即可。正是这种游戏机和卡带相对独立的设计,使得游戏的设计厂商无需关心游戏机的实现细节,只要遵循游戏机提供的接口(插槽)。很多游戏的设计厂商也从红白机庞大的市场中分得一杯羹。大多数的玩家可能不知道,魂斗罗并非任天堂推出的产品,而是目前以《实况足球》系列闻名世界的KONAMI公司于1988年从街机移植到红白机上的。



  回到耦合的话题上来,因为早先的掌上游戏机将游戏本身内置在机器当中,游戏和机器这两个模块之间的关系过于紧密,所以游戏玩儿腻了,游戏机就没用了,游戏机出问题了,游戏也再也不能玩儿了。而红白机的游戏和游戏机之间的关系是相对独立的,只要它们都遵循制定好的协议,就可以独立的发展和变化。游戏卡带摔坏了,其他的游戏一样可以在机器上运行;自己的游戏机坏了,把卡带拿到朋友家的游戏机上也能玩儿。红白机发展到后期,连游戏机的手柄也是可插拔的,如果手柄坏了,也只需要更换手柄即可。

  讲到这里,大家对聚合和耦合应该也有了初步的认识。那么,我们如何看待聚合和耦合在实际当中的应用呢?我们的程序怎样才算是做到了高聚合和低耦合呢?

  前面曾经提到,从不同的层次看,聚合和耦合的程度也会有所不同。Sidtown和Fredborough的例子当中,从城市的层次来看,第二种设计完全达到了高内聚和低耦合的目标,然而,如果从城市的不同区域来看,这样的设计内聚性还不够。如果我们一直追究下去,恐怕Better Mousetrap所有的员工都要住在生产线上了。一味的追求高内聚,必然会造成模块的功能过于单一,而模块的数量出现急剧膨胀。所以,我们在设计和实现程序时必须要斟酌模块间的聚合和耦合程度,有兴趣的朋友也可以去研究聚合性指标与耦合性指标。


  • 大小: 23.1 KB
  • 大小: 67.8 KB
分享到:
评论

相关推荐

    博客《面向对象编程中的聚合与耦合》配套flash

    博客原址http://blog.csdn.net/tumiz/article/details/22224067 转载自http://www.nowamagic.net/program/program_PolymerizationAndCoupling.php

    行业文档-设计装置-基于数据转换的媒体内容聚合系统及聚合方法.zip

    《基于数据转换的媒体内容聚合系统及聚合方法》是一份深度探讨现代信息技术在媒体内容处理中的应用的专业文档。本文档主要关注的是如何通过数据转换技术实现高效、智能的媒体内容聚合,以满足用户对多样化、个性化...

    ES 聚合查询结果转换成相应的List对象

    ES 聚合查询结果转换成相应的对象集合,ES 聚合查询结果转换成相应的对象集合

    ChatGPT技术对话聚合与转换的方法与实践.docx

    ChatGPT 技术对话聚合与转换的方法与实践 ChatGPT 技术是基于开放域对话生成模型的最新技术,标志着自然语言处理领域的一个重要突破,为聊天机器人、智能客服等领域提供了更加高效和准确的解决方案。本文将探讨 ...

    聚合收缩和吸湿膨胀耦合作用下受损牙齿结构位移与应力场研究

    在聚合收缩与吸湿膨胀的耦合作用下,充填材料的刚度降低会导致界面应力增加和受损牙齿位移增大。长期作用和缓慢发展的情况下,这种损伤作用对牙齿充填材料的使用寿命产生不利影响。 文章还探讨了不同的吸水性(超...

    活性阳离子聚合与原子转移自由基聚合转换合成聚beta-蒎烯接枝共聚物

    活性阳离子聚合与原子转移自由基聚合转换合成聚beta-蒎烯接枝共聚物,李岸龙,梁晖,通过活性阳离子聚合与原子转移自由基聚合(ATRP)转换合成了beta-蒎烯与甲基丙烯酸甲酯(MMA)、丙烯酸丁酯(BA)、苯乙烯(St)的新型接...

    模拟技术中的浅谈基于频带聚合的LTE-Advanced系统设计方案

    类似于高速分组接入(HSPA) 系统与时分同步码分多址接入(TD-SCDMA)系统的关系,LTE-Advanced系统是LTE系统的平滑演进。因此如何在小幅度修改LTE协议的前提下,既完全兼容LTE遗留的终端,又能增加LTE-Advanced终端...

    yamamotocoupling山本耦合反应.pdf

    1. 氧化加成:镍(II)络合物(NiR2Lm)与有机卤化合物(RX)发生氧化加成反应,生成卤镍(II)络合物(LmNiX(RX))。 2. 不均衡反应:LmNiX(RX)经不均衡反应,生成 trans-Ni(II)中间体络合物。 3.还原消除:...

    旋转箭头聚合关系PPT模板.pptx

    旋转箭头聚合关系PPT模板

    华三交换机配置端口聚合之三层端口配置静态和动态聚合

    华三交换机配置端口聚合之三层端口配置静态和动态聚合 华三交换机配置端口聚合是一种常见的网络配置方式,通过将多个物理端口组合成一个逻辑端口,提高网络的可靠性和传输速度。在本文中,我们将详细介绍华三交换机...

    以太网交换机端口耦合

    以太网交换机端口耦合,也称为端口聚合或Link Aggregation,是一种网络技术,用于通过将多个物理端口组合成一个逻辑接口来提高带宽和提供链路冗余。这种技术常用于数据中心、企业网络和高性能计算环境中,以增加...

    maven聚合与继承配置

    本示例将深入探讨"Maven聚合与继承"的概念。 **一、Maven聚合(Aggregation)** Maven聚合允许我们将多个独立的Maven项目组织在一起,形成一个单一的构建单元。在我们的示例中,`parent`项目就是一个聚合项目。它...

    ThinkPHP聚合支付源码 聚合收银台系统源码

    《ThinkPHP聚合支付源码与聚合收银台系统解析》 在互联网支付领域,聚合支付系统扮演着重要的角色,它整合了多种支付渠道,为商家提供了便捷的收款方式。ThinkPHP作为一款广受欢迎的PHP开发框架,被广泛应用于构建...

    聚合物反应工程基础知识总结.pdf

    - 加成聚合:也称链式聚合,分为自由基聚合、阴离子聚合、阳离子聚合和配位聚合等。这类聚合反应在形成聚合物时,单体分子通过加成反应连续地串联起来。 - 缩合聚合:单体分子通过缩合反应,如脱水、脱醇或脱氨等...

    IP聚合及查询工具

    IP聚合工具实现起止IP段转IP/Mask格式,意味着它可以自动处理IP地址的范围,将其转换成CIDR表示法。这对于网络规划、IP资源分配和路由策略制定具有重要意义。例如,当需要为新用户分配IP地址时,通过聚合工具可以...

    MA5680T链路聚合

    ### MA5680T链路聚合知识点详解 #### 一、链路聚合技术概述 链路聚合(Link Aggregation)是一种将多个物理接口捆绑在一起作为一个逻辑接口的技术,旨在提高链路带宽、实现链路冗余。在企业级网络设备如华为MA5680...

    网络地址聚合算法

    网络地址聚合是将多个网络地址合并为一个更大的网络地址的技术,它主要用于路由优化,减少路由表中的条目数量,从而提高路由器转发数据包的效率。网络地址聚合在IP地址规划和路由协议中是非常重要的概念,特别是在...

    高德地图点聚合,点聚合点击事件,单点点击事件

    开发者首先需要注册并获取API key,这个key是与特定应用绑定的,用于验证请求的合法性,并且限制了请求的频率和范围。 "点击事件"是交互设计的重要部分,对于高德地图上的点聚合来说,这意味着用户可以通过点击聚合...

    网页直播聚合源码.zip_直播_网页 直播_网页直播聚合源码_聚合直播

    网页直播聚合源码是用于构建在线直播平台的关键技术,它整合了多个直播源,使得用户可以在一个网页上观看来自不同平台或频道的直播内容。这种技术对于那些希望创建个性化直播体验,或者想要集中管理多个直播流的...

Global site tag (gtag.js) - Google Analytics