”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 底层设计和 SOLID 原则

底层设计和 SOLID 原则

发布于2024-11-03
浏览:668

低级设计(LLD)是软件开发中的一个关键阶段,它弥合了高级设计和实际实现之间的差距。高层设计侧重于架构蓝图,而 LLD 则处理如何实现每个组件、类或功能以满足整个系统的要求。

简单来说,LLD 涉及设计类、方法、接口以及它们之间的交互,确保代码高效、可维护和可扩展。对于软件工程师来说,这是一项基本技能,尤其是在构建需要健壮、可重用且易于随时间修改的系统时。

本博客将向您介绍底层设计中涉及的关键概念、原则和技术,并展示它们如何帮助您编写更好、更易于维护的代码。

我们想到的第一个问题是:

为什么底层设计很重要?

  1. 可维护性:经过深思熟虑的设计使维护、扩展和调试代码变得更加容易。糟糕的设计会导致技术债务,使未来的变更成本高昂。
  2. 可扩展性:良好的LLD可确保您的代码在性能和随着系统发展而支持新功能方面具有可扩展性。
  3. 可重用性:精心设计的组件可以在系统的不同部分或完全不同的项目中重用。
  4. 清晰度:通过明确的设计,工程师可以了解系统的各个部分如何组合在一起,从而使协作更容易。

为了弥合 LLD 概念和实际代码之间的差距,让我们通过以下步骤分解设计低级图的过程:

第一步:面向对象原则
第 2 步:坚实的原则
第三步:设计模式

面向对象原则

Low level design and SOLID Principles
面向对象编程概念的 4 个支柱是开始学习底层设计的必备条件。我已经在简短的结帐博客中介绍了这个概念

坚实的原则

Low level design and SOLID Principles

S:单一职责原则 (SRP)

  • 每个代码单元应该只有一个职责。
  • 单元可以是类、模块、函数或组件。
  • 保持代码模块化并减少紧密耦合。

示例:想象一个处理用户身份验证和日志记录的类。如果我们需要改变日志记录的工作方式,我们最终也会修改身份验证类。这违反了建议零售价。相反,我们应该有两个单独的类:一个用于用户身份验证,另一个用于日志记录,因此每个类都有一个职责。

O:开闭原则(OCP)

  • 代码单元应该对扩展开放,但对修改关闭。
  • 通过添加新代码而不是修改现有代码来扩展功能。
  • 在基于组件的系统(如 React 前端)中很有用。

示例:考虑一个通过信用卡处理付款的付款处理系统。如果您需要添加对 PayPal 的支持,您应该通过添加用于 PayPal 付款的新类来扩展它,而不是修改现有代码。这确保了现有系统保持稳定,同时允许添加新功能。

L:里氏替换原理(LSP)

  • 子类应该可以替代它们的基类。
  • 基类中的功能应该可供所有子类使用。
  • 如果子类不能使用基类的功能,则它不应该位于基类中。

示例:如果我们有一个 Bird 类,它有一个方法 Fly(),并且我们创建了一个不能飞的子类 Penguin,这违反了 LSP。 Penguin 类不应继承 Fly(),因为它会改变预期的行为。相反,应该重构 Bird 类以处理可以和不能以不同方式飞行的鸟类。

I:接口隔离原则(ISP)

  • 提供多个特定接口而不是几个通用接口。
  • 客户不应该依赖他们不使用的方法。

示例:假设我们有一个接口 Animal,其方法为 Fly()、swim() 和 walk()。实现 Animal 的 Dog 类将被迫定义 Fly(),而它并不需要。为了遵守 ISP,我们应该将 Animal 接口拆分为更小的接口,例如 Flyable、Swimmable 和 Walkable,以避免在类上强制使用不相关的方法

D:依赖倒置原则(DIP)

  • 依赖于抽象,而不是具体的类。
  • 使用抽象来解耦系统各部分之间的依赖关系。
  • 避免使用接口或抽象在代码单元之间直接调用。

示例:在电子商务应用程序中,如果结账流程(高级模块)直接依赖于 PayPal(低级模块)等特定支付网关,则更改支付网关需要修改结账流程。通过引入抽象,例如 PaymentProcessor 接口,结帐流程可以使用任何付款方式,而无需了解 PayPal 或任何其他服务的具体信息。

设计模式

设计模式是针对软件设计中出现的常见问题的经过验证的解决方案。它们是开发人员可以遵循的最佳实践,可以有效、系统地解决特定的设计问题。设计模式不是重新发明轮子,而是提供了解决重复出现问题的标准方法。

设计模式可以分为三种类型:

  1. 创建模式:处理对象创建

    • 工厂设计模式
    • 抽象工厂设计模式
    • Builder设计模式
    • 原型设计模式
    • 单例设计模式
  2. 结构模式:处理对象组合和关系

    • 适配器模式
    • 桥梁图案
    • 复合模式
    • 装饰模式
    • 立面图案
    • 享元模​​式
    • 代理模式
  3. 行为模式:处理对象交互和责任

    • 责任链模式
    • 命令模式
    • 解释器模式
    • 调解者模式
    • 纪念品图案
    • 观察者模式
    • 状态模式
    • 策略模式
    • 模板方法模式
    • 访客模式

现在我们已经通过探索 SOLID 原则奠定了基础,并介绍了设计模式的广阔前景,我们准备好深入研究了!在即将推出的系列中,我将通过实际示例和现实场景来分解每种设计模式。无论您是刚刚开始设计之旅还是希望提高自己的技能,这些模式都将帮助您编写更清晰、更具可扩展性的代码。请继续关注下一篇博客,我们将一步步揭开第一个设计模式!

如果您已经做到了这一步,请不要忘记点赞❤️,并在下面发表评论以提出任何问题或想法。您的反馈对我来说至关重要,我很乐意听到您的来信!

版本声明 本文转载于:https://dev.to/srishtikprasad/low-level-design-and-solid-principles-4am9?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用命令式方法更新 React 中的嵌套状态?
    如何使用命令式方法更新 React 中的嵌套状态?
    更新嵌套状态的命令式方法在 React 中,状态更新是不可变的。这意味着要更新嵌套对象或数组,您不能简单地修改其属性并期望更改反映在 UI 中。相反,您需要创建一个包含更新值的新对象或数组,然后将其传递给 setState。考虑以下示例,其中我们要更新对象中索引 1 处的对象的 name 属性存储在...
    编程 发布于2024-11-14
  • 原子变量有哪些不同的内存排序模型?
    原子变量有哪些不同的内存排序模型?
    理解内存排序的含义原子变量提供安全的内存访问和跨线程同步。了解不同的内存顺序对于有效利用它们至关重要。轻松:无内存同步。可能重新排序的优化操作读取和写入。顺序一致 (seq_cst):最严格的排序。防止对周围的任何内存操作进行重新排序原子操作。确保所有线程的内存访问一致。获取/释放:宽松之间的混合和...
    编程 发布于2024-11-14
  • 为什么在 For 循环中放错 Return 语句会影响输入循环?
    为什么在 For 循环中放错 Return 语句会影响输入循环?
    For循环中返回语句错位在你的作业中,你遇到了一个问题,程序只允许输入一只宠物,尽管瞄准三个。这个问题源于 make_list 函数中 return 语句的定位。在 for 循环中,return 语句在到达函数时立即终止函数的执行。在提供的代码中,return 语句放置在循环内部,导致函数在第一次迭...
    编程 发布于2024-11-14
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-14
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-14
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-14
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-14
  • 如何防止用户关闭 Bootstrap 模式?
    如何防止用户关闭 Bootstrap 模式?
    禁用用户启动的 Bootstrap 模态退出您可以通过单击 Bootstrap 模态区域外部来阻止用户关闭 Bootstrap 模态。这在您想要强制用户在继续操作之前与特定模态内容交互的情况下非常有用。禁用模态背景点击关闭默认情况下,用户可以通过单击模式窗口之外的任意位置来关闭模式。要禁用此行为:在...
    编程 发布于2024-11-14
  • 如何在 Python 中将嵌套列表导出到 CSV 文件?
    如何在 Python 中将嵌套列表导出到 CSV 文件?
    在Python中将嵌套列表导出到CSV文件将嵌套列表(其中每个内部列表包含不同类型的元素)写入CSV文件可以在 Python 中处理数据时这是一项常见任务。以下是应对这一挑战的方法:Python 的 csv 模块提供了处理 CSV 操作的便捷方法。要将列表的列表(例如 a = [[1.2,'...
    编程 发布于2024-11-14
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-14
  • 如何高效提取Go Slice的最后一个元素?
    如何高效提取Go Slice的最后一个元素?
    Go 提取切片最后一个元素的最佳方法在 Go 中使用切片时,有效操作元素至关重要。一个常见的任务是提取最后一个元素,这可以通过多种方法来实现。现有解决方案的缺点使用切片提供的解决方案[len(slice)-1 :][0] 看起来很麻烦并且涉及不必要的复杂性。它返回一个仅包含最后一个元素的切片,然后使...
    编程 发布于2024-11-14
  • 为什么我的 JavaScript 事件在动态元素追加后没有触发?
    为什么我的 JavaScript 事件在动态元素追加后没有触发?
    动态元素追加后 JavaScript 事件未触发您遇到了向 DOM 追加新元素后 JavaScript 事件未触发的问题。这是因为 jQuery 仅识别页面加载期间最初运行时存在的元素。要解决此问题,您需要使用事件委托来捕获动态元素中的事件。事件委托涉及捕获页面加载期间已经存在的 DOM 中更高级别...
    编程 发布于2024-11-14
  • `unshift()` 是在 JavaScript 中将元素添加到数组的最有效方法吗?
    `unshift()` 是在 JavaScript 中将元素添加到数组的最有效方法吗?
    JavaScript 中的最佳数组前置将元素前置到数组的开头是 JavaScript 中的常见要求。在这里,我们探索一种比问题中建议的传统方法更好的方法。Unshift 方法:本机解决方案JavaScript 提供了一个名为 unshift 的内置方法有效地将元素添加到数组的开头。与涉及创建新数组和...
    编程 发布于2024-11-14
  • 在 JavaScript 中通过构造函数定义方法是否会创建重复的函数副本?
    在 JavaScript 中通过构造函数定义方法是否会创建重复的函数副本?
    JavaScript 中通过原型与构造函数定义方法的性能影响在 JavaScript 中,存在两种创建具有公共函数的“类”的方法:使用原型或构造函数。方法 1 通过构造函数将函数分配给实例,而方法 2 利用原型在所有实例之间共享函数。虽然方法 2 通常被认为更高效,但剥夺实例的私有实例变量是一个显着...
    编程 发布于2024-11-14
  • 如何使用 matcha.css 设置 HTML 样式
    如何使用 matcha.css 设置 HTML 样式
    Written by Emmanuel Odioko✏️ Matcha, a famous green tea, is known for its stress-reducing benefits. I wouldn't claim that this tea necessarily inspire...
    编程 发布于2024-11-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3