软件设计的里氏替换原则与单一职责原则(读书笔记)

一、里氏替换原则

若对每个类型 T1 的对象 o1,都存在一个类型 T2 的对象 o2,使得在所有针对 T2 编写的程序 P 中,用 o1 替换 o2 后,程序 P 的行为功能不变,则 T1 是 T2 的子类型。

简单的阐述里氏替换原则 : 一个父类A,一个子类B继承自A类,在程序代码之中可以用子类B的对象引用去替换掉原本代码中的A类对象引用,并且程序不会出问题

要满足这个条件就需要子类A的约束要比父类B更宽松,比如父类B中一个函数访问修饰符为protected ,在子类A中就需要使用public来定义,不能使用private,因为 private 的访问控制比 protected 更严格

举一个例子 :

在这里插入图片描述
首先我们判断一个继承是否合理会使用 “IS A” 进行判断,如上图 :白马 IS A 马 ,小马驹 IS A 马 ,看起来没有问题。

让我们进一步探讨,在这个场景中,人能够骑马,我们使用白马来替代马没有问题,但是我们使用小马驹来替代马时就不行了,因为小马驹没长大还不能骑,这样使用小马驹继承马就违反了里氏替换原则。

一个类如果不是为了被继承而设计,那么最好就不要继承它。粗暴一点地说,如果不是抽象类或者接口,最好不要继承它。

二、单一职责原则

一个类,应该只有一个引起它变化的原因。也就是,一个类只有一个职责,如果职责过多,代码就会臃肿,可读性更差,也更难以维护。其实上单一职责原则和接口隔离原则有一定的关系,接口隔离以后,职责就单一了,实现这个接口的类的职责自然也就单一了。但是接口隔离关注的是抽象层,单一职责关注的是两者兼而有之,偏重于实现。

举一个例子 :

在这里插入图片描述
在上图中的Rectangle类中有draw(画图)和area(计算面积)两个方法,当我们需要进行正方型的面积计算的时候,需要依赖这个类,但是在这个类中又依赖了一个GUI包,让我们在不需要GUI功能的情况下把这个GUI包一起打包了,增加负担,这个类的设计就违反了单一职责原则。

在这里插入图片描述
我们将原来的Rectangle类进行拆分成两个类,一个类只有一个职责,这样的设计就满足了单一职责原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值