`
hnzhangshi
  • 浏览: 6155 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论

面向对象编程中的聚合与耦合

 
阅读更多
在面向对象的设计中,我们经常会听到或用到聚合、耦合的概念。面向对象的目标就是设计出高聚合、低耦合的程序。然而,究竟什么是聚合、什么是耦合,恐怕每个人都有自己的答案,换句话说,大多数人对聚合和耦合的概念是模糊的。小弟我今天就在此抛砖引玉,希望能给新入行的朋友和在校的学生一点帮助。
因为聚合与耦合这两个概念一直都是以"高聚合、低耦合"的形式出现的,刚刚开始接触面向对象设计时,我一直认为聚合和耦合是一对相反的概念,也就是说:只要做到了高聚合,那么自然而然就做到了低耦合。虽然这样的理解并不是错误的,但我并没有思考过原因。
先来看看聚合的定义:聚合(Cohesion)是一个模块内部各成分之间相关联程度的度量。
这里有多个含义值得考虑。首先,聚合是对一个模块内部的度量,这也是许多情况下我们把聚合称之为内聚的原因。第二,这里出现的模块是广义的模块,它可能是子系统,可能是功能模块,也可能是功能模块中的某一个类。从不同的层次看,聚合的程度也会有所不同。至于为什么不同,后面会有解释。第三,模块的成分包括模块的行为和状态。要做到高聚合,那么模块内部的行为必须要与模块的内部状态紧密关联。通俗来讲,一个模块仅完成一个独立的功能,模块内部不存在与该功能无关的操作或状态。
举一个生活中的例子。
有两座城市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所有的员工都要住在生产线上了。一味的追求高内聚,必然会造成模块的功能过于单一,而模块的数量出现急剧膨胀。所以,我们在设计和实现程序时必须要斟酌模块间的聚合和耦合程度,有兴趣的朋友也可以去研究聚合性指标与耦合性指标。

转载自:http://www.nowamagic.net/program/program_PolymerizationAndCoupling.php
分享到:
评论

相关推荐

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

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

    面向对象程序设计术语表

    封装是面向对象编程的一个核心原则,它隐藏了对象的内部状态,并通过定义的接口访问对象。封装保证了对象的内部表示对外部代码是不可见的,从而可以避免外部代码直接修改对象状态。 框架是一组可复用的类和对象,...

    戏说面向对象程序设计(C#版).pdf

    ### 面向对象程序设计(C#版)关键知识点总结 #### 一、面向对象思想的核心价值 **四大发明之活字印刷——面向对象思想的胜利** - **可维护性**:面向对象的设计使得程序更加易于维护。就像活字印刷中的每一个字符...

    面向对象分析与设计 (中文第三版)

    面向对象编程(Object-Oriented Programming, OOP)是一种软件开发方法,它使用“对象”来设计程序结构。对象是现实世界实体的抽象,包含了数据(属性)和行为(方法)。面向对象编程的主要特点包括封装、继承和多态。...

    面向对象设计理论

    面向对象设计理论是软件开发领域中的核心概念,它是一种基于现实世界中对象和它们之间交互的编程模型。这种设计方法论极大地提高了代码的可维护性、可扩展性和重用性。下面将详细阐述面向对象设计的基本概念、原则...

    面向对象与设计模式基础笔记

    **面向对象编程(Object-Oriented Programming, OOP)** 是一种编程范式,其核心思想是将现实世界中的事物抽象成类(Class),并通过类创建具体的对象(Object)。面向对象的三个主要特征为封装(Encapsulation)、...

    面向对象分析与设计电子教案

    面向对象编程(Object-Oriented Programming,OOP)的基础在于“对象”,每个对象都包含数据(属性)和操作这些数据的方法(行为)。在分析阶段,我们需要识别问题域中的实体并抽象为类,而在设计阶段,则需要考虑类...

    面向对象程序设计的61条经验(不看后悔)

    面向对象编程的核心概念包括类、对象、继承、封装、多态等。下面将根据提供的部分经验和知识点进行详细解析。 ### 面向对象程序设计的61条经验(不看后悔) #### (1)避免过早优化 在设计阶段,应该关注于清晰性...

    面向对象程序设计A.zip

    这个压缩包“面向对象程序设计A.zip”很可能是为了教授这些基本概念,可能包含了相关的示例代码、练习题或者教程文档,帮助学习者深入理解和应用面向对象编程。通过实践这些概念,开发者可以构建出更高效、可维护的...

    .Net 面向对象及设计模式总结

    《.Net 面向对象及设计模式总结》是一份深度涵盖.Net开发中面向对象编程原理和设计模式的宝贵资料,特别适合初学者巩固基础知识,以及有经验的开发者进行复习和提升。通过阅读这些笔记,我们可以深入理解面向对象的...

    61条面向对象设计的经验面试题

    面向对象设计(Object-Oriented Design,简称OOD)是软件工程中的一种重要设计方法,它以对象为中心,通过封装、继承和多态等机制来构建软件系统。在面试中,了解并能应用面向对象设计的经验原则是评估候选人技术...

    Java面向对象程序设计杨晓燕面向对象基本原则和模式PPT教案学习.pptx

    面向对象编程是Java的核心,它遵循一系列基本原则和设计模式,以确保代码的可维护性、扩展性和高效性。本教程“Java面向对象程序设计杨晓燕面向对象基本原则和模式”着重讲解了这些关键概念。 首先,UML(Unified ...

    面向对象课件

    1. **对象与类**:在面向对象编程中,类是对象的模板,定义了对象的数据属性和行为。对象则是类的实例,具有类所定义的特征和功能。创建类和对象是OOP的基础,通过类的定义,可以生成多个具有相同结构和行为的对象。...

    关于面向对象的名词解释

    1. **对象**:对象是面向对象编程中最基本的概念之一。它是现实世界中事物的抽象表示,由状态(数据成员)和行为(成员函数)组成。对象可以被认为是一种实体,这种实体具有特定的状态(属性值)和行为(功能)。...

    C#设计模式,C#面向对象程序设计(含源代码)

    本资源"《C#设计模式,C#面向对象程序设计(含源代码)》"提供了一次深入理解C#设计模式和面向对象编程的宝贵机会。它涵盖了23种经典的设计模式,每一种都有详细的实例解释,且源代码可编译通过,对于C#程序员来说,...

    面向对象与UML资料

    第二章 面向对象的分析与设计 18 第一节 面向对象方法概述 18 对象与面向对象 18 面向对象技术产生的原因 19 面向对象方法的基本思想 19 概念 19 面向对象技术的特点 19 面向对象语言及系统 19 第二节 面向对象的...

    UML面向对象分析与设计教程

    **UML(统一建模语言)面向对象分析与设计教程** UML,全称为Unified Modeling Language,是一种在软件工程领域广泛使用的标准化建模语言。它为面向对象的系统开发提供了图形化表示方法,用于捕捉、可视化、构造和...

Global site tag (gtag.js) - Google Analytics