良好的设计肯定要符合这个两个标准,各个组成部分(如类)的具有高内聚与低耦合的特性。
内聚
如果说一个类具有定义明确单一功能,并且这个类的一切对执行这个任务是必不可少的,那么这个类就具有内聚性。
内聚不只局限于类这个层面设计,再更低的层面比如类中的具体方法也要符合;再更高的层面如包、系统、子系统层面也要符合。
测试内聚性一个很好的方法:用简短的话语描述实体(类,方法,等)的功能,要求话语中不能带“和”,比如这个类的功能是(计算和存储)。
耦合
用于描述一个类对另外一个类的依赖程度。
如果一个系统间的组成部分相互依赖是最小时,这个系统的耦合性较低。当然耦合是不可能完全避免的,我们的目的是消除不必要的耦合,从而增加系统可维护性。
例子:
如果说A类已依赖了B类,可能有以下几种形式
- B类作为局部变量
- B类作为方法参数
- B类作为方法返回值类型
这种依赖可能会引起下面两个问题
- 如果A类的系统要重构时,不管是否还需要B类,都还要继续依赖
- 如果B类被修改了,A类依赖的地方可能也需要修改
假设有一个Persion类,类中有一个getBirthDate()方法,还有一个DriversLicense类,有一个isJuniorOperator()方法,用于判断是否是未成年人。
如果isJuniorOperator(Persion p)直接使用Persion类作为参数
boolean isJuniorOperator(Person p)
{
Date birthDate = p.getBirthDate();
// return true if birthDate is less than 18 years
// before today’s date
}
这种耦合方式,如果Persion类的getBirthDate()方法修改,则DriversLicense类可能也需要修改。建议直接使用Date类型作为参数来降低耦合。