OO的设计原则
今天同事和我们一起讨论分享了OO的设计原则,讨论使人明晰,有人一起讨论学习是一件幸福的事情。
1.开闭原则
对功能的扩展是开放的,对修改是闭合的。
可以应用于类的设计,框架的设计等。
为什么?开闭原则有利于保护已有的客户端代码,让原有的代码不会因为框架的扩展修改而发生变动,减少维护的成本。
如果你设计的框架经常变动,而且每次变动使使用的人要改很多,那么没人敢用了。
2.单一职责原则
应用于实现类,如果类有变化,那么引起变化的原因仅有一个
为什么?如果你在设计类的时候,没有进行接口拆分设计,直接封装类的属性和接口,也无可厚非。
但如果你对属类归类,对行为划分归类,可以减少某些方法改变引起整个类改变的风险。提高可维护性。
但这样往往增加了设计的复杂性,在实际应用中常常很难做到。
例如一个user类,拆分成两个接口,一个是user的属性信息(类或接口),一个是user的方法信息(接口)
3 里氏替换原则
所有使用基类的地方都可以透明地使用子类进行替换。
子类可以扩展父类的功能,但不能改变父类原有的功能。
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
- 子类中可以增加自己特有的方法。
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
- 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
如果违反,可能会无意中使代码犯错。
4.依赖倒置原则
类的属性设计,成员变量不使用具体的类,而使用接口。
类方法的设计,方法参数使用接口或基类,不使用实现类。
这样面向抽象进行设计,减少了耦合性。
这里的依赖倒置原则,不是依赖注入(IOC)。
依赖注入是提供一种方法获取类所依赖的属性对象。譬如通过setter方法,通过构造器方法等。
把依赖注入到类中。这在spring中广泛使用。
总之,OO就是面向抽象编程(接口或抽象性),减少了类之间的耦合度。提高了复用性和可维护性。