链接:
偶然内聚(Coincidental Cohesion): 也称为“巧合内聚”,是模块内聚性的一种最低形式。在偶然内聚的模块中,各个元素之间几乎没有明显的逻辑关系或功能关联,它们只是被偶然地组合在一起。这种模块通常包含一些看似无关的功能或代码片段,仅仅是因为它们在某些情况下需要一起执行。
偶然内聚的特点:
1.缺乏逻辑联系:模块中的各个功能或代码片段之间没有明显的逻辑关系或功能关联。
2.低内聚度:由于模块内部的功能不相关,导致模块的内聚度非常低。
3.难以维护和扩展:模块内的功能杂乱无章,增加了理解和维护的难度,也不利于未来的扩展和重构。
偶然内聚的问题:
1.低可读性:由于模块内部的功能不相关,代码的可读性和可理解性较差,开发人员很难快速理解模块的作用。
2.高维护成本:当需要修改某个功能时,由于模块内部的功能不相关,开发人员可能需要仔细检查整个模块,以确保不会引入不必要的副作用。
3.脆弱性:由于模块内部的功能不相关,任何对模块的修改都可能导致其他不相关的部分出现问题,增加了系统的脆弱性。
4.难以重用:由于模块内部的功能不相关,很难将模块中的某个功能单独提取出来进行重用。
举例说明偶然内聚
假设我们正在开发一个简单的应用程序,其中有一个模块 MiscellaneousFunctions 被设计用来处理各种不同的任务,例如计算订单总价、发送电子邮件通知和生成随机数。
public class MiscellaneousFunctions
{
// 计算订单总价
public double calculateOrderTotal(double itemPrice, int quantity)
{
return itemPrice * quantity;
}
// 发送电子邮件通知
public void sendEmailNotification(String recipient, String message)
{
// 假设这里有一些发送邮件的逻辑
System.out.println("Sending email to " + recipient + ": " + message);
}
// 生成随机数
public int generateRandomNumber(int min, int max)
{
return (int)(Math.random() * (max - min + 1)) + min;
}
}
在这个例子中,MiscellaneousFunctions 类包含了三个完全不相关的功能:
- 计算订单总价
- 发送电子邮件通知
- 生成随机数
这些功能之间没有任何逻辑上的联系,仅仅是被偶然地组合在一个类中。这就是典型的偶然内聚,因为这些功能并没有共同的目标或主题。
改进方案:提高模块的内聚性
为了提高模块的内聚性,可以采用以下几种策略:
- 单一职责原则:每个模块应该只负责一个明确的任务或功能。
- 分离功能:将不相关的功能拆分到不同的模块中,使每个模块专注于特定的任务。
- 封装相关功能:将相关的功能封装在一起,形成高内聚的模块。
改进后的示例代码
我们可以将上述不相关的功能拆分成独立的模块,每个模块只负责一个明确的任务。
public class OrderProcessor
{
public double calculateOrderTotal(double itemPrice, int quantity)
{
return itemPrice * quantity;
}
}
// 邮件通知模块
public class EmailNotifier
{
public void sendEmailNotification(String recipient, String message)
{
// 假设这里有一些发送邮件的逻辑
System.out.println("Sending email to " + recipient + ": " + message);
}
}
// 随机数生成模块
public class RandomNumberGenerator
{
public int generateRandomNumber(int min, int max)
{
return (int)(Math.random() * (max - min + 1)) + min;
}
}
改进后的分析:
单一职责原则:
- 每个模块现在只负责一个明确的任务:
OrderProcessor 负责订单处理
EmailNotifier 负责发送邮件通知
RandomNumberGenerator 负责生成随机数
- 这符合单一职责原则,使得每个模块更加专注和清晰。
提高可读性和可维护性:
- 通过将不相关的功能拆分到不同的模块中,代码的可读性和可维护性得到了显著提升。
- 开发人员可以更容易地理解和修改每个模块的功能。
降低脆弱性:
- 由于每个模块只负责一个明确的任务,修改其中一个模块不会影响到其他模块,降低了系统的脆弱性。
便于重用:
- 现在每个模块都可以独立使用,便于在其他地方重用。例如,EmailNotifier 可以在其他需要发送邮件通知的地方直接使用,而不需要依赖于其他不相关的功能。