吐槽面向对象七大原则
1 开闭原则
对扩展开放,对修改关闭。
使用接口和继承的方式,实现可扩展,比如父类具有支付接口,一个子类使用微信支付实现支付接口,现在需要新增支付宝支付方式,则新建子类使用支付宝方式实现支付接口,这样既对微信类就没有修改又新增了支付宝支付方式,所以对修改关闭了,对扩展开放了。(吐槽:这还用说吗,不然接口用来干嘛?)
2 里氏替换原则
父类出现的所有地方都可以用子类替换。
1 子类必须实现父类的接口
2 子类可以持有自己特有的方法
3 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
4 当子类覆盖或实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格
里氏替换原则看起来只是为了让程序能够不出错。吐槽:但是父类修改方法时仍然可能引起大量子类需要修改,例如子类覆盖了父类的方法A,父类的方法A修改了,那么子类继承了方法A的地方可能也要修改。
3 依赖倒置原则
程序中依赖抽象或接口进行编程而不是具体实现类。这个很好理解,依赖抽象编程可以在实现类变化后不需要修改代码。(吐槽:但是也增加了阅读源码的难度,看代码不容易看出来具体调用的哪个实现类)
4 单一职责原则
职责A的修改不应该影响到职责B,就一个类而言,应该仅有一个引起它变化的原因。应该只有一个职责。
加入一个类有两个职责,而两个职责可能引用了类中公用的一个变量,那么职责A修改时,很可能修改到公用的变量,那么职责B也会受影响。所以最好一个类只有一个单一的职责。吐槽:但是实际上很多类也没有遵守单一职责原则,比如spring jpa 增删改查都在一个类里边,比如nio channel,读和写都在channel操作。
5 接口隔离
不同功能应该定义在不同接口上,避免实现不需要的接口。
6 组合聚合原则
尽量使用组合来实现代码复用而不是继承。继承比组合带来更大的代码耦合性,比如继承子类可以重写父类方法,而组合的话,不会重写父类的方法,只会通过接口引用父类方法。这其实和第二点里氏替换法则有关系,比如如果子类重写了父类的方法,那么当父类的这个方法改变时,子类可能也需要相应改变。但是组合的话由于仅仅是引用关系,需要改变的代码更少。
7 迪米特原则
设计一个类时尽量少地与其他类发生相互作用。降低耦合度。
优先将类设置为final,尽量降低一个类及其成员变量的访问权限。谨慎使用序列化。