内聚与耦合
模块
模块是由一组语句组成,并且被标识符组成的边界元素所界定。类,方法都是可以称之为一个模块。
内聚与耦合
内聚是指一个模块内的交互程度,耦合是指模块间的交互程度。我们需要尽力做到高内聚低耦合。
内聚:
内聚分为如下几类:
1)偶然内聚:一个模块里各个成分之间没有什么关系,就是很随意的拼凑了在了一起,被封装成了一个模块。
例子:
Public void funA(){
If(a>b)
c = a – b;
System.out.prinltn(“今天天气真不错”);
}
缺点:1.可读性差(一会这个一会那个多乱呀)
2.可维护性差(这种一个功能干好多没关系的事情,维护是不可能维护的2333)
解决:
这个解决办法十分的简单,就是将那些不相关的成分,都分别拆解开来形成各自的模块,每个模块都只是执行一个任务。
2)逻辑内聚:几个逻辑上相关的功能被封装到同一个模块里面,然后由调用函数传入控制的参数来确定调用哪个功能。
缺点:1.接口不容易理解,因为传入控制参数至就会添加参数说明否则谁知道参数。
2.修改起来不好办,如果添加或者删除逻辑功能会麻烦。
3.增加耦合度
解决:把那几个逻辑相关的拆解成独立的模块。
3)时间内聚:如果一些功能仅仅是因为在同一时间执行,仅仅是由于时间关系就被封装到了一个模块。如一些初始化模块。
缺点:1.成分间的关系不强,但与其它模块相关度很高。
4)过程内聚:把一些列的过程行为放到一起形成一个模块。
例子:
缺点:模块复用性低,多个行为活动封装到一起,别的函数要是用到还要重新写,导致复用性差。
解决:还是拆开。
5)通信内聚:因为行为活动使用数据参数相同,所以就将他们封装到一个模块。
例子:
缺点:不可复用
6) 功能内聚:每个模块仅仅是完成一个行为互动,这也体现了单一职责。
例如:判断大小,计算加法
好处:1.复用性高
2.错误隔离
7)信息内聚:一个模块它可以执行很多的行为,但是每个行为都有自己入口,每个行为与其他行为独立,并且都在统一数据结构上执行。
耦合
1)内容耦合:一个模块不经调用直接引用另一个模块的内容。
例子:
缺点:这种耦合标明,一个模块与另一个模块联系十分紧密,如果另一个模块改变,这个模块必定收到很大影响,以至于无法正常使用。
解决:
2)公共耦合:多个模共同引用一个全局数据
缺点:全局变量修改会导致引用模块都收影响,不易于维护。
3)控制耦合:一个模块通过一个控制参数来控制另外一个模块,它与逻辑内聚有关系。
缺点: 1.模块见依赖不独立
2.复用性低
解决:取消控制参数,将B内不同活动拆解开,由A模块进行判断调用哪个模块,而非传递参数到B来判断执行哪个。
4)标记耦合:一个数据结构作为参数进行传递,但是被调用的模块只是使用了数据结构中的一部分内容。
例子:
缺点:1.被调用函数必须清楚参数的数据结构,并按照结构的要求进行操作数据,
2.难于理解
5)数据耦合:模块间传递基本数据类型或者是所有元素都被使用的数据结构进行调用。
缺点:没啥缺点
优点:可维护性高,没啥缺点233.
参考:https://blog.csdn.net/gpwner/article/details/53455217
中国大学MOOC软件工程课件