模块的定义
模块是一个词汇上邻接的程序语句序列,由边界元素限制范围,有一个聚合标识符
什么是内聚,什么是耦合
内聚:模块内相互作用的程度 耦合:模块间相互作用的程度
内聚
偶然内聚 逻辑内聚 时间内聚 过程内聚 通信内聚 功能内聚 信息内聚
偶然内聚
定义:一个模块执行多个完全不相干的操作 缺点:
解决问题:将该模块划分为不同的模块,每个模块执行一个操作 列子
public interface Example {
public void write();
public void eat();
public void print();
public void fly();
}
逻辑内聚
定义:当一个模块进行一系列相关的操作,每个操作由调用模块选择时,该模块就具有逻辑内聚 缺点:
接口难以理解(newAction(接口1, 接口2, 接口3, 接口4.........)) 多个功能之间可能会相互纠缠,维护起来难度相当大(比如下个例子中,key1 && key2 执行打印功能,在后期维护中要改为 key2 || key5 && key6执行打印。而这个条件又和其他的功能相关联) 难以重用 解决问题:将该模块划分为不同的模块,每个模块执行一个操作 例子
public void example(boolean key1, boolean key2, boolean key3, ...., boolean keyn){
if (key1 && key2){
// 打印
}else if(key2 || key3 ) {
// 关机
}else if(keyn){
// 暂停
}
....
}
时间内聚
定义:当模块内部执行一系列与时间相关的操作时,该模块就具有时间内聚 缺点:
例子
public void example(){
turnOn();
loadFile();
readFile();
closeFile();
turnOff();
}
过程内聚
定义:当一个模块要执行一系列与产品要遵循的顺序有关的操作时,该模块就有过程内聚 缺点:
模块内部的操作之间关联弱(每个灯亮自己的,即使一个灯不亮了,也不影响其他灯亮) 无法重用(这个顺序只能使用于该产品) 例子
public void example(){
// 一个产品,如果出现故障,红绿黄灯依次亮起,
if(故障了){
turnOn("红");
turnOn("绿");
turnOn("黄");
}
}
通信内聚
定义:当模块要执行一系列与产品要遵循的顺序有关的操作时,并且所有操作都是在同一数据上进行,该模块就有通信内聚 缺点:
public void example(){
Duck duck = new duck();
// 以下的颜色设置必须按照这个顺序进行
duck.setBodyColor("white");
duck.setFootColor("yellow");
duck.setEyeColor("dark");
}
功能内聚
定义:只执行单一操作或只完成单一目标的模块具有功能内聚 优点:
信息内聚
定义:如果模块进行许多操作,每个都有各自的入口点,每个操作的代码相对独立,而且所有操作都在相同的数据结构上完成,则该模块具有信息内聚
// 每个操作可单独调用,即有各自的入口
// 每个操作相对独立
// 所有的操作都是在同一栈上进行的
public interface Stack {
public void initialize();
public void push();
public void pop();
public void destroy();
}
内容耦合
定义:一个模块直接操作或读取另一模块内的数据,则它们是内容耦合
公共耦合
控制耦合
定义:一个模块向另一个模块传递控制要素,则他们是控制耦合
标记耦合
定义:两个模块以数据结构作为传递要素,但数据结构中的成员并未全部使用,则它们是标记耦合
数据耦合
定义:两个模块的所有参数是同类数据项,则他们是数据耦合(即,标记传递的参数全部被使用了)