哪些代码破坏了LSP?

Cadence PCB SI仿真实战:如何手动添加VIA过孔模型提升板级链路精度 本文详细介绍了在Cadence PCB SI仿真中如何手动添加VIA过孔模型以提升DDR4/5设计的精度。通过参数化建模和三维全波建模技术,工程师可以有效解决高速设计中的信号完整性问题,显著降低仿真误差。文章还提供了实战案例和常见问题解决方案,帮助优化板级链路性能。 阅读详情
哪些代码破坏了LSP?

实际上,里式替换原则还有另外一个更加能落地、更有指导意义的描述,那就是 Design By Contract,中文翻译就是 按照协议来设计。

子类在设计的时候,要遵守父类的行为约定(或者叫协议)。父类定义了函数的行为约定,那子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为约定。这里的行为约定包括:

  1. 函数声明要实现的功能;
  2. 对输入、输出、异常的约定;
  3. 注释中所罗列的任何特殊说明。

实际上,定义中父类和子类之间的关系,也可以替换成接口和实现类之间的关系。

为了更好地理解这句话,我举几个违反里式替换原则的例子来解释一下。

子类违背父类声明要实现的功能

父类中提供的 sortOrdersByAmount () 订单排序函数,是按照金额从小到大来给订单排序的,而子类重写这个 sortOrdersByAmount ()订单排序函数之后,是按照创建日期来给订单排序的。那子类的设计就违背里式替换原则。

子类违背父类对输入、输出、异常的约定
  1. 在父类中,某个函数约定:运行出错的时候返回 null,获取数据为空的时候返回空集合(empty collection)。

  2. 子类重载函数之后,实现变了,运行出错返回异常(exception),获取不到数据返回 null。那子类的设计就违背里式替换原则。

  3. 在父类中,某个函数约定,输入数据可以是任意整数,但子类实现的时候,只允许输入数据是正整数,负数就抛出,也就是说,子类对输入的数据的校验比父类更加严格,那子类的设计就违背了里式替换原则。

在父类中,某个函数约定,只会抛出 ArgumentNullException 异常,那子类的设计实现中只允许抛出 ArgumentNullException 异常,任何其他异常的抛出,都会导致子类违背里式替换原则。

子类违背父类注释中所罗列的任何特殊说明
  1. 父类中定义的 withdraw () 提现函数的注释是这么写的:“用户的提现金额不得超过账户余额……”

  2. 而子类重写 withdraw () 函数之后,针对 VIP 账号实现了透支提现的功能,也就是提现金额可以大于账户余额,那这个子类的设计也是不符合里式替换原则的。

以上便是三种典型的违背里式替换原则的情况。

除此之外,判断子类的设计实现是否违背里式替换原则,还有一个小窍门,那就是拿父类的单元测试去验证子类的代码。如果某些单元测试运行失败,就有可能说明,子类的设计实现没有完全地遵守父类的约定,子类有可能违背了里式替换原则。

实际上,你有没有发现,里式替换这个原则是非常宽松的。一般情况下,我们写的代码都不怎么会违背它。所以,只要你能看懂我今天讲的这些,这个原则就不难掌握,也不难应用。

虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们关注的角度是不一样的。

  1. 多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。

  2. 里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。

更多原创阅读:https://javawu.com

描述符链表(Descriptor Chain)是什么? 描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。 阅读详情

相关推荐

OK3588-C开发板Forlinx Desktop系统烧录与多媒体功能实战

本文详细介绍了OK3588-C开发板Forlinx Desktop系统的烧录步骤与多媒体功能实战。从硬件准备到软件工具配置,逐步解析RKDevTool烧录技巧,并深入测试摄像头、视频编解码及音频功能,帮助开发者快速掌握RK3588芯片的强大性能与Ubuntu系统的优化应用。

weixin_29190169的博客 417

里氏替换原则_软件构造心得:里氏替换原则(LSP)保持行为一致的动机与目的...

我们逐渐对于软件构造有了更深的要求。设计良好的代码需要做到可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码。抽象(Abstraction)和多态(Polymorphism)是实现这一原则的主要机制,而继承(Inheritance)则是实现抽象和多态的主要方法。而提高这一质量指标,打下构建可维护性和可重用性代码的基础,我们首先需要知道一个重要的原则。本文参考了一些...

weixin_39866774的博客 190

java结合Ai

Spring AI 是 AI 工程的应用框架。其目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于AI领域,并促进使用POJO作为应用程序的构建块到AI领域。特征跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步 API 和流 API 选项。还支持下拉以访问特定于模型的功能。聊天模型亚马逊基岩人类学Cohere的命令AI21 Labs的侏罗纪-2Meta 的 LLama亚马逊的泰坦人类学克劳德Azure 开放式 AI。

qq_67832732的博客 2848

源码分析七大设计原则之里氏替换原则(Liskov Substitution Principle)

一、里氏替换原则(Liskov Substitution Principle) 定义:子类型必须能够替换掉它们的父类型。一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,且它察觉不出父类对象和子类对象的区别。也就是说,子类对象可以随时随地的替换父类对象,并且替换完以后,语法不会报错,业务逻辑不会出现问题。 只有当子类可以替换掉父类,软件功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为,正是有里氏代换原则,使得继承复用成为了可能。也正是由于子类型的可替换性才使得使用父类类型

用善良的眼光看世界 427

探索热阻测试仪在半导体器件热管理中的应用与前景

T3Ster是MicReD研发的热测试仪,运用JEDEC稳态实时测试方法,专业测试分离或集成的双极型晶体管、MOS晶体管、常见的三极管、LED封装和半导体闸流管等器件的热特性。利用瞬态温升技术,可测得器件稳态热阻和温升,不但可以测得半导体器件稳态热阻和温升,而且可以直接测量各部分对于温升的贡献,计算芯片热流路径上的纵向热阻构成,对器件热可靠性设计、散热问题解决、产品性能提升和长期可靠性至关重要。关键词:T3ster,Micred,功率循环,结温测试,热阻测试,结温热阻测试,半导体热特性测试;

anscos_Olivia的博客 896

数字滤波器应用介绍

线性滤波器FIR ,会引起恒定延迟,通过补零的方式补偿非线性滤波器IIR,会引起频率相关的延迟,通过零相位延迟filtfilt补偿从信号中去除不需要的频谱时,通过滤波和补偿实现。如果需要去除的频率与采样率相差甚远,比如4kHz 与100Hz, 可通过 低通滤波->补偿->降采样–> 滤波 补偿 -->上采样还原的方法。*降采样前一定要先低通滤波为了防止混叠。

weixin_39107270的博客 274

设计模式 - 六大设计原则之LSP(里氏替换)

里氏替换原则(Liskov Substitution Principle , LSP) 由麻省理工学院计算机科学西教授 Barbara Liskov 于1987年提出, 她提出:继承必须确保超类所拥有的性质在子类中仍然成立。

小工匠 3万+

YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构

DynamicConv(动态卷积)是一个用于提高卷积神经网络(CNN)性能的技术,核心思想是动态地生成卷积核(filter),而不是使用固定的卷积核。通过引入更多的计算灵活性和适应性来增强卷积操作的表达能力,进而提升模型的性能。专家选择:DynamicConv 通过引入多个“专家”(experts),每个专家学习特定的卷积模式。输入图像的不同部分会选择不同的专家进行卷积。动态卷积核生成:根据输入的不同特征,专家网络动态地生成卷积核,而不是使用固定的卷积核。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2266

设计模式六大原则(2):里氏替换原则

肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。定...

Vegetable的博客 244

Python 爬虫实战:微信搜一搜内容深度爬取(含搜索结果解析与企业级架构设计)

在信息爆炸的时代,微信搜一搜已成为海量信息获取的重要入口。无论是个人知识探索,还是企业舆情监控,掌握微信搜一搜内容的深度爬取能力具有巨大价值。本文将从基础原理到企业级实现,全面解析微信搜一搜爬虫的开发过程。

yansideyucsdn的博客 2455

Pytorch入门实战(2)-使用BP神经网络实现MNIST手写数字识别

上一篇:Pytorch入门实战(1) - 实现线性回归 涉及知识点 Pytorch nn.Module的基本使用 Pytorch nn.Linear的基本用法 PytorchVision Transforms的基本使用 Pytorch中DataLoader的基本用法 Pytorch详解NLLLoss和CrossEntropyLoss 如何确定神经网络的层数和隐藏层神经元数量 本文内容 本文将会使用BP神经网络(就是最普通的神经网络)实现一个MNIST手写数据集的实现。话不多说,直接开始。 首先先导入需要的包

iioSnail的博客 6619

mongotemplate中save抛出异常_想写好面向对象的代码,这几篇一定要看(中)

在 上一篇文章 里,我用一个虚拟小项目作为例子,讲解了“SOLID”设计原则中的前两位成员:S(单一职责原则)与 O(开放-关闭原则)。在这篇文章中,我将继续介绍 SOLID 原则的第三位成员:L(里氏替换原则)。里氏替换原则与继承在开始前,我觉得有必要先提一下 继承(Inheritance)。因为和前面两条非常抽象的原则不同,“里氏替换原则”是一条非常具体的,和类继承有关的原则。在 OOP 世界...

weixin_39921087的博客 329

华为OD机试真题 新系统 - WIFI设备网络规划 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2017

里氏替换原则-快速理解

定义 里氏替换原则(Liskov Substitution Principle, LSP):所有引用父类的地方必须能使用其子类的对象。 怎么理解? 来个例子 class A { } class B extends A{ } class C { // void func(A a) { // // } //以上使用了A 类, 那必须要保证,保证什么呢? 保证替换成以下代码, 在任何情...

BREATH57的博客 825

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

里氏替换原则

定义:所有引用基类的地方必须能透明地使用其子类的对象(父类都可以用子类来代替,但不能改变父类原有的功能,在子类中可以任意扩展功能) 问题描述:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。 代码描述: package com.hc.w...

会说话的代码的博客 737

软件构造心得(11):里氏替换原则(Liskov Substitution Principle)保持行为一致的动机与目的

我们逐渐对于软件构造有了更深的要求。 设计良好的代码需要做到可以不通过修改而扩展,新的功能通过添加新的代码来实现,而不需要更改已有的可工作的代码。 抽象(Abstraction)和多态(Polymorphism)是实现这一原则的主要机制,而继承(Inheritance)则是实现抽象和多态的主要方法。而提高这一质量指标,打下构建可维护性和可重用性代码的基础,我们首先需要知道一个重要的原则。 本文参考...

weixin_43197820的博客 499

设计模式之里氏替换原则

LSP原则的定义是:如果S是T的一个子类型,那么在任何使用T的地方,都可以用S来替换T,而不会导致程序行为变得不正确。总之,LSP原则是面向对象设计中最基本的原则之一,它保证了代码的可靠性、可维护性和可拓展性,是设计高质量面向对象程序的关键。简单来说,LSP 原则要求子类不要破坏父类的行为,而是在保持原有行为的基础上,通过扩展、增加等方式实现特定的个性化需求。换句话说,LSP 原则要求在任何使用基类对象的地方,都可以使用它的子类对象,而不破坏程序的正确性和可靠性。子类必须完全实现基类的抽象方法。

记录 IT 领域经验与见解的博客 1259

深入理解SOLID原则之LSP:通过Rust实现车辆类层次结构

在面向对象编程中,继承(Inheritance)是一个强大的工具,但如果使用不当,它也可能成为维护的噩梦。你是否曾经遇到过这样的情况:子类替换父类后,程序行为出现了意想不到的变化?这正是里氏替换原则(Liskov Substitution Principle, LSP)要解决的问题。 LSP是SOLID原则中的第三个原则,由Barbara Liskov在1987年提出。它规定:**子类型必须能够...

gitblog_00698的博客 556

里氏替换原则——面向对象设计原则

里氏替换原则的定义 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inherit...

qq_45564691的博客 297

【设计原则】里氏替换原则(LSP):构建稳健继承体系的黄金法则

里氏替换原则(Liskov Substitution Principle, LSP)是面向对象设计SOLID原则中的"L",由Barbara Liskov在1987年提出。所有引用基类(父类)的地方必须能透明地使用其子类的对象子类必须完全实现父类的抽象方法子类可以扩展父类功能但不能改变原有行为子类方法的前置条件不应强于父类子类方法的后置条件不应弱于父类优先使用组合而非继承保持继承层次扁平化使用设计模式:策略模式模板方法模式装饰器模式定期进行代码审查编写契约测试。

OpenSeek的博客 1990

7大设计原则(里氏替换原则)

里氏替换原则里氏替换原则产生背景里氏替换原则的定义里氏替换原则的作用里氏替换原则的实现方法 里氏替换原则产生背景 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hi...

高哥哥的专栏 439

面向对象设计原则——里氏替换原则

里氏替换原则的定义 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about super

qq_36589864的博客 181

怎么理解里氏替换原则

里氏替换原则

矩阵Matrix 192

设计一个矩形类rectangle_想做软件开发得先搞懂软件的设计原则—SOLID原则之里氏替换...

里氏替换原则上一篇文章我们学习了SOLID中的开闭原则(O),如果还不了解开闭原则的小伙伴可以先去看了我的这篇文章再回来噢想做软件开发得先搞懂软件的设计原则—SOLID原则之开闭原则 今天我们的主题是SOLID中的L,也就是里氏替换原则;里氏替换原则(以Barbara Liskov的名字命名)规定,如果一个接口接受一个父类型的对象,那么它应该同样接受一个子类型的对象,而不会破坏任何东西。让我们来看...

weixin_39945789的博客 237

里氏替换原则是什么?gh_mirrors/so/solid.python项目带你轻松掌握

里氏替换原则(Liskov Substitution Principle,LSP)是SOLID五大设计原则之一,由Barbara Liskov提出。在gh_mirrors/so/solid.python项目中,这一原则通过简洁的Python代码示例得到了生动诠释,帮助开发者理解如何构建灵活可扩展的面向对象系统。 ## 🌟 里氏替换原则的核心思想 简单来说,里氏替换原则要求**子类必须能够替换

gitblog_00370的博客 876

里氏替换原则_Python 工匠:写好面向对象代码的原则(中)

前言 这是 “Python 工匠”系列的第 13 篇文章。[查看系列所有文章]在 上一篇文章 里,我用一个虚拟小项目作为例子,讲解了“SOLID”设计原则中的前两位成员:S(单一职责原则)与 O(开放-关闭原则)。在这篇文章中,我将继续介绍 SOLID 原则的第三位成员:L(里氏替换原则)。里氏替换原则与继承在开始前,我觉得有必要先提一下 继承(Inheritance)。因为和前面两条非常抽象的原...

weixin_39966465的博客 170
上一篇: 分布式缓存redis,看这一篇就够了
下一篇: 生产环境中,如何提升springboot服务吞吐量
大盛玩java
博客等级 码龄5年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值