敏捷开发笔记(第10章节)--Liskov原则(LSP)

news2024/12/23 0:32:51

 

目录

1:PDF上传链接

10.1 Liskov替换原则(LSP)

10.2 一个违反LSP的简单例子

10.6 启发式规则和习惯用法

10.7 结论


1:PDF上传链接

【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库

        OCP背后的主要机制是抽象(abstraction)和多态(polymorphism)。在静态类型语言中,比如C++和Java,支持抽象和多态的关键机制之一是继承(inheritance)。正是使用了继承,我们才可以创建实现其基类(base class)中抽象方法的派生类。
是什么设计规则在支配着这种特殊的继承用法呢?最佳的继承层次的特征又是什么呢?怎样的情况会使我们创建的类层次结构掉进不符合OCP的陷阱中去呢?这些正是Liskov替换原则(LSP)要解答的问题。

10.1 Liskov替换原则(LSP)

        对于LSP可以做如下解释:

        子类型(subtype)必须能够替换掉它们的基类型(base type).
        Barbara Liskov首次写下这个原则是在1988年。她说道,

        这里需要如下替换性质:若对每个类型S的对象01,都存在一个类型T的对象02,使得在所有针对T编写的程序P中,用01替换02后,程序P行为功能不变,则S是T的子类型.
        想想违反该原则的后果,LSP的重要性就不言而喻了。假设有一个函数f,它的参数为指向某个基类B的指针(pointer)或者引用(reference.)。同样假设有B的某个派生类D,如果把D的对象作为B类型传递给f,会导致f出现错误的行为。那么D就违反了LSP。显然,D对于f来说是脆弱的。
        f的编写者会想去对D进行一些测试,以便于在把D的对象传递给f时,可以使f具有正确的行为。这个测试违反了OCP,因为此时f对于B的所有不同的派生类都不再是封闭的。这样的测试是一种代码的臭味,它是缺乏经验的开发人员(或者,更糟的,匆忙的开发人员)在违反了LSP时所产生的结果。

10.2 一个违反LSP的简单例子

        对于LSP的违反常常会导致以明显违反OCP的方式使用运行时类型辨别(RTTI)。这种方式常常是使用-“个显式的仟语句或者fse链去确定一个对象的类型,以便于可以选择针对该类型的正确行为。考虑…下程序10.1。

 图10.1.1

        很显然,程序lO.1中的DrawShape函数违反了OCP。它必须知道Shape类所有的派生类,并且每次创建-一个从Sape类派生的新类时都必须要更改它,甚至很多人肯定地认为这种函数结构简直是对良好设计的诅咒。那么,是什么促使程序员编写出像这样的一个函数呢?

        假设Jo是一个工程师。他学习过面向对象技术,并且认为多态的开销大得难以忍受。因此,他定义了一个没有任何虚函数的Shape类。类(结构)Square和Circle从Shape类派生,并具有Draw)函数,但是它们没有覆写(override)Shape类中的函数。因为Circle类和Square类不能替换Shape类,所以DrawShape函数必须要仔细检查输入的Shape对象,确定它的类型,接着调用正确的Draw函数。

        Square类和Circle类不能替换Shape类其实是违反了LSP,这个违反又迫使DrawShape函数违反了OCP,因而,对于LSP的违反也潜在地违反了OCP。

10.6 启发式规则和习惯用法

        有一些简单的启发规则可以提供一些有关违反LSP的提示。这些规则都和以某种方式从其基类中去除功能的派生类有关。完成的功能少于其基类的派生类通常是不能替换其基类的,因此就违反了LSP。

10.7 结论

        OCP是OOD中很多说法的核心。如果这个原则应用得有效,应用程序就会具有更多的可维护性、可重用性以及健壮性。LSP是使OCP成为可能的主要原则之一。正是子类型的可替换性才使得使用基类类型的模块在无需修改的情况下就可以扩展。这种可替换性必须是开发人员可以隐式依赖的东西。因此,如果没有显式地强制基类类型的契约,那么代码就必须良好地并且明显地表达出这一点。
        术语“IS-A”的含意过于宽泛以至于不能作为子类型的定义。子类型的正确定义是“可替换性的”,这里的可替换性可以通过显式或者隐式的契约来定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS【详解】边框 border,边框-圆角 border-radius,边框-填充 border-image,轮廓 outline

边框 border border 是以下三种边框样式的简写: border-width 边框宽度 —— 数值 px(像素),thin(细),medium(中等),thick(粗)border-style 边框线型 —— none【默认值…

数据库MySQL下载安装

MySQL下载安装地址如下: MySQL :: Download MySQL Community Server 1、下载界面 2、点击下载 3、解压记住目录 4、配置my.ini文件 未完..

整洁架构SOLID-里氏替换原则(LSP)

文章目录 定义LSP继承实践正例反例 LSP软件架构实践反例 小结 定义 1988年,Barbara Liskov在描述如何定义子类型时写下了这样一段话: 这里需要的是一种可替换性:如果对于每个类型是S的对象o1都存在一个类型为T的对象o2,能使操作T…

树莓派PICO使用INA226测量电流和总线电压(1)

TI的INA226是一款不错的16位电流测量芯片,拥有非常高的性价比,而且测量精度能够覆盖我们大多数的应用场景,INA226的接线也比较简单,通过I2C读取数据会稍微麻烦一点。 INA226可以在淘宝上直接买开发板,非常的便宜&#…

本地部署,去除动漫图像背景Anime Remove Background

目录 摘要 引言 深度学习在动漫角色中的应用 1.​U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果​ Tip: 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术,广泛应用于…

「Pytorch」roLabelImg 图像异常旋转 bug

在进行Yolo-obb 模型训练的时候需要标注旋转框,roLabelImg 是比较推荐的一款旋转框标注工具,既可以标注正常的矩形框,还可以标注旋转框 roLabelImg Github 地址:https://github.com/HumanSignal/labelImg 但是在使用过程中遇到了…

Word中使用LaTeX编辑公式

在日常学术写作过程中,公式输入必不可少。然而使用Word传统的公式编辑器往往无法满足高标准的排版要求,如排版不专业、编辑效率低、兼容性差等问题。LaTeX相比Word,在公式输入及排版方面更为强大,但是对于轻量级的任务&#xff0c…

Vivado 2020.1 HLS IP在BD模式无法生成问题

折腾了一周整整,记录一下,希望对大家有用。 各种找、各种操作,也问了FAE,都没搞定。 最后看到如下博文的方法3,管用。 vivado综合hls类ip核报错问题解决方案_vivado ip synth checkpoint mode-CSDN博客 报错描述 m…

Chatto企业AI助手产品技术拆解(上)

往期文章: AI智能客服项目拆解(1) 产品大纲 在上一篇文章中,我们详细介绍了AI智能客服的基本概念、需求分析、产品形态及分类,以及AI在线客服的用户体验流程和系统架构。为了更深入地理解AI智能客服的内在工作机制和技术实现,本…

【读论文】Instant Neural Graphics Primitives with a Multiresolution Hash Encoding

文章目录 1. What2. Why2.1 Introduction2.2 Related work and background 3. How: Multiresolution hash encoding3.1 Structure3.2 Input coordinate3.3 Hash mapping3.4 Interpolation3.5 Performance vs. quality3.6 Hash collision 4. Experiment on Nerf 1. What To red…

Pygame开发五子棋之人机对战游戏

引言 Pygame是一个基于Python的开源游戏开发库,它包含了丰富的多媒体功能,尤其是针对游戏开发所需的各种组件。如果你对游戏开发感兴趣,但又不想从底层开始编写所有东西,Pygame可以成为一个理想的起点。本文将介绍Pygame的基本概…

C++:类和对象 I(访问限定符、this指针)

目录 类的定义 类的大小 访问限定符 实例化 this指针 类的定义 class就是类,class是C中的一个关键字 当然类也可以是C语言中的struct,C兼容struct,甚至还有一些升级 定义类的方式 class Date {}; 和C语言的struct一样,c…

【信息收集】域名信息收集

域名介绍 域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。 DNS&#xf…

【Python】jupyter notebook平台的使用·

目录 一、安装Anaconda 二、 将BreadCancer.zip上传到jupyter notebook平台中 三、了解BreadCancerClassifier.ipynb文件在jupyter notebook的单元格中的python代码,并运行。 3.1 导入mainFun文件 3.2 读入数据 3.3 开始训练 3.4 读入测试数据 3.5 开始测试…

[笔记] SEW的振动分析工具DUV40A

1.便携式振动分析仪 DUV40A 文档编号:26871998/EN SEW是一家国际化的大型的机械设备供应商。产品线涵盖电机,减速机,变频器等全系列动力设备。DUV40A是他自己设计的一款振动分析工具。 我们先看一下它的软硬件参数: 内置两路传…

i7-13700K负载过高时出现无故自动重启(蓝屏问题)

现象:电脑无故自动重启,关闭故障自动重启后,发现系统蓝屏,然后需要手动重启。经测试,当CPU负载高时,就会有一定概率出现蓝屏。 配置:CPU为i7-13700K,系统为Win11 解决方法 现象刚…

Python那些优质可视化工具!

作者:Lty美丽人生 https://blog.csdn.net/weixin_44208569 本次分享10个适用于多个学科的Python数据可视化库,其中有名气很大的也有鲜为人知的! 1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Pytho…

mitmproxy介绍及使用

mitmproxy介绍 mitmproxy又名中间人攻击代理,是一个抓包工具,类似于WireShark、Filddler,并且它支持抓取HTTP和HTTPS协议的数据包,只不过它是一个控制台的形式操作。另外,它还有两个非常有用的组件,一个mi…

漏扫处理:SSH弱算法问题解决

目录 漏洞说明解决方法1. 查看可用的算法2. 禁用弱算法3.检查ssh配置4.重启ssh服务5.ssh测试连接是否正常6.漏扫测试参考链接漏洞说明 通过漏扫得出,服务器SSH支持密钥交换算法,而此算法被认为是弱算法,存在高风险问题。 启用了以下弱算法: diffie-hellman-group-exchage…

前端JS特效第33波:jQuery旋转木马焦点图轮播插件PicCarousel

jQuery旋转木马焦点图轮播插件PicCarousel&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <meta http-equiv"X-UA-Compatible" content"IE…