SOLID 原则与 C#

发布: (2026年3月7日 GMT+8 01:34)
5 分钟阅读
原文: Dev.to

Source: Dev.to

在软件开发中,SOLID 原则——由 Robert C. Martin 定义——是五条基本准则,帮助创建灵活、可读且易于维护的面向对象系统。在 C# 中,这些原则通常被用作类设计的规则。

单一职责原则 (SRP)

一个类应该只有一个职责,即只有一个导致它变化的原因。当一个类执行多个任务(例如,保存数据和生成报告)时,维护起来会更困难,且更容易出错。

// 错误示例:同时处理保存订单和打印发票
public class OrderManager
{
    public void SaveOrder(Order order) { /* save */ }
    public void PrintInvoice(Order order) { /* print */ }
}

// 正确示例:每个类只承担单一职责
public class OrderRepository
{
    public void Save(Order order) { /* save */ }
}

public class InvoicePrinter
{
    public void Print(Order order) { /* print */ }
}

开放/封闭原则 (OCP)

类应该 对扩展开放,但 对修改封闭。应当在不更改已有类代码的情况下添加新行为,通常通过使用抽象类或接口来实现。

// Wrong: Adding a new payment method requires modifying the class
public class PaymentService
{
    public void Pay(string type)
    {
        if (type == "CreditCard") { /* ... */ }
        else if (type == "PayPal") { /* ... */ }
    }
}

// Correct: Adding a new method requires creating a new class
public interface IPayment
{
    void Pay();
}

public class CreditCardPayment : IPayment
{
    public void Pay() { /* ... */ }
}

public class PayPalPayment : IPayment
{
    public void Pay() { /* ... */ }
}

里氏替换原则 (LSP)

派生类必须能够替代它们的基类。子类应当在任何期望基类的地方都能正常工作,且不能破坏基类的契约。

public abstract class Bird
{
    public abstract void Fly();
}

public class Sparrow : Bird
{
    public override void Fly() => Console.WriteLine("Sparrow is flying");
}

// 错误示例:企鹅不会飞,但被迫实现 Fly()
public class Penguin : Bird
{
    public override void Fly() => throw new NotImplementedException();
}

Penguin 类违反了 LSP,因为 Bird 抽象假设所有鸟都会飞。更好的设计是将会飞和不会飞的鸟分别抽象为不同的接口,例如 IFlyingBirdINonFlyingBird

接口分离原则 (ISP)

客户端不应被迫依赖它们不使用的接口。应优先使用小而专注的接口,而不是庞大、“臃肿”的接口。

// 错误:所有动物都被迫实现走、飞、游
public interface IAnimal
{
    void Walk();
    void Fly();
    void Swim();
}

// 正确:拆分为更小的接口
public interface IWalkable { void Walk(); }
public interface IFlyable { void Fly(); }
public interface ISwimmable { void Swim(); }

public class Dog : IWalkable, ISwimmable
{
    public void Walk() { /* ... */ }
    public void Swim() { /* ... */ }
}

依赖倒置原则 (DIP)

高层模块不应该依赖低层模块;两者都应该依赖抽象(接口或抽象类)。该原则是依赖注入的基础。

// Wrong: Service depends directly on a concrete logger
public class Service
{
    private readonly ConsoleLogger _logger = new ConsoleLogger();
}

// Correct: Service depends on an abstraction
public interface ILogger
{
    void Log(string msg);
}

public class ConsoleLogger : ILogger
{
    public void Log(string msg) => Console.WriteLine(msg);
}

public class Service
{
    private readonly ILogger _logger;
    public Service(ILogger logger) => _logger = logger;
}

应用 SOLID 的好处

  • 提高代码可读性和可维护性
  • 构建更能抵御变化的架构
  • 简化单元测试
  • 减少代码重复并提升可复用性

原则概述

  • SRP – 一个类应该只有一个职责。
  • OCP – 对扩展开放,对修改关闭。
  • LSP – 子类必须能够替代其基类。
  • ISP – 倾向使用小而专注的接口。
  • DIP – 依赖抽象,而非具体实现。
0 浏览
Back to Blog

相关文章

阅读更多 »

组织高效平台团队

引言:将平台工程视为技术学科是很诱人的。但实际上,它同样是一门组织学科。平台团队被要求……