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

如何理解高内聚、低耦合(附C#代码案例)

上一篇随笔提到了.NET常用的架构,其基本核心都是为了更好的完成高内聚、低耦合设计原则。便特意整理了此篇文章;下面我将讲解+反例+正例+C#实战代码,把这个知识点讲透,以便在日后的面试和工作中能直接回答和灵活使用。

一、搞懂:什么是高内聚、低耦合
1. 高内聚

  • 一个类、一个模块只专注干一件事,职责单一,内部功能紧密关联,不掺杂无关逻辑。
  • 简单说就是“自己的事自己干,不干别人的事”,比如订单类只处理订单业务,日志类只做日志记录,仓储类只负责数据读写,各司其职,不杂糅其他职责。
  • 核心目的:让模块内部逻辑紧凑,改动单一职责的代码,不会牵扯无关功能,代码可读性、可维护性更强。‘’

2. 低耦合

  • 模块与模块、类与类之间,依赖越少、关联越浅越好,尽量依赖抽象,不依赖具体实现。
  • 简单说就是修改一个类或模块,不会影响到其他模块,哪怕替换某个功能,也只需要改动局部代码,不用牵一发而动全身。
  • 核心目的:降低代码之间的关联性,方便扩展、替换、单元测试,提升代码的灵活性。

综上所述当面试官问“你怎么理解高内聚、低耦合”时,可以直接回答:

高内聚就是让单个模块/类职责单一,只需要做好一件事;低耦合就是减少模块之间的依赖,尽量依赖抽象而非具体实现。这两个原则结合起来,能让代码更易维护、易扩展、易测试,也是分层架构、面向对象设计的核心思想;
或者一句话总结:高内聚是对内管好自己,保证职责单一;低耦合是对外减少依赖,保证关联松散。

二、反面案例

点击查看代码
internal class Program
{//硬编码数据库连接字符串private readonly string _connectionString = "Server=.;Database=OrderDB;Trusted_Connection=True";static void Main(string[] args){Program program = new Program();program.CreateOrder("123",100);}/// <summary>/// 创建订单 打印日志 完成支付 /// </summary>/// <param name="orderNo"></param>/// <param name="amount"></param>public void CreateOrder(string orderNo, decimal amount){// 1. 直接写SQL数据访问逻辑(本该是DAL层的活)Console.WriteLine($"执行SQL:插入订单 {orderNo},金额:{amount}");// 2. 硬编码日志逻辑(本该是独立日志模块)Console.WriteLine($"日志:订单{orderNo}创建成功");// 3. 直接耦合支付逻辑(本该是独立服务)PayOrder(orderNo);}/// <summary>/// 支付方法,和订单业务耦合在一起/// </summary>private static void PayOrder(string orderNo){Console.WriteLine($"订单{orderNo}支付完成");}
}

上述代码案例在一个类包揽所有活,耦合度极高、内聚性极差,后期维护、扩展、测试都寸步难行。
问题实际分析:低内聚:一个类包揽订单业务、数据访问、日志记录、支付功能,职责混乱,完全违背单一职责。高耦合:硬编码数据库连接、直接依赖具体日志和支付逻辑,更换数据源、日志框架、支付方式,必须改动整个类。无法做单元测试,无法扩展,后期改一处代码,极易引发连锁bug。

三、正面案例
遵循单一职责,拆分模块,依赖抽象而非具体实现,实现高内聚、低耦合,贴合.NET分层架构思想。‘’

  1. 定义抽象接口(解耦核心)
    面向接口编程,依赖抽象,不依赖具体实现,方便后续替换功能。
点击查看订单仓储接口
    /// <summary>/// 订单仓储接口/// </summary>public interface IOrderRepository{/// <summary>/// 插入订单/// </summary>/// <param name="orderNo">订单号</param>/// <param name="amount">金额</param>public void InsertOrder(string orderNo, decimal amount);}
点击查看日志接口
/// <summary>
/// 日志接口
/// </summary>
public interface ILogger
{/// <summary>/// 写日志/// </summary>public void LogInfo(string message);
}
点击查看支付类接口
    /// <summary>/// 支付服务接口/// </summary>public interface IPayService{/// <summary>/// 支付/// </summary>/// <param name="orderNo">订单号</param>public void Pay(string orderNo);}
2. 实现具体类(高内聚,各司其职)

每个类只专注实现单一职责,互不干涉。

点击查看订单仓储实现
    /// <summary>/// 订单仓储实现:只负责数据读写(DAL层职责)/// </summary>public class OrderRepository : IOrderRepository{/// <summary>/// 插入订单/// </summary>/// <param name="orderNo">订单号</param>/// <param name="amount">金额</param>public void InsertOrder(string orderNo, decimal amount){//仅做数据访问,不掺杂业务逻辑Console.WriteLine($"EF执行SQL:插入订单 {orderNo},金额:{amount}");}}
点击查看日志实现
    /// <summary>/// 日志接口实现/// </summary>public class Logger : ILogger{/// <summary>/// 写入日志/// </summary>/// <param name="message">内容</param>public void LogInfo(string message){Console.WriteLine($"写入日志:{message}");}}
点击查看支付类接口实现
    /// <summary>/// 支付服务实现/// </summary>public class PayService: IPayService{/// <summary>/// 支付/// </summary>/// <param name="orderNo">订单号</param>public void Pay(string orderNo){Console.WriteLine($"订单{orderNo}支付成功");}}
  1. 业务逻辑层(依赖抽象,低耦合)
    订单服务只处理核心业务逻辑,通过构造函数注入依赖,不依赖具体实现类,彻底解耦。
点击查看订单业务服务
/// <summary>
/// 订单业务服务:只处理订单核心业务(BLL层职责)
/// </summary>
public class OrderService
{private readonly IOrderRepository _orderRepository;private readonly ILogger _logger;private readonly IPayService _payService;/// <summary>/// 依赖注入,面向接口编程,低耦合/// </summary>public OrderService(IOrderRepository orderRepository, ILogger logger, IPayService payService){_orderRepository = orderRepository;_logger = logger;_payService = payService;}/// <summary>/// 仅处理订单业务,相关业务只需执行相应模块方法,不掺杂其他无关逻辑/// </summary>public void CreateOrder(string orderNo, decimal amount){// 调用数据访问_orderRepository.InsertOrder(orderNo, amount);// 记录日志_logger.LogInfo($"订单{orderNo}创建完成");// 调用支付_payService.Pay(orderNo);}
}

四、总结
高内聚是对内管好自己,保证职责单一;低耦合是对外减少依赖,保证关联松散。
不管是三层架构、七层整洁架构,还是DDD、微服务,核心都是为了实现高内聚、低耦合,让代码更健壮、更易维护,这也是作为后端开发者必备的设计思维。

http://www.jsqmd.com/news/544975/

相关文章:

  • 如何快速掌握Windows系统权限管理:NSudo终极指南
  • Windows系统权限管理的终极解决方案:NSudo完全指南
  • 主管药师真题,哪家解析更通透? - 医考机构品牌测评专家
  • 告别PS!用WPS宏批量改图片尺寸的隐藏技巧(附JSA API避坑指南)
  • 终极AutoGen多智能体框架实战指南:5步构建企业级AI协作系统
  • GLM-OCR开发者实操手册:Gradio client调用+批量图片识别脚本示例
  • 2026年自动焊接机厂家推荐:上海锐巨机电设备有限公司,管管/管板/黄铜焊接机全系覆盖 - 品牌推荐官
  • Agent概念
  • 第一步:你只需要改这里的所有参数
  • 6.差分(快速区间 / 子矩阵更新)
  • 给黑帮写反侦测系统:他们在暗网给我立生祠
  • 多语言混合编程的架构实践与性能突围
  • GitHub Desktop终极中文汉化指南:3分钟实现全界面本地化
  • 2026年聚能管生产厂家推荐:盐城聚之能环保科技,V型/Π型/B型/C型聚能管全系解决方案 - 品牌推荐官
  • 【架构师老王】AI真的在“杀死”软件吗?从系统烟囱到Agent时代的非侵入式重构
  • ai全程护航:让快马智能助手帮你搞定proteus安装与初学难题
  • PowerBuilder老系统维护指南:PB12.5连接现代数据库(如MySQL 8.0)的避坑实操
  • 2026年Q355B工字钢/H型钢/镀锌工字钢厂家推荐:河南北岸金属材料全系钢材供应 - 品牌推荐官
  • Meshroom三维重建实战指南:从图像到模型的全流程解析
  • WarcraftHelper终极指南:5大核心功能让魔兽争霸3在现代系统完美运行
  • 抖音视频批量下载终极指南:4步快速掌握高效下载技巧
  • RAG技术
  • 告别B站千篇一律界面:BewlyBewly焕新定制方案提升浏览效率
  • OpenClaw 部署指南 (Linux)版本原始安装。
  • 如何通过Vial-QMK打造专属键盘体验:从入门到精通的个性化定制指南
  • MCP(Model Context Protocol):AI 应用的“USB-C 接口”
  • BDInfo:蓝光媒体技术解析的专业级引擎
  • 数据不出域,决策在边缘:2026年船舶专用边缘计算盒子推荐 - 品牌2026
  • TestDisk与PhotoRec技术架构深度解析:480+文件格式恢复机制与磁盘修复原理剖析
  • Windows风扇控制终极指南:用FanControl打造安静高效的电脑散热系统