内聚详解-模块
内聚详解内聚(Cohesion)是衡量一个模块内部各元素之间联系紧密程度的指标。高内聚意味着模块内部的功能高度相关、职责单一明确,是优秀软件设计的重要特征。1.内聚的本质内聚描述的是一个模块(类、方法、组件)内部各个部分之间的关联强度。高内聚的模块专注于做一件事,并且做好这一件事。text低内聚 = 一个模块做很多不相关的事 高内聚 = 一个模块只做一件事,并且做得很好2.内聚的7个层次(从低到高)2.1 偶然内聚(Coincidental Cohesion)- 最低内聚模块中的元素之间毫无关联,只是因为某种偶然原因被放在一起。java// ❌ 偶然内聚:工具类里放了一堆不相关的方法 public class Utils { // 日期格式化 public static String formatDate(Date date) { ... } // 字符串加密 public static String encrypt(String str) { ... } // 发送邮件 public static void sendEmail(String to, String content) { ... } // 计算折扣 public static BigDecimal calculateDiscount(BigDecimal price) { ... } // 读取配置文件 public static String readConfig(String key) { ... } }问题:无法清晰描述类的职责,修改一个功能可能影响其他无关功能。改进:拆分成多个专门类。2.2 逻辑内聚(Logical Cohesion)多个元素通过参数选择执行不同逻辑,但在逻辑上属于同一类别。java// ❌ 逻辑内聚:通过类型参数决定行为 public class DataProcessor { public void process(String type, Object data) { if ("user".equals(type)) { // 处理用户数据 validateUser(data); saveUser(data); notifyUser(data); } else if ("order".equals(type)) { // 处理订单数据 validateOrder(data); calculatePrice(data); saveOrder(data); } else if ("product".equals(type)) { // 处理商品数据 validateProduct(data); updateInventory(data); saveProduct(data); } } private void validateUser(Object data) { ... } private void validateOrder(Object data) { ... } private void validateProduct(Object data) { ... } // ... 更多方法 }问题:方法庞大复杂,添加新类型需要修改现有代码,违反开闭原则。改进:使用策略模式或工厂模式。2.3 时间内聚(Temporal Cohesion)元素因在同一时间被执行而组合在一起。java// ❌ 时间内聚:初始化方法包含多个不相关的初始化 public class Application { public void initialize() { loadConfiguration(); // 加载配置 connectToDatabase(); // 连接数据库 initializeLogger(); // 初始化日志 startScheduler(); // 启动调度器 loadCacheData(); // 加载缓存 registerShutdownHook(); // 注册钩子 } private void loadConfiguration() { ... } private void connectToDatabase() { ... } // ... 其他初始化方法 }问题:虽然同时执行,但功能不相关,难以测试和维护。改进:分离到不同的初始化器。2.4 过程内聚(Procedural Cohesion)元素按执行顺序组合,但可能操作不同的数据。java// ❌ 过程内聚:按流程顺序组织 public class OrderProcessor { public void processOrder(Order order) { // 验证订单 validateOrder(order); // 扣减库存 deductInventory(order); // 计算价格 calculatePrice(order); // 创建支付 createPayment(order); // 发送通知 sendNotification(order); } // 这些方法操作不同的数据,只是按流程执行 }问题:方法内部耦合了多个不同职责的操作。改进:拆分到不同的服务类。2.5 通信内聚(Communicational Cohesion)元素操作同一数据或数据结构。java// ✅ 通信内聚:所有方法都操作订单数据 public class Order { private String orderId; private ListOrderItem items; private BigDecimal totalAmount; private OrderStatus status; public void addItem(Product product, int quantity) { // 添加商品并重新计算金额 items.add(new OrderItem(product, quantity)); recalculateTotal(); } public vo