Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《架构整洁之道》第 9 章 LSP:里氏替换原则

《架构整洁之道》第 9 章 LSP:里氏替换原则

原创
作者头像
巴啦啦的积累
发布于 2023-05-25 05:50:55
发布于 2023-05-25 05:50:55
32100
代码可运行
举报
文章被收录于专栏:巴啦啦的积累巴啦啦的积累
运行总次数:0
代码可运行

均为原创,读架构整洁之道的笔记。

里氏替换原则:(LSP :Liskov Substitution Principle)。

使用一个父类对象,替换成该父类对象的子类对象后,该程序不会发生异常。(该书指的为接口,而没有提到继承关系)

或者说,调用一个Interface,切换成直接调用该接口的实现对象后,该程序不会发生异常。(该书中的表述为接口)

继承的使用指导

场景

Billing调用License,获取授权费用。License接口有两个实现类。这两个实现类中计算授权费用的规则不一样,但是业务是一样的。按照业务切换实现类,业务是可以正常进行的,不会破坏程序的正确性,不会发生异常。最关键的是这两个实现类,可以直接替换掉License接口。这样就是符合LSP原则的。

正方形/长方形问题

以下设计中,正方形/长方形问题,是一个著名的违反LSP的设计案例。

可以看到,User调用Rectangle为获得长方形的面积,可设置宽高。而正方形与长方形的设置宽高的逻辑并不一致,所以正方形错误的继承了Rectangle。如果使用Square,来替换掉Rectangle,就会发现错误。看下面的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Rectangle r = ... //当这里是长方形时Rectangle,这个断言自然能通过。但是
  //如果切换成正方形Square时,这个断言是通过不了的。
r.setW(5);
r.setH(2);
assert(r.area()==10);

即可以确认,子类型,并不能完全替代其父类,会发生逻辑上的问题。所以这是一个违反LSP的案例,正方形不该继承于或者说成为长方形的子类型。

要想防范这种LSP的行为,唯一的办法就是在User类中增加用于区分RectangleSquare的检测逻辑,如if语句,但是这就造成了强依赖,使用者强烈依赖被使用者。

LSP 与软件架构

可以看出,上述讲的是类和接口的继承与实现关系。然而随着时间推移,LSP演变成了一种更广泛的,指导接口与其实现方式的设计原则。

违反 LSP 的案例

书中举的是一个出租车调度服务程序,面向多个出租车公司,用户发出请求,由调度服务运算选择出租车公司中的某一辆车,但是其中有一家公司的调用方式,和其他公司不一样,所以很难做切换和统一。

面对系统要向多个第三方提供服务,接口设计应当在调用方式和存储上,统一格式,并能严格区分和识别流量。使其在切换调用第三方时,代码不用做改动。这里将第三方看作是可替换的组件。

本章小结

LSP可以且应该被用于软件架构层面,因为一旦违反了可替换性,该系统就不得不为此增添复杂的应对机制。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
设计模式—–里氏替换原则
开放封闭原则(Open Closed Principle)是构建可维护性和可重用性代码的基础。它强调设计良好的代码可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码。抽象(Abstraction)和多态(Polymorphism)是实现这一原则的主要机制,而继承(Inheritance)则是实现抽象和多态的主要方法。
对弈
2019/11/09
9970
深入理解LSP:里氏替换原则
程序最稳定的状态就是不改变或很少发生改变。模块如果经常发生变化,意味着 这个模块没有很好的分离关注点,做了很多不是自己的事情;单一职责让模块仅有一个变化的原因 也就是只让他负责他关注的事情,不是他关注的事情不负责,
北洋
2023/12/12
2770
软件架构设计原则之里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
Tom弹架构
2021/10/24
4880
软件架构设计原则--里氏替换原则
  里氏替换原则(Liskov Substitution Principle,LSP)是指,如果对每一个类型为T1的对象t1,都替换为类型为T2的对象t2,使得以T1定义的所有程序P在所有的对象t1都替换成t2时,程序P的行为没有发生变化,那么T2就是T1的子类型。   这个定义看上去比较抽象,我们重新理解一下。可以理解为一个软件实体如果适用于一个父类,那么一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类的对象能替换父类的对象,而程序逻辑不变。   根据这个理解,隐身含义为:子类可以扩展父类的功能,但不能改变父类原有的功能。
向着百万年薪努力的小赵
2022/12/02
3760
软件架构设计原则--里氏替换原则
设计模式-里氏替换原则
在上面的三块代码中,当调用SmartTest类的resize方法的时候,如果传入的是父类,那么将会可以的,如果传入的是子类,正方形,那么将会不可以的。
mySoul
2018/11/19
5350
软件工程设计原理里氏替换原则举例
里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计的基本原则之一,由Barbara Liskov提出。这个原则指出,如果类 S 是类 T 的子类型,则程序中使用 T 的对象的地方都可以不经修改地使用 S 的对象。换句话说,子类的对象应该能够替换掉它们的父类对象,而不影响程序的正确性。这个原则强调了继承关系中的行为兼容性,保证了基类和派生类之间的正确抽象和继承关系。
小马哥学JAVA
2024/03/27
1960
面向对象的设计原则-"里氏替换原则"
why(目的):为什么要学习"里式替换原则",我们都知道面向对象的三大特性:封装、继承、多态,该原则就是对良好的"继承关系"定义了一些规范,通过学习理解后可以写出更健壮、更具扩展性的程序;
别明天就今天吧
2020/09/08
9210
设计模式:面向对象的设计原则上(SRP、OCP、LSP)
面向对象的设计原则,我们最熟悉的就是 SOLID 原则,SOLID 原则是五个常用原则的首字母缩写,当然除了 SOLID 原则,还有一些其他的原则,所以后面就分为 SOLID 原则和其他原则两大块来介绍。
oec2003
2021/12/08
6090
设计模式:面向对象的设计原则上(SRP、OCP、LSP)
白话解说,半分钟就懂---里氏替换原则
A type hierarchy is composed of subtypes and supertypes. The intuitive idea of a subtype is one whose objects provide all the behavior of objects of another type (the supertype) plus something extra.What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
瑞新
2020/07/07
4630
让里氏替换原则为你效力
从事软件开发的朋友或多或少都听过以下一些原则:比如KiSS、DRY、LKP、COC、DbC、SoC、HP、SOLID等。这些原则已经在业界被证实了自身的价值,尤其当谈到面向对象设计的时候,SOLID则是一个避不开的主题。
袁慎建@ThoughtWorks
2018/12/26
1.2K0
【设计模式】软件设计七大原则 ( 里氏替换原则 | 代码示例 | 类示例 | 方法入参示例 | 方法返回值示例 )
子类的行为 要和 父类 保持一致 , 如果无法达到这一点 , 就无法遵守里氏替换原则 ;
韩曙亮
2023/03/29
3630
【设计模式】软件设计七大原则 ( 里氏替换原则 | 代码示例 | 类示例 | 方法入参示例 | 方法返回值示例 )
里氏替换原则(LSP)
里氏替换原则(英文名为Liskov substitution principle,简称LSP)是由Barbara Liskov在1988年提出的,在Robert C. Martin提出的SOLID软件设计原则中的第三个字母L。
河边一枝柳
2022/06/21
7150
里氏替换原则(LSP)
开发那么久,才知道的 SOLID 设计原则
无论是软件系统设计,还是代码实现,遵循有效和明确的设计原则,都利于系统软件灵活可靠,安全快速的落地,更重要的是能灵活地应对需求,简化系统扩展和维护,避免无效的加班。本文主要讨论面向对象软件开发中最流行的设计原则- SOLID,它是五个设计原则为了方便记忆而组成的首字母缩写:
闻人的技术博客
2020/07/01
8370
面向对象设计必须遵循的几条原则
我们应该采用何种方法去应对需求变化呢?首先,在方法论层面我们应该采用敏捷开发;其次,在代码层面,使用OOD(Object-Oriented Design,面向对象设计),它的根本原则:面向接口编程;多用组合,而不是继承;发现变化,封装变化。但如何让设计满足这个原则呢?我们的先辈们总结出了5条设计原则,俗称SOLID原则,这就是本期我们要介绍的详细内容。
木可大大
2018/07/25
4570
设计原则:面向对象设计原则详解
我们在应用程序开发中,一般要求尽量两做到可维护性和可复用性。 应用程序的复用可以提高应用程序的开发效率和质量,节约开发成本,恰当的复用还可以改善系统的可维护性。而在面向对象的设计里面,可维护性复用都是以面向对象设计原则为基础的,这些设计原则首先都是复用的原则。遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。 面向对象设计原则和设计模式也是对系统进行合理重构的指导方针。
黄规速
2022/04/14
2.7K0
设计原则:面向对象设计原则详解
面试官:设计原则有哪些?什么是里式替换原则?
RBAC:基于角色的访问控制(Role-Based Access Control)
爪哇缪斯
2023/05/10
2790
面试官:设计原则有哪些?什么是里式替换原则?
软件设计原则讲解,昭昭在目!
大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!死鬼~看完记得给我来个三连哦!
蔡不菜丶
2021/01/08
4600
设计模式学习心得之前置知识 UML图看法与六大原则
统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。
Qiuner
2024/07/19
1280
设计模式学习心得之前置知识 UML图看法与六大原则
【愚公系列】2023年11月 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)
面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:
愚公搬代码
2023/11/24
2920
设计原则之里氏替换原则(LSP)
里氏替换原则是在做继承设计时需要遵循的原则,不遵循了 LSP 的继承类会带来意想不到的问题。
Dylan Liu
2019/07/01
1.3K0
推荐阅读
相关推荐
设计模式—–里氏替换原则
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验