架构整洁之道-06 设计原则-里氏代换LSP

简介: 里氏替换原则 Liskov Substitution Principle,LSPInheritance should ensure that any property proved about supertype objects also holds for subtype objects继承必须确保超类所拥有的性质在子类中仍然成立。

里氏替换

里氏替换原则 Liskov Substitution Principle,LSP

Inheritance should ensure that any property proved about supertype objects also holds for subtype objects

继承必须确保超类所拥有的性质在子类中仍然成立。

里氏替换原则,主要在阐述关于继承的一些原则。什么时候使用继承,什么时候不应该使用继承。主要反映基类和子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。

通过以下Demo来分析,继承时应该避免出现的问题:

class Bird {
  private flyTime: number;
  constructor(flyTime:number){
    this.flyTime = flyTime;
  }
  getFlyTime(){
    console.log(`鸟的飞行时间:${this.flyTime}`);
  }
}
​
class Ostrich extends Bird {
  constructor(fltTime:number){
    super(fltTime)
  }
​
  getFlyTime(){
    console.log(`鸵鸟不会飞`);
  }
}
​
(()=>{
  const ostrich = new Ostrich(12);
  ostrich.getFlyTime();
})();

以上程序是没有问题,但在设计上有问题:Ostrich类继承了Bird类,同时也重写了getFlyTime方法,改变了父类使用该方法是为了计算飞行时间的,这样的调用存在着风险,违反了里氏替换原则。因为里氏替换原则是实现开闭原则的重要方式之一,所以修改了父类的方法,是没有进行扩展,而是进行修改的操作。

解决方案是,去掉他们之间的继承关系。可以新建一个基类,增加计算飞行时间方法和输出特性方法,Bird和Ostrich类分别继承新的基类,实现各自的功能。

如何正确使用继承

  • 子类可以扩展父类的功能,但尽量不改变父类原有的功能
  • 子类的方法实现父类的方法时,条件可以增强但是功能应该是对等的,
  • 子类可以增加自己特有的方法

里氏替换原则作用

  • 它避免了因继承父类造成可复用性降低的缺点
  • 它是动作正确性保证,即父类要实现的功能还是保持一致,避免引入新的错误。
  • 加强程序的健壮性,同时变更时可以做到非常好的兼容性

参考资料

目录
相关文章
|
3月前
|
前端开发 Java 测试技术
使用整洁架构优化你的 Gradle Module
使用整洁架构优化你的 Gradle Module
63 0
|
10月前
|
存储 Go 数据处理
Go 语言整洁架构实践
Go 语言整洁架构实践
73 0
|
6天前
|
消息中间件 监控 API
深入浅出微服务架构设计原则
在软件开发的宇宙中,微服务如星辰般璀璨,引领着分布式系统的航向。本文将带你穿梭于微服务的星系,探索其背后的设计哲学与实践精髓,从服务边界的划分到数据一致性的保障,再到服务的通信与协作,我们将一同揭开微服务架构高效、可扩展且灵活的秘密。
16 4
|
7天前
|
消息中间件 设计模式 API
后端开发中的微服务架构设计原则
【8月更文挑战第13天】在软件工程的世界中,微服务架构已经成为一种流行的设计模式,它通过将复杂的应用程序分解成一组小的服务来简化开发和部署。本文探讨了微服务背后的设计理念,以及如何在后端开发实践中应用这些原则来构建可扩展、灵活且易于维护的系统。我们将深入讨论服务的划分、通信协议的选择、数据一致性的保障以及容错性策略的实施,旨在为后端开发人员提供一套实用的微服务架构设计指导。
18 1
|
3月前
|
数据中心 网络架构 Python
【计算巢】数据中心的网络架构设计原则
【5月更文挑战第31天】探讨数据中心网络架构设计原则:稳定性是基础,需抵御各种挑战;强调扩展性,适应业务发展;追求高效,确保数据传输速度;注重灵活性,灵活应对变化。简单Python代码示例展示网络节点连接。设计时需具备长远眼光,综合考虑技术方案,以构建坚固高效的信息桥梁。同学们,要持续学习和探索,为信息世界贡献力量!
50 2
|
3月前
|
监控 安全 API
微服务架构下的API网关设计原则
【5月更文挑战第31天】在本文中,我们将深入探讨微服务架构下API网关的设计原则。API网关作为微服务架构的入口点,其设计至关重要。我们将从性能、安全性、可扩展性等方面进行分析,并提出一些实用的设计建议。
|
3月前
|
存储 缓存 运维
云计算架构设计原则
【4月更文挑战第6天】这篇文章介绍了基于云计算的架构设计六大原则:合理部署、业务持续、弹性扩展、性能效率、安全合规和持续运营。
|
12月前
|
设计模式 关系型数据库 数据安全/隐私保护
软件架构设计原则之单一职责原则
单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个类负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能导致另一个职责的功能发生故障。这样一来,这个类就存在两个导致类变更的原因。如何解决这个问题呢?将两个职责用两个类来实现,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说,就是一个类、接口或方法只负责一项职责。
92 0
软件架构设计原则之单一职责原则
|
12月前
|
设计模式 人工智能 Java
软件架构设计原则之依赖倒置原则
依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并且能够降低修改程序所造成的风险。接下来看一个案例,还是以Course(课程)为例,先来创建一个类Tom:
75 0
|
3月前
|
存储 关系型数据库 uml
00003.七大软件架构设计原则
00003.七大软件架构设计原则
56 0