内聚性(英语:Cohesion)也称为内聚力,是一软体度量,是指机能相关的程式组合成一模组的程度[1],或是各机能凝聚的状态或程度[2]。是结构化分析的重要概念之一。量测内聚性的方式很多,有些方法是由分析源代码,得到非量化的结果,有些方法则是检查源代码的文本特征,以得到内聚性的量化分数。内聚性是属于顺序式的量测量,一般会以“高内聚性”或“低内聚性”来表示。一般会希望程式的模组有高内聚性,因为高内聚性一般和许多理想的软体特性有关,包括鲁棒性可靠度可复用性英语reusability及易懂性(understandability)等特性,而低内聚性一般也代表不易维护、不易测试、不易复用以及难以理解。

耦合性(英语:Coupling)是一个和内聚性相对的概念。一般而言高内聚性代表低耦合性,反之亦然。内聚性是由赖瑞·康斯坦丁英语Larry Constantine所提出,是以实务上可减少维护及修改的“好”软体的特性为基础[3]

高内聚性

计算机科学中,内聚性是指机能相关的程式组合成一模组的程度。应用在物件导向程式设计中,若服务特定型别的方法在许多方面都很类似,则此型别即有高内聚性。在一个高内聚性的系统中,代码可读性及复用的可能性都会提高,程式虽然复杂,但可被管理。

以下的情形会降低程式的内聚性:

  • 许多机能封装在一型别内,可以借由方法供外界使用,但机能彼此类似之处不多。
  • 在方法中进行许多不同的机能,使用的是相关性低或不相关的资料。

低内聚性的缺点如下:

  • 增加理解模组的困难度。
  • 增加维护系统的困难度,因为一个逻辑修改会影响许多模组,而一个模组的修改会使得一些相关模组也要修改。
  • 增加模组复用困难度,因为大部份的应用程式无法复用一个由许多不一定相关的机能组成的模组。

内聚性的类型

内聚性是一种非量化的量测,可利用评量规准英语rubric (academic)来确认待确认源代码的内聚性的分类。内聚性的分类如下,由低到高排列:

偶然内聚性(Coincidental cohesion,最低)
偶然内聚性是指模组中的机能只是刚好放在一起,模组中各机能之间唯一的关系是其位在同一个模组中(例如:“工具”模组)。
逻辑内聚性(Logical cohesion)
逻辑内聚性是只要机能只要在逻辑上分为同一类,不论各机能的本质是否有很大差异,就将这些机能放在同一模组中(例如将所有的滑鼠和键盘都放在输入处理副程式中)。模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
时间性内聚性(Temporal cohesion)
时间性内聚性是指将相近时间点执行的程序,放在同一个模组中(例如在捕捉到一个异常后呼叫一函式,在函式中关闭已开启的档案、产生错误日志、并告知使用者)。
程序内聚性(Procedural cohesion)
程序内聚性是指依一组会依照固定顺序执行的程序放在同一个模组中(例如一个函式检查档案的权限,之后开启档案)。
联络内聚性/信息内聚/通信内聚(Communicational cohesion)
联络内聚性是指模组中的机能因为处理相同的资料或者指各处理使用相同的输入数据或者产生相同的输出数据,因此放在同一个模组中(例如一个模组中的许多机能都存取同一个记录)。
依序内聚性/顺序内聚(Sequential cohesion)
依序内聚性是指模组中的各机能彼此的输入及输出资料相关,一模组的输出资料是另一个模组的输入,类似工厂的生产线(例如一个模组先读取档案中的资料,之后再处理资料)。
功能内聚性(Functional cohesion,最高)
功能内聚性是指模组中的各机能是因为它们都对模组中单一明确定义的任务有贡献(例如XML字串的词法分析)。

赖瑞·康斯坦丁英语Larry Constantine爱德华·尤登史蒂夫·麦康奈尔英语Steve McConnell等人的研究[4]都提出偶然内聚性和逻辑内聚性是不好的,联络内聚性和依序内聚性是好的,而功能内聚性是最理想的状态。

相关条目

参考资料

  1. ^ Alan Hecht and Andy Simmons (1986) Integrating Automated Structured Analysis and Design with Ada Programming Support Environments页面存档备份,存于互联网档案馆) NASA 1986.
  2. ^ Taco Oosterkamp; 蔡焕麟. 設計可維護的應用程式. [2010-06-09]. (原始内容存档于2018-10-02) (中文). 
  3. ^ W. Stevens, G. Myers, L. Constantine, “Structured Design”, IBM Systems Journal, 13 (2), 115-139, 1974.
  4. ^ Code Complete 2nd Ed., p168-171

外部链接