模块的独立性可以由两个定性标准来衡量:内聚和耦合。
内聚:内聚描述一个模块内部各元素之间相互结合的紧密程度。
耦合:耦合描述不同模块彼此间相互依赖(连接)的紧密程度。
一个模块的内聚性越高,相对地,它和其他模块之间的耦合就会降低。
模块可以是函数也可以是类等等。
内聚有7种,由弱到强依次为
偶然内聚:模块内无法定义其不同功能的调用,一堆功能写在一起。
逻辑内聚:这种函数把几种相关的功能或数据组合在一起,每次被调用时,由传送函数参数来确定该函数应该完成哪些功能。(把 偶然内聚 的功能分开写到else if里)。
时间内聚:把需要同时执行的动作组合在一起形成的函数称为时间内聚函数。(一组不相关的变量在一起初始化,就是时间内聚的典型例子)
过程内聚:函数内的构件或操作之间的组合方式是,允许在调用前面的构件和操作之后,马上调用后面的构件和操作,即使两者之间没有数据进行传递。
(比如把对文件的操作写在一个函数内,首先要打开文件,然后对文件进行各种操作,最后关闭文件。这个函数就是过程内聚。)
(注意和顺序内聚区别)
通信内聚:指函数内所有处理元素都在同一个数据结构上操作,或者指各个处理使用相同的输入数据或者产生相同的输出数据。
顺序内聚:指一个函数中各个处理元素都密切关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入,即一个函数完成多个功能,这些功能必须顺序执行。(函数内的构建和操作有数据传递)
功能内聚:一个函数中各部分都是某一具体功能的必不可少的组成部分,不可分割。(一个模块只实现一个功能)
可以说除了功能内聚是一个模块只实现一个功能,其他的内聚都有可能实现多个功能。
耦合有7种,由弱到强依次为
非直接耦合:两个函数之间没有直接的关系,之间的联系完全是依靠其他函数的调用和控制来实现的。
数据耦合:一个函数访问另一个函数,彼此之间通过简单数据参数来交换输入、输出信息。
标记耦合:如一组函数通过参数表传递记录信息,就是标记耦合。这个记录是某一结构的子结构,不是简单变量。比如结构体。
控制耦合:一个函数通过传递开关、标志、名字等控制信息,明显控制和选择另一个函数的功能。
(这是因为被调用的函数是逻辑内聚,这是即使传的是简单数据,调用者和被调用的函数之间也是控制耦合)
外部耦合:一组函数都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数传递该全局变量的信息。
公共耦合:一组函数都访问同一公共数据环境。(这个环境是复杂数据,且不是通过参数传递)
内容耦合:应该函数直接修改另一个函数的数据,编写一个函数时一定要考虑另一个函数。两个内容耦合的函数几乎无法分离。
对于耦合:应尽量使用数据耦合,减少控制耦合,控制外部环境和公共耦合,杜绝内容耦合,降低接口的复杂度。