【A部分SOLID Typescript简介

【a部分solid typescript简介

SOLID原则是一套面向对象编程的设计原则,旨在创建更健壮、易维护和可扩展的代码。本文将通过TypeScript示例,简要介绍SOLID原则中的前三个原则:单一职责原则(SRP)、开闭原则(OCP)和里氏替换原则(LSP)。

S – 单一职责原则 (SRP)

一个类应该只有一个变化的原因。 这意味着每个类应该只负责一个特定的功能。如果一个类承担了过多的职责,就应该将其分解成更小的、更专注的类。

反例:

class UserService {    createUser(user: string): void {        console.log(`User ${user} created`);    }    sendWelcomeEmail(user: string): void {        console.log(`Welcome email sent to ${user}`);    }}

登录后复制

UserService类同时负责创建用户和发送邮件,违反了SRP原则。

改进后的例子:

class UserService {    createUser(user: string): string {        console.log(`User ${user} created`);        return user;    }}class EmailService {    sendEmail(user: string): void {        console.log(`Email sent to ${user}`);    }}

登录后复制

职责被清晰地划分到UserService和EmailService两个类中。

如何有效应用SRP? 将职责基于业务逻辑进行分组。例如,与邮件相关的操作属于EmailService,与用户相关的操作属于UserService。

O – 开闭原则 (OCP)

软件实体应该对扩展开放,对修改关闭。 这意味着可以向系统添加新功能,而无需修改现有代码。

反例:

class DiscountService {    calculateDiscount(discountType: string, amount: number): number {        if (discountType === 'standard') {            return amount * 0.1;        } else if (discountType === 'premium') {            return amount * 0.5;        }        return 0;    }}

登录后复制

添加新的折扣类型需要修改calculateDiscount方法,违反了OCP原则。

改进后的例子:

interface Discount {    calculateDiscount(amount: number): number;}class StandardDiscount implements Discount {    calculateDiscount(amount: number): number {        return amount * 0.1;    }}class PremiumDiscount implements Discount {    calculateDiscount(amount: number): number {        return amount * 0.5;    }}class DiscountService {    constructor(private discount: Discount) {}    calculateDiscount(amount: number): number {        return this.discount.calculateDiscount(amount);    }}const standardDiscountService = new DiscountService(new StandardDiscount());const premiumDiscountService = new DiscountService(new PremiumDiscount());

登录后复制

通过接口和多态性,可以轻松添加新的折扣类型,而无需修改DiscountService类。

L – 里氏替换原则 (LSP)

子类型必须能够替换其基类型。 这意味着子类应该能够在不改变程序正确性的前提下替换其父类。

反例:

class Rectangle {    width: number;    height: number;    constructor(width: number, height: number) {        this.width = width;        this.height = height;    }    getArea(): number {        return this.width * this.height;    }}class Square extends Rectangle {    constructor(side: number) {        super(side, side);    }    set width(width: number) {        this.width = this.height = width;    }    set height(height: number) {        this.height = this.width = height;    }}

登录后复制

Square类违反了LSP原则,因为它改变了Rectangle类的预期行为。

改进后的例子:

abstract class Shape {    abstract getArea(): number;}class Rectangle extends Shape {    constructor(protected width: number, protected height: number) {        super();    }    getArea(): number {        return this.width * this.height;    }}class Square extends Shape {    constructor(protected side: number) {        super();    }    getArea(): number {        return this.side * this.side;    }}

登录后复制

Square和Rectangle都实现了Shape接口,且各自保持了独立的实现逻辑,避免了行为冲突。

如何有效应用LSP? 当子类与父类的行为不完全一致时,避免强制继承,考虑使用组合或接口。

(待续…)

以上就是【A部分SOLID Typescript简介的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2644437.html

(0)
上一篇 2025年3月7日 07:15:33
下一篇 2025年3月1日 14:50:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js爬虫怎样进行异常处理

    JavaScript爬虫开发中,异常处理至关重要。 网络请求和HTML解析过程容易出错,有效的异常处理能确保爬虫程序的稳定运行。 try…catch语句是JavaScript中处理异常的主要方法。 以下示例演示如何使用try&#…

    2025年3月7日
    200
  • js数据库如何进行数据恢复

    JavaScript本身并非数据库,但可用于操作数据库。本文演示如何结合Node.js和Sequelize库实现JavaScript数据库数据恢复。 前提条件:已安装Node.js 以下步骤将指导您使用Sequelize操作数据库,并进行数…

    2025年3月7日
    200
  • js数据库怎样进行数据加密

    JavaScript数据库数据加密解密方法详解 本文介绍在javascript中如何安全地加密和解密数据库数据,主要涵盖两种方法:使用原生subtlecrypto api和第三方库crypto-js。 选择哪种方法取决于项目需求和安全性考量…

    2025年3月7日
    200
  • js数据库怎样保证数据一致性

    JavaScript数据库数据一致性策略: 为了确保JavaScript应用中数据库数据的完整性和一致性,我们可以运用多种策略,主要包括事务处理、锁机制和乐观锁。 1. 事务处理 (Transactions): 事务是维护数据一致性的基石。…

    2025年3月7日
    200
  • Conditional Rendering: Best Practices and Pitfalls to Avoid

    条件渲染:高效灵活地控制UI显示 条件渲染是根据特定条件动态显示不同内容或UI元素的关键技术,在构建动态交互式应用中不可或缺。然而,不当的条件渲染实现可能导致代码难以维护、错误频发或效率低下。本文将介绍条件渲染的最佳实践和常见陷阱,助您编写…

    2025年3月7日
    200
  • 设计令人愉快的维护中页面 HTML 和 CSS

    网站维护期间,一个设计精良的“维护中”页面至关重要,它能有效地向用户传达网站暂时停运的信息,并确保透明度和用户参与度。本文将深入探讨如何使用HTML和CSS设计这样的页面,使其兼具视觉吸引力、响应速度和功能性。 为什么“维护中”页面如此重要…

    2025年3月7日
    200
  • 让 EditorJS 在 Svelte(kit) SSR 中工作

    本文简述了在SvelteKit服务器端渲染(SSR)环境中使用Editor.js的解决方案。由于Editor.js本身不支持SSR,直接使用会导致错误。 您可能会遇到类似如下的错误信息: [vite] error when evaluati…

    2025年3月7日
    200
  • 将 Playwright 与 Jenkins 集成的最佳实践是什么

    将 Playwright 集成到 Jenkins CI/CD 流程中,可显著提升自动化测试效率。本文分享一些最佳实践,助您顺利完成集成。 一、Docker 保持环境一致性 使用 Docker 容器运行 Jenkins 代理,确保测试环境一致…

    2025年3月7日
    200
  • js数据库怎样进行数据备份

    本文介绍几种JavaScript数据库备份方法,适用于浏览器环境。 方法一:利用IndexedDB的备份功能 IndexedDB是浏览器端存储大量结构化数据的API,提供indexeddb.backup()方法进行数据库备份。以下代码示例演…

    2025年3月7日
    200
  • js爬虫怎样控制爬取速度

    JavaScript爬虫速度控制的关键在于合理运用setTimeout函数或Promise.then()方法,避免对目标服务器造成过大压力。 setTimeout允许您在指定毫秒数后执行函数,从而实现延迟。 以下示例展示了如何使用setTi…

    2025年3月7日
    200

发表回复

登录后才能评论