作为一个软件开发人员经常会接触一个词耦合,也经常有人给你灌输软件设计要高内聚低耦合的思想。
耦合性
耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。耦合程度的高低不影响已有功能,但影响未来拓展。
Java是一门面向对象编程语言大部分的初学者可能只知道两个类之间可以是继承与被继承的关系,可是事实上,类之间的关系大体上存在五种关系;
五种关联关系
继承(is->a):继承是面向对象编程的主要功能之一。 继承提供了一种机制,该机制允许一个类继承另一个类的属性。当一个类继承另一个类时,它将继承所有非私有成员,包括字段和方法。
继承
聚合(has-a):聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,被拥有的部分可以脱离整体独立存在。比如:汽车对象和轮胎对象,轮胎是汽车的构成部分,但可以脱离汽车单独存在,可以简单理解为:“没有生命的对象”,局部零件聚合成整体,局部可以脱离整体单独存在,是 has a 的关系,汽车有n个轮胎。
聚合(has-a)
关联(has-a):关联关系不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向的也可以是双向的;在Java中,关联关系的代码表现形式为一个类做为另一个类的属性类型存在。即语义上是“有”的关系:”has-a”。例如:B作为A的属性出现在了A中,就说A关联了B。
关联(has-a)
组合(contains-a):组合体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;组合在代码上和普通关联是一样的,只能从业务含义上区分,比如:大雁对象和翅膀对象,翅膀是大雁的组成部位,但无法脱离大雁这个个体单独存在,同样的,组合也可以简单理解为:“有生命的对象”,局部部位组合成整体,局部无法脱离整体单独存在;翅膀是大雁的一部分,不可分割的一部分。
组合
依赖:依赖关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
依赖
降低耦合度的方法
少使用类的继承,多用接口隐藏实现的细节; Java面向对象编程引入接口除了支持多态外, 隐藏实现细节也是其中一个目的;
模块的功能划分尽可能地单一;
遵循一个定义只在一个地方出现;
少使用全局变量;
类属性和方法的声明少用public,多用private关键字;
多用设计模式,比如采用MVC的设计模式就可以降低界面与业务逻辑的耦合度;
最后当然就是避免直接操作或调用其它模块或类(内容耦合);
如果模块间必须存在耦合,原则上尽量使用数据耦合,少用控制耦合;
限制公共耦合的范围,避免使用内容耦合;
内聚
内聚又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素联系得越紧密,则它的内聚性就越高。所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。