C#中的SOLID原则:理论与实践及代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 SOLID 是高质量 C# 代码的基础



在 .NET 生态系统中进行 C# 开发不仅需要掌握语法,还需要具备设计灵活、可维护且可测试应用程序的能力。SOLID 是 Robert Martin 提出的五个面向对象设计基本原则的首字母缩写。它们帮助开发者避免“硬性”依赖、代码重复以及扩展时的问题。



在本文中,我们将逐一解析 SOLID 五个原则在 C# 中的应用:从理论到实际的代码示例。您将了解如何通过遵循 SOLID 原则进行重构,使代码更清晰,项目维护更简单。



1. Single Responsibility Principle (SRP) — 单一职责原则



理论

一个类应该只有一个引起它变化的原因。换句话说,每个类只负责一项功能或业务逻辑。如果一个类承担了过多职责,就会变得难以测试、修改和复用。



实践:违反 SRP

public class OrderProcessor{    public void ProcessOrder(Order order)    {        // 1. 订单验证        if (order.Total <= 0) throw new Exception("Invalid order");                // 2. 保存到数据库        using var db = new AppDbContext();        db.Orders.Add(order);        db.SaveChanges();                // 3. 发送邮件通知        SmtpClient client = new SmtpClient();        client.Send("admin@shop.com", order.CustomerEmail, "Order confirmed", "Thank you!");    }}

这里的 OrderProcessor 违反了 SRP:它同时负责验证、数据库操作和邮件发送。修改通知发送逻辑就需要修改这个类本身。



遵循 SRP 的重构

public class OrderValidator{    public bool Validate(Order order) => order.Total > 0;}

public class OrderRepository{ public void Save(Order order) { using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges(); }}

public class EmailService{ public void SendConfirmation(string email) { SmtpClient client = new SmtpClient(); client.Send("admin@shop.com", email, "Order confirmed", "Thank you!"); }}

public class OrderProcessor{ private readonly OrderValidator _validator; private readonly OrderRepository _repository; private readonly EmailService _emailService;

public OrderProcessor(OrderValidator validator, OrderRepository repository, EmailService emailService) { _validator = validator; _repository = repository; _emailService = emailService; }

public void ProcessOrder(Order order) { if (!_validator.Validate(order)) throw new Exception("Invalid order"); _repository.Save(order); _emailService.SendConfirmation(order.CustomerEmail); }}

现在每个类只有一个职责范围。这简化了测试和修改。



2. Open/Closed Principle (OCP) — 开闭原则



理论

软件实体(类、模块、函数)应该对扩展开放,对修改关闭。也就是说,您应该能够在不修改现有代码的情况下添加新功能。



实践:违反 OCP

public class ShapeDrawer{    public void DrawShape(object shape)    {        if (shape is Circle circle)            Console.WriteLine($"Drawing circle with radius {circle.Radius}");        else if (shape is Rectangle rect)            Console.WriteLine($"Drawing rectangle {rect.Width}x{rect.Height}");        // 添加新图形类型时——需要修改此方法!    }}


通过抽象遵循 OCP 的重构

public abstract c                

博客

书籍推荐