单一职责原则——一个类应该只有一个改变的理由。如果你有一个单一的类,那么它可能有不止一个改变的理由。简单地定义你改变的一个原因,并且尽可能的细化。我建议从“大”开始。将三分之一的代码重构到另一个类中。一旦你有了它,然后重新开始你的新课程。直接从一个班级升到 20 个班级太令人生畏了。
开放/封闭原则- 一个类应该对扩展开放,但对更改关闭。在合理的情况下,将您的成员和方法标记为虚拟或抽象。每个项目本质上都应该相对较小,并为您提供一些基本功能或行为定义。但是,如果您稍后需要更改功能,您将能够添加代码,而不是更改代码以引入新的/不同的功能。
Liskov 替换原则- 一个类应该可以替换它的基类。在我看来,这里的关键是正确地继承。如果你有一个巨大的 case 语句,或者两页 if 语句检查对象的派生类型,那么你违反了这个原则,需要重新考虑你的方法。
接口隔离原则——在我看来,这个原则非常类似于单一职责原则。它仅适用于高级(或成熟)类/接口。在大型类中使用此原则的一种方法是让您的类实现一个空接口。接下来,将使用您的类的所有类型更改为接口的类型。这会破坏你的代码。但是,它将准确地指出你是如何消费你的课程的。如果您有三个实例,每个实例都使用自己的方法和属性子集,那么您现在知道需要三个不同的接口。每个接口都代表一组功能,以及改变的一个理由。
依赖倒置原则——父/子寓言让我明白了这一点。想想一个父类。它定义了行为,但不关心肮脏的细节。这是可靠的。然而,一个子类是关于细节的,不能依赖它,因为它经常变化。你总是想依赖父母,负责的班级,而不是相反。如果您有一个依赖于子类的父类,那么当您更改某些内容时会出现意外行为。在我看来,这与 SOA 的思维方式相同。服务合同定义了输入、输出和行为,没有任何细节。
当然,我的观点和理解可能不完整或错误。我建议向那些掌握了这些原则的人学习,比如鲍勃叔叔。对我来说,他的书《敏捷原则、模式和 C# 实践》是一个很好的起点。另一个很好的资源是Hanselminutes 上的 Bob 叔叔。
当然,正如Joel 和 Jeff 所指出的,这些是原则,而不是规则。它们将成为帮助指导你的工具,而不是土地的法律。
编辑:
我刚刚发现这些看起来非常有趣的SOLID 截屏视频。每一个大约是 10-15 分钟。