面向对象基本原则
单一原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。
开闭原则(OCP):软件实体(类、模块、函数等)应该可以扩展,但是不可以修改。
在我们初次编写代码时,假设变化不会发生,当变化发生时,我们就创建抽象来隔离以后发送的同类变化。
面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。
开闭原则是面向对象设计的核心所在。遵循这个原则可以带来可维护、可扩展、可复用、灵活性等优势。开发人员应该仅对程序中呈现出的频繁变化的部分做出抽象。
demo:
我们需要一个类来做加法运算。客户端--->加法类
当我们需要增加减法时,我们就要修改原来的类,违背了OCP原则,所以抽象出运算类,客户端-->运算类(加法、减法、乘法等子类)。
依赖倒置原则(DIP):高层模块不应该依赖底层模块,两个都应该依赖抽象。抽象不应该依赖细节,但细节应该依赖抽象。
依赖倒置是面向对象设计的标志,编程时应该考虑如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或接口,那就是面向对象的设计。
demo:类A(人)直接依赖于类B(苹果),如果A修改了为依赖C(梨)则必须修改A代码,这样A是高层代码,负责复杂业务,B和C是底层模块。所以ABC3个类都需要抽象,抽象为People和Fruit2个抽象类。
demo:bufferContainer高层类依赖与ArrayBuffer和ElementArrayBuffer类,但应该使用他们的抽象类Buffer类,然后调用Buffer类的抽象方法。
里氏替换原则(LSP):子类型必须能够替换掉他们的父类型。
只有子类可以替换掉父类,软件单位的功能不受影响的时候,父类才能真正被复用,而子类也能在父类的基础上增加新的行为。
demo:现在父类 动物(跑)<---鸟(飞),现在有企鹅类不会飞,如果继承自鸟类,那企鹅就会飞的方法,那他去替换鸟类时肯定会出错,所以这里企鹅类应该继承到动物类,并现实自身的跑的方法。