引言:为什么 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