为了账号安全,请及时绑定邮箱和手机立即绑定

剩下的两个原则——开闭和里氏替换

// 当你理解一个事物之前,描述他需要长篇大论,当你理解一个事物之后,表达他只想说三言两语 ——20181102
// 这句话以及上一句话前面加了注释符号,所以看不到

开闭原则

开闭原则的定义是:遵循开闭原则的模块应该具备如下两个主要特征,对修改关闭,对扩展开放。(The Open-Close Principle,简称 OCP)


其实我觉得这句话可以解读为:尽量去在原有的基础上做扩展,而不要修改原来的正确的代码,因为通常情况下原来的代码都是稳定运行很长一段时间的,如果不是特别必要的情况下(如原来的代码有逻辑错误不定期出现异常)就不要修改原来的代码,而是通过其他方式去扩展他。

他有两个好处

  • 可以扩展,灵活性高
  • 底层不可以关闭,保证原有的功能稳定

里氏替换原则

里氏替换原则的定义是:任何基类可以出现的地方,子类一定可以出现。(子类型必须能够替换它们的基类型)。
意思就是说当我们用派生类去替换他的基类时,程序运行一定不能有错误。

举个例子:
Circle是一个圆形类,其属性和接口如下

Circle{
  Pointxy center;
  float r;
  Circle(Pointxy point,float r);
  move(Pointxy newPoint);
}

Pointxy{
  int x;
  int y;
}

如果此时新建一个类Circle3d继承Circle,此时他继承了move方法,但是move方法对她来说是没有意义的。
因为确定一个3d位置必须要有三个维度坐标。他要移动到新的位置,只给x和y参数是无法定位到三维世界的。
图片描述
以下引用自百度百科

Liskov于1987年提出了一个关于继承的原则“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。

当两个类具有is-A的关系,就符合里氏替换原则
反过来也成立
当两个类符合里氏替换原则的时候,他们一定具备is-A的关系。
图片描述
所以后面要判断里氏替换原则的时候就去思考,两个类是否确实是is-A的关系。
常规情况下不需要太苛刻,但是也有苛刻的例子。因为历史替换原则中有一个字眼:任何。任何基类可以出现的地方,子类一定可以出现。

苛刻的情况

如我定义了一个矩形基类,用正方形类去派生,这个是否符合里氏替换原则?
大多数情况是可以这么认为,但是考虑如下函数

public boolean isRect(Rectangle rect){
  rect.setWidth(3);
  rect.setHeight(5);
  if(rect.size != 15){
    return false;
  }else{
    return true;
  }
}

一个边长是整数的正方形的面积是不可能是15的。但是在常规矩形里这就是正确的。
所以在比较严苛的环境下,里氏替换原则的考虑需要更严谨下,普通情况下我觉得适当考虑可以提高效率。
也可能是我的OOD觉悟还不够。

点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
2664
获赞与收藏
74

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消