`
guohui_fz
  • 浏览: 56260 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

OO的五大原则中的 LSP(zt)

阅读更多
OO的五大原则中的 LSP(里氏替换原则)
现将近期整理的文档提供给大家,这里对LSP做重点的介绍,望对大家有帮助,在学习和使用OO设计的时候,我们应该明白:OO的出现使得软件工程师们能够用更接近真实世界的方法描述软件系统。然而,软件毕竟是建立在抽象层次上的东西,再怎么接近真实,也不能替代真实或被真实替代。
      OO设计的五大原则之间并不是相互孤立的。彼此间存在着一定关联,一个可以是另一个原则的加强或是基础。违反其中的某一个,可能同时违反了其余的原则。因此应该把这些原则融会贯通,牢记在心!
OO的五大原则是指SRP、OCP、LSP、DIP、ISP。
1. SRP(Single Responsibility Principle 单一职责原则)
      单一职责很容易理解,也很容易实现。所谓单一职责,就是一个设计元素只做一件事。什么是“只做一件事”?简单说就是少管闲事。现实中就是如此,如果要你专心做一件事情,任何人都有信心可以做得很出色。
OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。
2. OCP :开闭原则,很简单,一句话:“Closed for Modification; Open for Extension”——“对变更关闭;对扩展开放”。开闭原则其实没什么好讲的,我将其归结为一个高层次的设计总则。OCP的动机很简单:软件是变化的。不论是优质的设计还是低劣的设计都无法回避这一问题。OCP说明了软件设计应该尽可能地使架构稳定而又容易满足不同的需求。 为什么要OCP?答案也很简单——重用。
3.LSP——里氏替换原则
OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性“抽象”是语言提供的功能。“多态”由继承语义实现。 如此,问题产生了:“我们如何去度量继承关系的质量?”
Liskov于1987年提出了一个关于继承的原则“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
该原则称为Liskov Substitution Principle——里氏替换原则。
我们来研究一下LSP的实质。学习OO的时候,我们知道,一个对象是一组状态和一系列行为的组合体。状态是对象的内在特性,行为是对象的外在特性。LSP所表述的就是在同一个继承体系中的对象应该有共同的行为特征。
这一点上,表明了OO的继承与日常生活中的继承的本质区别。举一个例子:生物学的分类体系中把企鹅归属为鸟类。我们模仿这个体系,设计出这样的类和关系。


类“鸟”中有个方法fly,企鹅自然也继承了这个方法,可是企鹅不能飞阿,于是,我们在企鹅的类中覆盖了fly方法,告诉方法的调用者:企鹅是不会飞的。这完全符合常理。但是,这违反了LSP,企鹅是鸟的子类,可是企鹅却不能飞!需要注意的是,此处的“鸟”已经不再是生物学中的鸟了,它是软件中的一个类、一个抽象。
有人会说,企鹅不能飞很正常啊,而且这样编写代码也能正常编译,只要在使用这个类的客户代码中加一句判断就行了。但是,这就是问题所在!首先,客户代码和“企鹅”的代码很有可能不是同时设计的,在当今软件外包一层又一层的开发模式下,你甚至根本不知道两个模块的原产地是哪里,也就谈不上去修改客户代码了。客户程序很可能是遗留系统的一部分,很可能已经不再维护,如果因为设计出这么一个“企鹅”而导致必须修改客户代码,谁应该承担这部分责任呢?(大概是上帝吧,谁叫他让“企鹅”不能飞的。^_^)“修改客户代码”直接违反了OCP,这就是OCP的重要性。违反LSP将使既有的设计不能封闭!

修正后的设计如下:

LSP并没有提供解决这个问题的方案,而只是提出了这么一个问题。 于是,工程师们开始关注如何确保对象的行为。1988年,B. Meyer提出了Design by Contract(契约式设计)理论。DbC从形式化方法中借鉴了一套确保对象行为和自身状态的方法,其基本概念很简单:

每个方法调用之前,该方法应该校验传入参数的正确性,只有正确才能执行该方法,否则认为调用方违反契约,不予执行。这称为前置条件(Pre-condition)。
一旦通过前置条件的校验,方法必须执行,并且必须确保执行结果符合契约,这称之为后置条件(Post-condition)。
对象本身有一套对自身状态进行校验的检查条件,以确保该对象的本质不发生改变,这称之为不变式(Invariant)。
以上是单个对象的约束条件。为了满足LSP,当存在继承关系时,子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或者更宽松;而子类中方法的后置条件必须与超类中被覆盖的方法的后置条件相同或者更为严格。

4.DIP 依赖倒置原则
依赖倒置(Dependence Inversion Principle)原则讲的是:要依赖于抽象,不要依赖于具体。
简单的说,依赖倒置原则要求客户端依赖于抽象耦合。原则表述:
抽象不应当依赖于细节;细节应当依赖于抽象;
要针对接口编程,不针对实现编程。

5.ISP 接口隔离原则
使用多个专门的接口比使用单一的总接口要好。广义的接口:一个接口相当于剧本中的一种角色,而此角色在一个舞台上由哪一个演员来演则相当于接口的实现。因此一个接口应当简单的代表一个角色,而不是一个角色。,如果系统设计多哥角色的话,则应当每一个角色都由一个特定的接口代表。狭义的接口(Interface):接口隔离原则讲的就是同一个角色提供宽、窄不同的接口,以对付不同的客户端。
分享到:
评论

相关推荐

    面向对象编程,OO设计的五大原则

    在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭原则(Open-Closed Principle,简称 OCP)、里氏替换原则(Liskov Substitution Principle,...

    LN-替换字体.lsp

    LN-替换字体.lsp

    cad经典LSP文件

    tiao.lsp --- 配合修改过的标准字体文件,将中文字符调大 tiao1.lsp --- 配合修改过的标准字体文件,将英文字符调小 untiao.lsp --- 上两个程序的复原 sht.lsp --- 在图中查找字符串 zhuang.lsp --- 桩点及钎探...

    里氏代换原则案例程序LSP.zip

    里氏代换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,由芭芭拉·里科夫(Barbara Liskov)在1988年提出。该原则规定,子类必须能够替换它们的基类,并且在软件系统中不会产生任何...

    CAD中的*.LSP病毒查杀工具

    总之,CAD中的*.LSP病毒是一种针对性强、危害较大的恶意程序,使用"KillCadVirus.exe" 这样的专业查杀工具是防范和处理这类问题的有效手段。在日常工作中,提高安全意识,结合工具防护,能大大降低CAD系统遭受病毒...

    语音编码中LSP量化文章

    本篇文章将深入探讨LSP量化,特别是矢量量化技术在这一过程中的应用。 首先,我们来理解LSP参数。在语音信号处理中,人类语音的产生可以模拟为一个通过滤波器的声源。这个滤波器的频率响应通常用梅尔频率倒谱系数...

    Lsp最好的入门示例.rar_LSP WSPStartup_Lsp最好的入门示例_lsp 拦截_lsp文件范本_lsp编程

    在这个压缩包中,"**Lsp最好的入门示例**"很可能是包含了一系列的教程或者代码实例,这些实例可能逐步引导你完成一个完整的LSP服务开发流程,从基础的服务器设置到复杂的交互逻辑。通过实践这些示例,你可以深入理解...

    OO设计原则-里氏替换原则

    ### OO设计原则——里氏替换原则详解 #### 一、引言 面向对象设计原则(Object-Oriented Design Principles)是一套指导软件开发者如何更好地设计类、接口等面向对象元素的原则集合,旨在提高代码的可复用性、可...

    cad经典LSP文件大放送

    asc.lsp --- 将文本文件内容写入图中,字符是单个的 wf.lsp --- 将图中字符写入磁盘 exstr.lsp --- 将字符串分解成单字 pgtxt.lsp --- 将字符合成字符串 pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --...

    快速清理超大图纸.lsp

    清理插件,加载插件即可

    CAD快速清理超大图纸.lsp

    CAD超大图纸快速清理,内含本人自己增加的部分代码,可去除线性病毒及多重从属

    OO设计原则总结

    ### OO设计原则总结 #### 什么是设计原则? 设计原则是一系列指导软件开发的基本准则,遵循这些原则可以帮助开发者构建出更加灵活、易于维护和扩展的软件系统。这些原则旨在解决常见的软件设计问题,如耦合度高、...

    PHP面向对象五大原则之里氏替换原则(LSP)详解

    里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的五大原则之一。这一原则最早由Barbara Liskov在1987年提出,并由Robert C. Martin在后续的软件开发著作中进一步阐述。LSP的主要思想可以...

    面向对象设计原则(SRP,OCP,LSP,DIP,ISP)

    面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP

    lsp集合学习专用lsp集合学习专用

    lsp集合学习专用lsp集合学习专用lsp集合学习专用

    ss.zip_lsp程序_多段线_多段线闭合 lsp_面积lsp_面积标注

    标题中的“ss.zip_lsp程序_多段线_多段线闭合 lsp_面积lsp_面积标注”指的是一个名为“ss”的ZIP压缩文件,其中包含了一个LISP(AutoLISP)程序,这个程序主要用于处理CAD(计算机辅助设计)中的多段线(POLYLINE)...

    fas2lsp.rar

    fas 和 lsp 文件是AutoCAD软件中两种不同的文件格式,用于不同的目的。 FAS 文件通常是由AutoCAD的自动保存功能产生的,它包含了用户在AutoCAD中绘制的图形数据,这些文件通常以备份或临时文件的形式存在。然而,...

    LSP钩子程序 VC++实现

    在计算机网络编程领域,LSP(Layered Service Provider)是一种Windows系统中用于拦截网络通信的技术。LSP允许开发者插入自定义代码到网络协议栈中,以此来监控或修改数据包。在这个场景下,我们讨论的是一个使用...

    Delphi LSP Hook 过滤广告

    同时,要考虑到性能问题,因为LSP Hook会影响到所有网络连接,所以需要高效地处理拦截和过滤过程,避免对系统性能造成过大影响。 6. **安全性和隐私保护**: 鉴于LSP Hook的底层操作性质,开发者需要特别注意安全性...

    cad常用lsp文件.zip_LSP_cad lsp命令大全_cad lsp文件_lsp1. cc_test1.lsp文件

    插件命令快捷键说明: 1、CC 尺寸 2、BX 变虚 3、BS 变实 4、BL 比例 5、ZD 折断线 6、YC 引出线 7、BG 标高 8、TM 图名 9、SM 索引图名 10、PM 剖面符号 11、PS 剖切索引 12、SY 索引符号

Global site tag (gtag.js) - Google Analytics