SOLID原则是一套坚实而有效的软件设计原则,它由Robert C. Martin(也称为 Uncle Bob)在2000年提出,旨在帮助软件开发者设计出高内聚低耦合的软件,构建易于测试、可维护和可扩展的软件系统,降低软件后期的维护成本。
SOLID由5个设计原则组成:
单一职责原则(Single Responsiblity Principle,SRP)
开闭原则(Open Close Principle,OCP)
里式替换原则(Liskov Substitution Principle,LSP)
接口隔离原则(Interface Segregation Principle,ISP)
依赖倒置原则(Dependency Inversion Principle,DIP)
单一职责原则
单一职责指的是一个类或一个方法只做一件事。如果一个类承担的职责过多,就等于把这些职责耦合在了一起,某一个职责的变化就可能抑制或者削弱该类完成其他职责的能力。
单一职责原则是康威定律(Conway’s law)的一个推论。后者由马尔文康威于1967提出:设计系统的架构受制于产生这些设计的组织的沟通结构。
开闭原则
软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。简单的来说,开闭原则强调可扩展性,即当我们增加新的功能时,最好是以扩展的方式进行,而不是打破现有设计,修改现有的代码。
里式替换原则
里氏替换原则通俗来讲,就是子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说,子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
推广开来,就是要求我们按照契约编程。明确接口的输入、输出或返回值满足契约的要求。
接口隔离原则
接口隔离原则要求下游模块对上游模块的依赖,应当建立在最小的接口集上。上游模块不应该暴露那些下游模块不需要的接口;否则,上游模块不相关的修改,也可能会影响到下游模块的运行。它体现了最小依赖原则。
依赖倒置原则
高层模块(High level modules)不应该依赖于低层模块(Low level modules),而应该依赖于抽象。
对于高层模块依赖于低层模块的场景,通过依赖注入(Dependency Injection)的方式实现依赖反转,让高层模块与低层模块共同依赖稳定的抽象接口。该抽象接口必须由高层模块定义,并明确输入与输出,而低层模块根据约束完成接口实现。