Luna Tech

Tutorials For Dummies.

SOLID Principles

2020-12-29


0. SOLID Design Principles

  1. Single Responsibility Principle 单一功能原则
  2. Open/Closed Principle 开闭原则
  3. Liskov Substitution Principle 里氏替换原则
  4. Interface Segregation Principle 接口隔离原则
  5. Dependency Inversion Principle 依赖反转原则

1. Single Responsibility Principle 单一功能原则

创建 Class, Method 的时候一定要考虑【有限责任】+【单一责任】,比如招人的时候要写清楚工作职责,在创建 Class 之前也要想清楚它是用来干嘛的。

这个原则很好理解,假如给某个员工安排了太多跨部门和杂乱的事情,可能这个员工的潜能就没法 100% 的发挥出来,如果员工离职了要再招个新人也很麻烦,所以最好是分清职责。

给 Class,Method 起一个准确的名字是成功的关键,假如你创建了一个名为 Employee 的 Class,这个 Class 里面就不应该包含无关的内容。

具体把责任细分到什么程度,就要看你的程序应用场景,一个小公司可能用 Employee 就够了,大公司则要细分为 HR,Developer,Sales….


2. Open/Closed Principle 开闭原则

这个规则分为两部分来看:

  1. Open for extension:容易加入扩展功能;
  2. Close for modification:原有代码尽量不改动;

比如我们下载了一个第三方的插件,这个插件的代码你是没法去改动的,但是好的插件可以允许你添加一些自定义的功能扩展。

在写程序的时候,巧用 Interface 就是一个很好的方法。假如你要写一个付款方式模块,付款方式包括微信支付,支付宝支付,京东支付等等,你最好是先创建一个 PaymentInterface,规定一些通用的 method,然后再根据不同的支付手段来写每个 class 的实现代码。


3. Liskov Substitution Principle 里氏替换原则

这个规则的意思是:假如用 child object 替换 parent object,程序应该能够继续跑起来。

假如 parent class 是一个长方形,child class 是一个正方形,那么用正方形去替代长方形应该得到一样的结果。

Or, in software engineering terms, you should be able to substitute a parent class with any of its child classes, without breaking the system.

Putting it more simply, implementations of the same interface should never give a different result.


4. Interface Segregation Principle 接口隔离原则

这个规则的意思是:你的代码不应该依赖于它不需要的模块,假如 A class 只跟 B class 里面的 x method 相关,那么 A class 就不应该依赖于 B class 的 y method。

怎么样确保这个规则可以实现呢?这跟第一条(单一责任)有点关系,假如你的 class, method 遵守了这个规则,只做一件事,那就更容易满足这个原则。

具体的实现方式,可以是利用 Interface 来进行接口隔离,而不是直接让一个 concrete class 依赖于另一个 concrete class。

好处在于,当我们修改某段代码的时候,只会影响到和它真正相关的那些代码。


5. Dependency Inversion Principle 依赖反转原则

这个规则的意思是:High-level 的模块不直接依赖于 low-level 的模块,两者都依赖于一个抽象的定义(比如 Interface 定义的接口,高层次使用接口,低层次实现接口)。

要点是,抽象的定义不应该依赖于低层次的具体实现,而是反过来让低层次的实现根据抽象的规定来完成(这就是反转的意思)。

它的好处在于通过定义接口来减少高层次和低层次模块之间的直接依赖。


结语

我个人的理解是:这 6 个设计原则可以用【模块化+制定抽象规则】来概括,当每个模块的功能单一,责任明确时,不同的模块之间就可以通过抽象的规则进行交互,模块之间没有直接的依赖关系,而是通过抽象的规则连接起来,更方便进行模块的升级、替换和测试。

参考文章

  1. https://adevait.com/software/solid-design-principles-the-guide-to-becoming-better-developers
  2. https://www.c-sharpcorner.com/UploadFile/damubetha/solid-principles-in-C-Sharp/
  3. https://scotch.io/bar-talk/s-o-l-i-d-the-first-five-principles-of-object-oriented-design#toc-single-responsibility-principle