SOLID 原则基本概念:
程序设计领域, SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的重要组成部分。
- SRP(单一责任原则)
- OCP(开放-封闭原则)
- LSP(Liskov替换原则)
- DIP(依赖转置原则)
- ISP(接口聚合原则)
Single Responsibility Principle (单一责任原则)
单一责任原则认为对象应该仅具有一种单一功能的概念。
换句话说就是让一个类只做一种类型责任,当这个类需要承担其他类型的责任的时候,就需要分解这个类。单一责任原则可以看作是低耦合、高内聚在面向对象原则上的引申,将责任定义为引起变化的原因,以提高内聚性来减少引起变化的原因。责任过多,可能引起它变化的原因就越多,这将导致责任依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一责任,通常意味着单一的功能,因此不要为一个模块实 现过多的功能点,以保证实体只有一个引起它变化的原因。
Open Close Principle (开闭原则)
开闭原则(ocp) 认为“软件体应该是对于扩展开放的,但是对于修改封闭的”的概念。
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
Liskov Substitution Principle(里氏替换原则)
里氏替换原则认为“程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的”的概念。
简单来说,就是:
- 子类能覆盖父类
- 父类能出现的地方子类就能出现
这个原则也是我们写ADT需要重点注意的。
DIP 依赖倒置原则(The Dependency Inversion Principle)
依赖倒置原则认为一个方法应该遵从“依赖于抽象而不是一个实例” 的概念。依赖注入是该原则的一种实现方式,即
- 高层模块不应该依赖底层模块,两者都应该依赖其抽象。
- 抽象不应该依赖细节。
- 细节应该依赖抽象。
在Java语言中的表现就是:
- 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
- 接口或抽象类不依赖于实现类。
- 实现类依赖于接口或抽象类。
也就是说,我们要尽可能使用接口或抽象类。也就是“面向接口编程” 或者说 “面向抽象编程” ,也就是说程序中要尽可能使用抽象类或是接口。
Interface Segregation Principle(接口隔离原则)
接口隔离原则认为“多个特定客户端接口要好于一个宽泛用途的接口”的概念。
不能强迫用户去依赖那些他们不使用的接口,使用多个专门的接口比使用单一的总接口总要好,类似于单一职责原则,这里更关注接口。
原则主要强调两点:
-
接口尽量小。
就像前面说的那样,接口中只有实现类中有用的方法。
-
接口要高内聚
就是说,在接口内部实现的方法,不管怎么改,都不会影响到接口外的其他接口或是实现类,只能影响它自己。