// 当你理解一个事物之前,描述他需要长篇大论,当你理解一个事物之后,表达他只想说三言两语 ——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觉悟还不够。
共同学习,写下你的评论
评论加载中...
作者其他优质文章