设计原则SOLID
软件架构师的基本素养
在不改变接口的情况下实现添加功能;
组件设计折中选择复用性与可维护性;Nc
1、单一职责原则(SRP)
每个函数只做一件事情;
每个模块仅对一类行为主体负责类,对外只能提供一种功能,而引起类变化的原因应该只有一个。
主体:actor,一类人,有着相同的系统变更需求;
内聚:将对某类行为主体负责的代码绑定;
模块:一组内聚的函数、数据集合;仅对一类行为主体负责。
要求:
- 分离不同主体依赖的代码;
反例:
- 一个类中的是三个接口,被三个不同的主体调用;
- 负面影响:一个主体需求的变化,影响到另一个主体;(比如共用了底层接口)
常用措施:
- 数据与函数分离;负面影响:导致实例化类数量增加;
- 外观模式:使用一个类负责实例化所有相关对象;
2、开闭原则(OCP)
对象对扩展开放,对修改关闭,即扩展无需修改现有代码;
更改封闭拓展开放:通过子类继承父类,重写父类虚函数。
对类的改动是通过增加代码进行的,而不是修改现有的代码。
也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证它能一直运行下去。这需要借助于抽象和多态,即把可能变化的内容抽象出来,从而使抽象的部分是相对稳定的,而具体的实现则是可以改变的和扩展的。
3、里氏替换原则(LSP)
在任何父类出现的地方都可以用它的子类来替代,程序的行为不变。
即:同一个继承体系中的对象,应该有共同的行为特征。
反例
正方形不是矩形的子类;
4、接口隔离原则(ISP)
不应该强迫程序依赖他们不需要的方法,即 一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该把所有的操作都封装到一个接口中。
5、依赖倒置原则(依赖注入原则)(DIP)
要依赖于抽象,不要依赖于具体的实现。(接口比实现稳定)
即在应用程序中,所有的类如果使用或依赖于其他的类,则应该依赖于这些类的抽象类,而不是类的具体类。
为了实现这一原则,就要求我们在编程的时候针对抽象类或者接口编程,而不是针对具体的实现编程。