2.6 高内聚 High Cohesion

基本上所有的技术书籍中,高内聚和低耦合都是前后紧挨着出现的,就像阴阳的两极一样,相生相克又相随。那高内聚指的到底是什么意思呢,从程序的设计角度来说的话,“内聚” 指的是 功能内聚,是对 元素职责相关性和功能集中程度的度量。如果一个元素内(类,模块,子系统)的行为职责都高度相关,而且没有加入与元素本身不相关的职责的话,那就可以大言不惭的说该元素在它职责范围内是高内聚的。人也是一样,如果一个人承担了过多不相关的工作,尤其原本不是他的活儿也要他干,工作量不大还好,工作量大了,换谁也会吃不消,不是不能做,而是不擅长,效率低。

 

现在车轱辘话又要来了,高内聚了自然就能达到低耦合的目标了,但是如果你读过上一篇文章的话,你就会明白,高内聚只不过是实现低耦合的一个手段罢了,低耦合可不单单只是功能上的低耦合,还有架构设计时的低耦合。由于内聚性非常低的元素干了太多与自己不相关的工作,或者需要完成太多的工作(虽然都是职责内的),缺点是显而易见的:

 

  • 难以理解
  • 难以维护
  • 难以复用
  • 脆弱不堪

 

上述的这些缺点都非常容易理解,如果我们打开一个 Human 类,但是 Human 类干了太多 Animal 类的活儿的话,你说恶心不恶心,怎么去复用它;又或者打开了一个 Human 类(功能都内聚),一个文件 1 万行代码,梳理代码逻辑就像二万五千里长征,别说程序员不看,就是机器也懒得把它翻译成 1 和 0 啊。面对这样的情况,你怎么理解它,怎么复用它,怎么维护它,别说它面对变化的脆弱不堪,换成是我维护这样的程序,我心理都能被它折磨脆弱了。

 

所以说,“高内聚”不是简单把什么功能都内聚,而是要有策略讲方法的,首先就是 “粒度”,一定是 “大粒度” 的功能内聚。不要啥头发丝一样细的功能也放进去,社会主义核心价值观我们天天都能在新闻中听到,这个时候就是它发挥作用的时候了:

 

  • 第一层面 国家层面 : 富强 民主 文明 和谐  
  • 第二层面 社会层面 : 自由 平等 公正 法治  
  • 第三层面 个人层面 : 爱国 敬业 诚信 友善

 

我们会发现一个问题,就是粒度不同,层面不同,我们分析和设计类的时候,也要分析它的核心价值是什么,也就是它对外提供的核心服务是什么?只要把这个问题搞清楚了,让它去体现自己的核心价值就行了,类中有核心的服务接口向外提供服务,然后类中只保留必要的辅助实现核心服务接口的功能函数即可。

 

与低耦合一样,在所有的设计决策期间,高内聚是要时刻高亮的原则,是一个需要不断考虑的原则。设计类的时候,我们只需要它做到:“爱国,敬业,诚信,友善” 就可以了,尤其要敬业当我们进行模块化设计的时候,就需要引入更多的社会化规则,以便让我们这些社会的螺丝钉都发挥应有的作用,模块(子系统)的设计目标是什么呢,模块化就是要将系统分解成一组高内聚,低耦合的系统构件。我不太清楚 “构件” 这个概念是从哪里来的,但是我对它特别熟悉,建筑行业里有这个名词,现在的建筑业越来越构件化,翻译成咱们的语言就是组件化。做模块整合的时候就要讲究:“自由 平等 公正 法治” 了,说成大白话呢,就是要定规则和规矩,让模块们(公司和组织们)都守规矩。有点跑题了啊,不过没关系,就当聊天了。我们开发系统不也一样吗,跟社会系统是一样的,系统都进行模块化,也会使用分层(社会也分层),每一层都有每一层的作用。我们做的这一切都为了最终的目标:“富强 民主 文明 和谐”,这愿景太高了,我们目前真的还达不到 ~ 这是高大上的表述方式,我更愿意用另一个说法来诠释 “富强 民主 文明 和谐” 的真正意图:“稳定压倒一切”。“稳定压倒一切” 不是一句贬义,而是所有社会形态目前都追求的一种理想,过去中国人口达到几千万就会出问题,现在 14亿都还健康运转,这不是一件简单的事儿,绝对牛X,我不做愤青好多年。 

 

跑题了,跑太偏了,至于如何达成 “高内聚” 而又不把内聚做滥的目标,就看你的本事了,反正记住一句话:不要什么事都想着自己做,诸葛亮事必躬亲,但最后是心力交瘁而亡,内聚的度一定要把握好,怎么把职责合理分配好绝对是门艺术,后面要说的纯虚构” ,“善用多态 会帮助我们更优雅的完成高内聚和低耦合的目标。