在 Typescript 和 Java 中应用“里氏替换原则”

在 typescript 和 java 中应用“里氏替换原则”

概念

接口

接口定义类必须实现的契约或一组方法和属性。接口用于确保类遵循某种格式,但它们不提供方法的实现,仅提供方法的签名。

每当一个类实现一个接口时,它就会签署该接口的所有契约(方法和属性)。每个属性和方法都是强制实现的。

坚硬的

solid 是一个缩写词,代表面向对象编程的五个基本原则,由 robert c. martin(鲍勃大叔)提出。在这里您可以阅读有关他的文章的更多信息。
这些原则旨在改进代码的结构和维护,使其更加灵活、可扩展且更易于理解。这些原则可以帮助程序员创建更有组织的代码、划分职责、减少依赖、简化重构过程并促进代码重用。

关于lsp

缩写中的“l”代表“里氏替换原理”。 bob叔叔用来定义这个原则的一句话是:

“派生类必须能够完全替换基类”

因此建议派生类应该尽可能接近基类,这样派生类就可以在代码不做任何修改的情况下替换其基类。

该原则由 barbara liskov 于 1988 年基于数据抽象和类型理论提出。源自契约式设计 (dbc) 的概念,由 bertrand meyer 于 1986 年推广。

这一原则的另一个具体说明是:

子类型应该用作您的基本类型,没有任何意外。

在编程中,变化和意外可能会导致问题。如果需要更换某项系统功能,新功能必须提供相同类型的信息,否则系统可能会出现故障。为了确保类 s 具有与基类 t 相同的行为,必须使用定义实现新功能的强制方法的契约(接口或抽象类),以保证类 s 之间相似性的完整性和 t 类。

实际应用

考虑一个带有 fly() 方法的 bird 基类,该方法将在两个子类中使用:sparrow 和 ostrich。

立即学习“Java免费学习笔记(深入)”;

文件:bird.java

class bird {    void fly() {        system.out.println("i can fly!");    }}class sparrow extends bird {    // herda o comportamento de 'fly' da classe 'bird'}class ostrich extends bird {    @override    void fly() {        throw new unsupportedoperationexception("i cannot fly");    }}

文件:bird.ts

class bird {  fly() {    console.log("i can fly!");  }}class sparrow extends bird {}class ostrich extends bird {  fly() {    throw new error("i cannot fly");  }}

遇到的问题

在这里,sparrow 类遵循 lsp,因为麻雀确实可以飞。然而,ostrich 类违反了 lsp,因为它以从根本上改变其行为的方式重写了 fly() 方法,打破了 bird 类设定的期望。

阿里妈妈·创意中心 阿里妈妈·创意中心

阿里妈妈营销创意中心

阿里妈妈·创意中心 0 查看详情 阿里妈妈·创意中心

如何修复?

我们需要通过将 sparrow 和 ostrich 类的每个特殊性划分为合约(接口或抽象类,这里我将使用接口)来应用 lsp,它们必须签署这些合约来调整每个类的行为:

文件:bird.java

interface bird {    string getname();    void makesound();}interface flyingbird extends bird {    void fly();}class sparrow implements flyingbird {    private string name;    public sparrow(string name) {        this.name = name;    }    @override    public string getname() {        return this.name;    }    @override    public void makesound() {        system.out.println("chirp chirp!");    }    @override    public void fly() {        system.out.println(this.name + " is flying!");    }}class ostrich implements bird {    private string name;    public ostrich(string name) {        this.name = name;    }    @override    public string getname() {        return this.name;    }    @override    public void makesound() {        system.out.println("boom boom!");    }}public class main {    public static void main(string[] args) {        sparrow sparrow = new sparrow("little sparrow");        sparrow.makesound(); // chirp chirp!        sparrow.fly(); // little sparrow is flying!        ostrich ostrich = new ostrich("ostrich");        ostrich.makesound(); // boom boom!        ostrich.fly(); // error: method 'fly' does not exist on 'ostrich'    }}

文件:bird.ts

interface Bird {  name: string;  makeSound(): void;}interface FlyingBird extends Bird {  fly(): void;}class Sparrow implements FlyingBird {  name: string;  constructor(name: string) {    this.name = name;  }  makeSound() {    console.log("Chirp chirp!");  }  fly() {    console.log(`${this.name} is flying!`);  }}class Ostrich implements Bird {  name: string;  constructor(name: string) {    this.name = name;  }  makeSound() {    console.log("Boom boom!");  }}const sparrow = new Sparrow("Little Sparrow");sparrow.makeSound(); // Chirp chirp!sparrow.fly(); // Little Sparrow is flying!const ostrich = new Ostrich("Ostrich");ostrich.makeSound(); // Boom boom!ostrich.fly(); // Error: Method 'fly' does not exist on 'Ostrich'

分析

更正说明
bird interface:定义所有鸟类共有的行为,例如makesound()。所有鸟类都必须实现此接口。

flyingbird 接口:继承自 bird 并添加 fly() 行为,该行为针对会飞的鸟类。

sparrow 类:实现 flyingbird 接口,因为麻雀可以飞。此类定义了发出声音和飞行的行为。

鸵鸟类:仅实现 bird 接口,因为鸵鸟不会飞。该类没有 fly() 方法,因此不违反 lsp。

结论

lsp 对于确保代码模块化、可重用且易于维护至关重要。 lsp 违规可能会导致脆弱的代码在引入新子类或修改现有子类时中断,因为这可能会导致依赖于超类的部分代码出现意外行为。

子类型替换允许模块无需修改即可扩展,这对于开闭原则 (ocp) 提供的灵活性至关重要,而里氏替换原则使之成为可能。契约(通过接口或抽象类实现)对于安全设计至关重要,但程序员必须充分理解它们,有助于避免遗留软件中的常见错误。他们还提供了有关如何实施和使用代码的宝贵指导,只需遵守相关合同即可。

实际意义

设计子类时,确保它们可以在使用其超类的任何地方使用,而不会引入错误或需要特殊处理。避免创建违反超类预期行为的子类,因为这可能会导致维护问题和意外错误。

理解和应用里氏替换原则可以帮助开发人员创建更加可预测和稳定的面向对象系统。

以上就是在 Typescript 和 Java 中应用“里氏替换原则”的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/483200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 12:19:21
下一篇 2025年11月8日 12:20:45

相关推荐

  • PHP 8如何响应安全事件

    PHP 8 的安全事件响应需要遵循系统化的流程,包括:隔离受影响系统、收集证据、分析攻击、修复漏洞、恢复系统和持续监控。为了增强安全,应了解 PHP 安全函数、参数化查询、文件上传验证、会话管理,并考虑入侵检测系统。常见的错误包括依赖过时的库、忽略安全警告和不进行安全测试,应遵循最佳实践以实现安全和…

    2025年12月10日
    000
  • PHP 8如何建立安全意识

    PHP 8 的安全意识构建了一个多层次的防御体系,涵盖输入验证、数据过滤、输出编码、安全函数应用以及服务器配置,以应对安全风险,包括 SQL 注入、XSS、CSRF 和文件包含漏洞。通过采用严格的验证、过滤和编码措施,加上安全函数和适当的服务器配置,开发人员可以主动构建安全的应用程序,而非被动地修补…

    2025年12月10日
    000
  • 了解Laravel应用中的坚实原则

    Laravel应用中的SOLID原则:构建更健壮的应用 干净、易于维护的软件设计,其基石在于SOLID原则。这五个原则——单一职责原则(SRP)、开放封闭原则(OCP)、Liskov替换原则(LSP)、接口隔离原则(ISP)和依赖反转原则(DIP)——帮助开发者构建可扩展、可测试且易于维护的系统。本…

    2025年12月10日
    000
  • PHP 8如何防止信息泄露

    PHP 8 信息泄露防护指南:严格数据处理和输出: 验证和过滤用户输入,妥善处理敏感数据。输入验证: 使用正则表达式和类型提示对数据进行检查。输出编码: 根据不同上下文选择合适的编码方式,防止恶意代码执行。参数绑定和预编译语句: 处理数据库交互时,避免 SQL 注入。避免常见错误:重视后端验证,妥善…

    2025年12月10日
    000
  • PHP 8如何进行安全编码实践

    PHP 8 安全编码方法:使用预处理语句或参数化查询防止 SQL 注入。对用户输入进行严格验证和过滤以抵御 XSS 攻击。使用输出编码函数(如 htmlspecialchars())保护输出免受 XSS 攻击。定期更新软件和第三方库,培养良好的安全编程习惯。 PHP 8安全编码:编写坚不可摧的代码 …

    2025年12月10日 好文分享
    000
  • PHP 8如何进行输入过滤

    PHP 8 中的输入过滤是构建安全应用的基础,提供了多层次的防御。核心过滤函数包括 htmlspecialchars()(防止 XSS)、strip_tags()(移除 HTML 标签)、filter_var()(使用预定义或自定义过滤器)。filter_var() 灵活且强大,支持自定义过滤器。常…

    2025年12月10日
    000
  • PHP 8如何安全处理API请求

    要安全地处理 PHP 8 API 请求,需要验证和授权,防止未经授权的访问;进行输入验证,防止恶意输入;输出编码,防止 XSS 攻击;谨慎处理错误,避免暴露敏感信息;性能优化,在确保安全的同时提升效率;通过定期审计、更新和使用加密等措施提升安全性。 PHP 8 API 请求安全防护:深入探讨 你是否…

    2025年12月10日
    000
  • PHP 8如何安全处理用户输入

    PHP 8安全处理用户输入:趟过那片荆棘 很多开发者都栽过跟头,用户输入,这玩意儿看起来人畜无害,实则暗藏杀机。 你以为它只是个简单的字符串,其实它可能是sql注入的利器,也可能是跨站脚本攻击(xss)的导火索,甚至可能是一个精心设计的命令注入的炸弹。 这篇文章,咱们就来聊聊如何在php 8中安全地…

    好文分享 2025年12月9日
    000
  • 如何确保PHP 8应用安全

    PHP 8 本身与之前版本一样安全,但新特性带来新挑战:输入验证、数据库安全、文件上传安全和会话管理仍很重要。PHP 8 的新特性包括命名参数、属性和联合类型,需要注意验证严谨、访问控制和类型检查。示例函数演示了如何安全处理用户输入。安全与性能并不矛盾,代码审查、成熟框架和定期更新有助于提升安全性。…

    2025年12月9日
    000
  • PHP 8应用安全需要关注哪些方面

    PHP 8带来了新风险,如类型转换漏洞和用户输入处理不当。为了抵御这些风险,应采取以下措施:验证和过滤用户输入,使用预处理语句防止SQL注入和使用htmlspecialchars函数防止跨站脚本攻击。使用库辅助文件上传验证和安全扫描。采用多层防御策略,避免过度依赖单一机制。调试错误并使用安全扫描工具…

    2025年12月9日
    000
  • PHP 8如何防止XSS攻击

    PHP 8 XSS防御要求采取多层次策略,包括:1. 输入验证(包括数据类型检查、长度限制、正则表达式过滤);2. 输出编码(根据输出上下文选择合适的函数,如 htmlspecialchars、js_encode 等);3. 安全头设置(如 CSP、X-XSS-Protection、X-Frame-…

    2025年12月9日
    000
  • PHP 8如何防范SQL注入

    PHP 8 提供了多个防御 SQL 注入的方法:参数化查询、PDO 强化功能和输入验证过滤。参数化查询将 SQL 查询和数据分开处理,防止恶意代码执行。 PDO 具有数据类型检查、错误处理和跨数据库兼容性。输入验证过滤在使用参数化查询前检查用户输入,去除恶意代码。结合这几种方法,构建多层防御体系,保…

    2025年12月9日
    000
  • 如何保障PHP 8应用程序的安全性?

    PHP 8 应用程序的安全保障需要遵循以下步骤:基础功:输入验证和输出转义:对用户输入进行验证和过滤,防止恶意代码注入和 XSS 攻击。进阶:数据库安全:使用预处理语句防止 SQL 注入,定期备份数据库以防万一。高级:代码审计和安全测试:进行代码审计或渗透测试,找出潜在漏洞。更高级:使用成熟的框架和…

    2025年12月9日
    000
  • Sublime Text Config for Laravel

    本文档介绍了笔者使用 Sublime Text 编辑器进行 Laravel 应用开发时的配置方案。 插件 以下插件显著提升了开发效率: GitBlameGitGutterAdvancedNewFileSyncSideBarLSPLSP-intelephenseLSP-bashLSP-dockerfi…

    2025年12月9日
    000
  • PHP 中安全文件上传的最佳实践:防止常见漏洞

    PHP安全文件上传:最佳实践指南 文件上传功能在Web应用中广泛使用,允许用户分享图片、文档及视频等。然而,不当处理会带来严重安全风险,例如远程代码执行、关键文件覆盖和拒绝服务攻击。本文提供PHP安全文件上传的全面指南,涵盖最佳实践、常见漏洞及安全防护技术。 1. PHP基本文件上传 PHP文件上传…

    2025年12月9日
    000
  • 常见的 PHP 安全问题以及如何预防

    PHP 安全漏洞及防御措施 网站安全是 Web 开发的核心。PHP 作为广泛使用的服务器端语言,若缺乏安全防护,极易遭受攻击。开发者必须了解常见漏洞并采取有效措施保护应用。本文将探讨常见的 PHP 安全问题及其解决方案。 1. SQL 注入 问题: 攻击者通过用户输入注入恶意 SQL 代码,操纵 S…

    2025年12月9日
    000
  • PHP7和PHP8的安全性提升

    PHP7 和 PHP8 的安全性提升涵盖以下方面:底层引擎优化,提升执行速度,增加攻击难度。限制和改进危险函数,降低 SQL 注入和 XSS 等攻击风险。引入命名参数、联合类型等特性,提高代码可读性和可维护性,减少 bug 导致的安全风险。强调开发人员的编码习惯和安全意识,安全是一个持续改进的过程。…

    2025年12月9日
    000
  • PHP 设计模式:页面控制器

    页面控制器设计模式是基于 web 的系统中使用的常见架构方法。它通过专用特定控制器来处理单个页面或请求的逻辑来组织控制流。这种方法有助于隔离职责,使代码库更易于维护和发展。 什么是页面控制器? 在页面控制器模式中,每个页面(或一组具有类似行为的页面)都有自己的控制器,负责: 处理请求:处理客户端发送…

    2025年12月9日
    000
  • PHP 中的 CSRF 保护

    什么是 csrf? 跨站请求伪造 (csrf) 是一种网络安全漏洞,攻击者可以利用该漏洞诱骗经过身份验证的用户在他们当前登录的网站上执行不需要的操作。该攻击通过利用网站所拥有的信任来进行在用户的浏览器中。 csrf 攻击如何运作 用户登录合法网站 a 并收到会话 cookie用户在仍登录 a 的情况…

    2025年12月9日
    000
  • 关注点分离 (SoC)

    关键实施示例 1. 数据库层分离 // bad – mixed concernsclass user { public function save() { $db = new pdo(‘mysql:host=localhost;dbname=app’, ‘user’, ‘pass’); $stmt …

    2025年12月9日 好文分享
    000

发表回复

登录后才能评论
关注微信