OOP七大原则
开闭原则(Open-Closed Principle ,OCP)
定义:对拓展开放,对修改关闭
问题的由来:在软件的生命周期的,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧的代码引入错误。
解决办法:当软件需要发生变化的时候,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
为什么要遵循开闭原则
1、只要是面向对象的编程,在开发过程中都会强调开闭原则
2、是最基础的设计原则,其他五个设计原则都是开闭原则的具体形态
3、可以提高代码的复用性
4、可以提高代码的可维护性
单一职责原则(Single Responsibility Principle,SRP)
定义:如果一个类具有多个职责,应当将对象解耦,提高内聚,分别创建一些类去一 一完成这些职责,
核心:高内聚、低耦合。
优点:
1、降低类的功能复杂度
2、提高系统的可维护性
3、变更风险低
里氏替换原则(Liskov Substitution Principle ,LSP)
定义: 子类对象能够替代程序中父类对象出现的任何地方,并且保证原来的程序的逻辑行为不变及正确性不被破坏
里氏替换至少包含一下两个含义:
1、如果继承是为了实现代码重用,那么共享的父类方法就应该保持不变,不能被子类重新定义。子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。
2、如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化的,也就不存在子类替换父类实例的现象。
优点:可以大大减少程序的bug以及增强代码的可读性。
依赖倒置原则(Dependency Inversion Principle ,DIP)
定义:面向接口编程
本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。
接口隔离原则(Interface Segregation Principle, ISP)
定义:要用各个类建立他们需要的专用接口
它包含了2层意思:
接口的设计原则:接口的设计应该遵循最小接口原则,不要把用户使用不到的方法塞进同一个接口里。如果一个接口的有方法没有被用户使用到,则说明该接口已经臃肿了,应该将其分割成几个功能专一的接口。
接口的依赖(继承)原则:如果一个接口a继承另一个接口b,则接口a相当于继承了接口b的方法,那么接口a也应该遵循上述原则:不应该包含用户不使用的方法。 反之,则说明接口a被b给污染了,应该重新设计它们的关系。
迪米特法则(Law of Demeter ,LOD)
定义:只与直接朋友交谈,不与陌生人通信
直接朋友的定义:
1)当前对象本身(this)
2)以参量形式传入到当前对象方法中的对象
3)当前对象的实例变量
4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
5)当前对象所创建的对象
合成复用原则(Composite/Aggregate Reuse Principle ,CARP)
定义:尽量先使用组合或者内聚等关联关系来实现,其次才考虑使用继承来实现,因为java是单继承