现在的位置: 首页 > 综合 > 正文

有关“高内聚 低耦合”的疑问

2013年08月07日 ⁄ 综合 ⁄ 共 3204字 ⁄ 字号 评论关闭

        在软件开发过程中经常会见到“高内聚 低耦合”,以前读书的时候没什么在意,包括写代码从格式,到代码的复用,到更高级的内聚耦合考虑的都很不周到。在工作后参与开发后,才感觉到代码质量非常重要,对于我个人来说更是。对于内聚耦合的理解并不是很理解。查了一些资料,如下:

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

        内聚: 故名思议,表示内部间聚集、关联的长度,那么高内聚就是指要高度的聚集和关联。
       而耦合其实就是指外部间的联系程度。
      在程序设置中高内聚就是要程序模块内、类内要保持高度的联系,也就是属性间、方法间、属性方法间要高度紧密、不能脱离联系。要么方法中应该存在某些属性的参数,要么属性中要返回方法的结果,这样能够充分调用代码,减少代码的冗余。而耦合是指程序各个模块间要尽量保持距离,不能关联的太近,即使是“父亲与 儿子 ”(父类与子类),以及其它的扩展类,就好比是俗话中所讲的:“亲戚远了香,近了臭” 道理一样,关系过于亲密,暴露的缺点(心眼)也就越容易被人看到(呵呵,比喻有点远了   ),也就越容易产生矛盾;因此在程序设置中,类与类之间虽然存在继承的关系,但是继承的越多,那么子类和父类也就越像,父类变了,子类也就需要进行更改;我想谁也不想刚刚设计完毕的代码,随着一个类的更改去大动工程吧! 
    
       网络中也有很多关于“高内聚 低耦合”的文章,大家可以去浏览一下,这样您会体会的更加深刻,说多了也是纸上谈兵,不如大家在实际的开发中仔细体会!
       下面是网络中讲的不错的帖子,供大家参考!

(1)http://www.1000sun.com/blog/user1/eluo/archives/2006/1432.html

这是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低。
高内聚:类与类之间的关系而定,高,意思是他们之间的关系要简单,明了,不要有很强的关系,不然,运行起来就会出问题。一个类的运行影响到其他的类。

    低偶合:类内部的方法而言。把程序的功能尽量分散,别在一个类里只写一个或很好的方法,因为那样会给你的调试等带来很多问题。出了错你都不知道在什么地方。

    系统的各个模块尽可能具有较大的独立性,换句话说,希望这样设计软件结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单,以便能方便地把不同场合下写成的程序模块组合成软件系统。衡量模块独立性的定性标准是内聚(一个模块内各个元素彼此结合的紧密程度)和耦合(一个软件结构内不同模块之间互连程度的度量)。高内聚、低耦合的模块是设计时追求的目标。

直接影响:

如果程序在实现上没有把低耦合,高内聚作为其设计要求,那么你对程序功能上进行修改的时候,你要使用编辑器修改分散在各个源文件中的代码,再做编译与连接;由于处理多个源文件,很有可能,你不会一下子全部修改正确,你的改动还有可能导致新的错误,这样你还必须查找原因,浪费了时间。我想OO之所以引入类的封装机制,也是实现低耦合,高内聚的一种手段.Java中在内之外还有package,更好一层,高阶C++有namespace,都是为了这个目的。

对于软件维护人员:

对于软件维护来说,修改这样的无序代码无疑是一个噩梦,倘若代码维护者与原作者非同一人,他要理解代码实现的机制将要花费多大的精力,花几天时间查看几万行代码是对人的一种折磨,这仅是为了弄清楚几个月前那些程序员是如何实现xxx功能的,当然如果有相应的设计文档与注释,压力会减轻一点。我就经历过这种痛苦。但我想如果在源头进行控制,在各个阶段对方案评审会最大程度的避免出现诸如"一个功能实现分散在各个源文件"的情况。这又回到一个永恒的主题,如何将风险控制在早期而不是事后讨论。

(2)http://tieba.baidu.com/f?kz=434621288
“高内聚,低耦合”主要是阐述的面向对象系统中,各个类需要职责分离的思想。   
  每一个类完成特定的独立的功能,这个就是高内聚。耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展。   

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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

 

一.关联
对象之间交互的一种引用方式,关联的强弱不同分为一般关联(association),聚合(aggreagtion)和组合(composition)
在代码实现上,一般关联是通过方法应用另一个类。
public class Person{
private Computer computer;
public void setComputer(Computer computer){//在方法里引用
this.computer=computer;
}

}
聚合是在当前类的构造函数里引用另外一个类的功能
public class Person{
private Computer computer;
public Person(Computer computer){//在构造函数里引用,数据是共享的
this.computer=computer;
}

}
组合是在该类的构造函数里构造另外一个类
public class Person{
private Computer computer;
public Person(){
this.computer=newComputer();
/*在构造器内构造另一个类的实例.数据 computer是独占的,生命周期和 Person类实例一致
**/
}

}
概念上讲,聚合和组合都是比较强的关联,表达的都是整体与部分的关联关系,相对于普通的属性要强(属性分特征属性和关联属性,特征属性又分普通属性和推导属性什么是推导属性?如果有一个属性是birthday那么age就是推导属性,方便使用性能开销低),组合和聚合的区别在例子总也有了体现。另外,组合关联在数据库中级连删除。
与关联相似的一个概念是依赖, 依赖是所有关系中最脆弱的,不是作为属性存在,而是作为局部变量 如:class A{
void m(){
B
}
}意思是说只有用到方法m()的时候才与B发生关系,所以有一种偶然性。
依赖是单向的(------>),关联可以单向和双向(-)
关联只限于类和类对象和对象之间,依赖还可以表达组件之间,包之间,模块之间调用关系。
二.内聚
度量一个类独立完成某项工作的能力。
三.耦合
度量系统内或系统之间依赖关系的复杂性。类之间的依赖关系的复杂度。
设计原则:高内聚低耦合

抱歉!评论已关闭.