SOLID之LSP

简介: 里氏代换原则 LSP,Liskov Substitution Principle子类型必须能够替换掉它们的基类型若对每个类型S的对象O1,都存在一个类型T的对象O2,使得在所有针对T编写的程序P中,用O1替换O2后,程序P行为功能不变,则S是T的子类型LSP是继承关系设计基本原则,也是使OCP成为可能的主要原则之一。正是子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展,对于LSP的违反常常会导致以明显违反OCP的方式使用运行时类型辨别(RTTI),这种方式常常是使用一个显式的if语句或才if/else链去确定一个对象的类型

里氏代换原则 LSP,Liskov Substitution Principle

子类型必须能够替换掉它们的基类型

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

LSP是继承关系设计基本原则,也是使OCP成为可能的主要原则之一。正是子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展,对于LSP的违反常常会导致以明显违反OCP的方式使用运行时类型辨别(RTTI),这种方式常常是使用一个显式的if语句或才if/else链去确定一个对象的类型

假设一个函数f,它的参数为指向某个基类B的指针或者引用。同样假设B的某个派生类D,如果把D对象作为B类型传递给f,会导致f出现错误的行为。那么D就违反了LSP。显然,D对于f来说是脆弱的。

f的编写者会想去对D进行一些测试,以便于在把D的对象传递给f时,可以使f具有正确的行为。这个测试违反了OCP,因为此时f对于B的所有派生类都不再是封闭的

IS-A

“IS-A”是严格的分类学意义上的定义,意思是一个类是另一个类的“一种”

我们经常说继承是IS-A关系,也就是如果一个新类型的对象被认为和一个已有类的对象之间满足IS-A关系,那么这个新对象的类应该从这个已用对象的类派生

从一般意义上讲,一个正方形就是一个矩形。因此,把Sequare类视为从Rectangle类派生是合乎逻辑的

void f(Rectangle r) {
    r.setWidth(5);
    r.setHeight(4);
    assert(r.Area() == 20)
}

此时,如果传入的是Sequare对象,那这个函数f不能正确处理,也就是Squauare不能替换Rectangle,也就违反了LSP,意味着LSP与通常的数学法则和生活常识有不可混淆的区别

在OOD中IS-A关系是就行为方式而言,而不是属性,这也就是面向接口编程;派生类的行为方式和输出不能违反基类已经确立的任何限制。基类的用户不应该被派生类的输出扰乱

简单判断就是“可替换性”,子类是否能替换父类并保持原有行为不变

LSP与架构

LSP从诞生开始,也就差不多这些内容,主要是指导如何使用继承关系的一种方法。随着时间推移,在更宏观上,LSP逐渐演变成了一种更广泛的、指导接口与其实现方式的设计原则

可以是java风格的接口,具有多个实现类:甚至可以是几个服务响应同一个rest接口,用户都依赖于一种接口,并且都期待实现该接口的类之间能具有可替换性

一旦违背了可替换性,该系统架构就不得不为此增添大量复杂的应对机制

目录
相关文章
|
安全 网络协议 网络安全
UDP Flood是什么?及其防护方法
UDP Flood是互联网上最经典的DDoS(Distributed Denial of Service)攻击之一。攻击者在短时间内向目标设备发送大量的UDP报文,导致链路拥塞甚至网络瘫痪。一般的UDP报文由攻击工具伪造,通常在数据段具备相同的特征,另一部分由真实网络设备发出的UDP报文,虽然数据段不相同,但固定的目的端口也可作为一种特征。 确定UDP攻击报文的特征后,即可根据特征进行过滤。特征过滤就是常说的指纹过滤,可根据攻击报文的特征,自定义过滤属性。指纹过滤包括静态指纹过滤和动态指纹学习两种方法。
UDP Flood是什么?及其防护方法
|
缓存 安全 数据安全/隐私保护
「小邓观点」分享几种常见的账户锁定原因
下期小邓将与大家分享账户锁定的解决方案。如果您有账户锁定方面的困扰,敬请期待!
876 4
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
2252 0
|
负载均衡 Ubuntu Java
nacos常见问题之升级到2.1.0重启后端服务如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
466 1
|
存储 编译器 程序员
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(二)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
282 0
|
关系型数据库 MySQL 数据库
轻松入门:使用Docker安装MySQL数据库的完全指南
轻松入门:使用Docker安装MySQL数据库的完全指南
|
运维 监控 搜索推荐
数据中台(02)- 数据中台能力与应用场景
数据中台(02)- 数据中台能力与应用场景
678 0
|
开发工具
支付宝小程序开发工具IDE新版(0.60 Stable)正式发布
本周支付宝小程序开发工具IDE正式发布了0.60 Stable版本,该版本主要对插件体系进行了升级,新增预检测功能以及修复了部分问题。
2713 12
支付宝小程序开发工具IDE新版(0.60 Stable)正式发布
|
设计模式 算法 架构师
硬核!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能
最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开Boss直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉Java一个初中级岗位有上千人同时竞争,内卷程度简直怀疑人生。
|
自然语言处理 Python
【NLP Tool -- NLTK】NLTK进行英文情感分析、分词、分句、词性标注(附代码)
NLP自然语言处理之NLTK工具的使用,进行英文情感分析、分词、分句、词性标注(附代码)
1703 0