当前位置: 首页 > news >正文

耦合详解-模块

耦合详解

耦合(Coupling)是衡量软件模块之间相互依赖程度的指标。低耦合是优秀软件设计的核心目标之一,它使系统更易于维护、测试和扩展。


1. 耦合的本质

耦合描述的是两个模块(类、组件、服务)之间的依赖关系强度。当修改一个模块时,需要修改其他模块的程度越高,耦合度就越高。

text

高耦合 = 牵一发而动全身 低耦合 = 独立变化,互不干扰

2. 耦合的7个层次(从高到低)

2.1 内容耦合(Content Coupling)- 最高耦合

一个模块直接访问或修改另一个模块的内部数据。

java

// ❌ 内容耦合 public class User { private String password; // 私有字段 // 没有提供getter/setter } public class LoginService { public boolean authenticate(User user) { // 直接访问私有字段(通过反射或语言特性绕过封装) // 这是最严重的耦合形式 return "123456".equals(user.password); } }

问题:破坏封装性,修改内部实现必然影响调用方。

2.2 公共耦合(Common Coupling)

多个模块共享同一个全局数据。

java

// ❌ 公共耦合 public class GlobalConfig { public static String DB_URL = "jdbc:mysql://localhost:3306/test"; public static String DB_USER = "root"; public static String DB_PASSWORD = "123456"; } public class UserRepository { public void save() { // 直接使用全局变量 Connection conn = DriverManager.getConnection( GlobalConfig.DB_URL, GlobalConfig.DB_USER, GlobalConfig.DB_PASSWORD ); } } public class OrderRepository { public void save() { // 同样依赖全局变量 Connection conn = DriverManager.getConnection( GlobalConfig.DB_URL, GlobalConfig.DB_USER, GlobalConfig.DB_PASSWORD ); } }

问题:全局变量变化影响所有使用它的模块,难以追踪和测试。

改进

java

// ✅ 通过依赖注入降低耦合 public class DatabaseConfig { private String url; private String username; private String password; // getters... } public class UserRepository { private final DatabaseConfig config; public UserRepository(DatabaseConfig config) { this.config = config; // 依赖注入 } }

2.3 控制耦合(Control Coupling)

一个模块通过传递控制信息(标志、开关)影响另一个模块的行为。

java

// ❌ 控制耦合 public class OrderService { public void processOrder(Order order, boolean isExpress, boolean needInvoice) { if (isExpress) { // 快递处理逻辑 } else { // 普通物流处理 } if (needInvoice) { // 开发票逻辑 } } } public class OrderController { public void createOrder(OrderRequest request) { orderService.processOrder(order, request.isExpress()
http://www.jsqmd.com/news/570170/

相关文章:

  • LeetCode 206. 反转链表 详细技术解析(迭代+递归双解法)
  • Web Serial API实战:5分钟为你的Vue/React前端项目添加串口设备控制面板
  • 瑞祥商联卡回收价格如何,回收揭晓正规平台 - 京回收小程序
  • DeepSeek-R1-Distill-Llama-8B服务化部署:基于MindIE的高并发推理方案
  • ai赋能node.js开发:让快马平台智能生成电商购物车业务逻辑代码
  • 别再只会做循迹小车了!用TCRT5000红外传感器DIY一个智能防溢垃圾桶(附Arduino代码)
  • Qwen3-ASR-1.7B惊艳效果:自动识别中英文技术文档朗读中的公式/代码块
  • 5个实用功能让你的Mac微信焕然一新:WeChatExtension插件完全指南
  • 从H2O到OmniH2O:人形机器人遥操作的技术哲学与工程实践
  • engine/sequence
  • 面试官:MySQL 乐观锁与悲观锁怎么实现?(修订版)
  • AI模型训练显存优化:从Stable Diffusion到LLaMA2的实战配置与调优
  • 魔兽争霸III终极优化指南:免费工具解决现代电脑兼容性问题
  • 京东E卡回收平台推荐,安全有保障! - 团团收购物卡回收
  • input-otp性能优化指南:避免布局偏移和提升用户体验的10个技巧
  • Wan2.2-I2V-A14B图像转视频实战:基于卷积神经网络的风格迁移与动态生成
  • Qwen3-14B部署避坑指南:显存/内存/CUDA驱动兼容性全排查
  • CloudFront + Lambda@Edge 实战:双函数架构实现失败请求记录与异步重放完整方案
  • 璀璨星河Starry Night部署教程:Python3.9+Diffusers环境完整配置
  • 文墨共鸣作品分享:中文食品标签‘零添加’‘无添加’‘不添加’语义等效性验证
  • PyTorch 3.0 DDP + torch.compile混合训练面试通关手册:涵盖Graph Break诊断、Shard策略冲突、以及3种反模式现场复现
  • 2026年西安有名的家装公司排行榜,西安芭宝整装装修公司排第几 - mypinpai
  • 卡牌设计革命:如何用CardEditor批量生成桌游卡牌效率提升300%
  • 豆包API+腾讯云COS实战:手把手教你打造智能图床(含完整代码)
  • 5分钟掌握B站视频下载:免费获取大会员4K高清内容的完整方案
  • Phi-4-mini-reasoning在C语言项目中的调用接口设计与实现
  • 遗传算法(GA)调参实战:以Scikit-learn模型为例,手把手教你自动化超参数搜索
  • 英雄联盟回放分析终极指南:ROFL-Player完整教程
  • 乙巳马年春联生成终端多场景落地:营销/教育/政务/文创四大应用矩阵
  • 解密Twitter风控参数:x-client-transaction-id的生成机制与逆向思考