在软件工程中,构建复杂系统就像建造一座城市。
没有城市规划,你不会从为一栋房子砌砖开始。你首先需要决定住宅区、商业区、电网和道路的布局。
这个城市规划就是你的高层次设计(HLD)。
一旦城市规划获批,建筑师会选取住宅区的一块土地,设计详细的房屋蓝图,具体规定房间数量、管道、电线和所需材料。
这份详细的房屋蓝图就是你的低层设计(LLD)。
两者都是必不可少的,但它们在不同层次的抽象层面上运作,服务于不同的目的。
在本章中,我们将更深入地探讨他们的差异。
什么是高层次设计(HLD)?
高级设计(HLD)定义了系统的架构。
它回答了这个问题:
"系统应该如何构建,其主要组成部分将如何相互作用?"
这里重点在于"做什么",而不是"怎么做"。
它回答了以下问题:
主要组件或微服务有哪些?(例如,用户服务、支付服务、通知服务、产品目录)。
这些组件将如何沟通?(例如,通过REST API、gRPC,或像RabbitMQ或Kafka这样的消息队列。)
将采用哪种技术栈?(例如,Java vs. Python,SQL vs. NoSQL 数据库)。
系统将如何处理可扩展性、可靠性和可用性?(例如,使用负载均衡器、数据库复制、CDN)。
有哪些第三方集成?(例如,支付用 Stripe,存储用 AWS S3)。
HLD的输出是一组架构图、数据流图和定义系统骨架的技术选择。
示例
叫车应用的HLD
服务:, , , ,Passenger ServiceDriver ServiceMatching ServiceBilling Service
通信:使用消息队列广播出行请求。 服务通过WebSockets进行实时位置更新。Matching ServicePassengerDriver
数据库:一个用于定位数据的 NoSQL 数据库,以及用于用户和账单信息的关系型 SQL 数据库。
基础设施:负载均衡器用于分发流量,服务则作为容器部署在Kubernetes上以实现可扩展性。
什么是低层设计(LLD)?
LLD聚焦于单个组件或模块,将抽象的架构概念转化为具体且可实现的细节,开发者可以直接编写代码。
它就是你决定服务内部结构的地方------包括类、方法、数据模型、设计模式和关系。
对于单个模块,它回答了以下问题:
具体有哪些课程,他们的职责是什么?
每个类的属性和方法是什么?
这些类别之间是如何关联的(继承、组合)?
哪些设计模式最合适(例如工厂、单人、策略)?
具体的方法签名有哪些,包括参数、返回类型和异常?
示例
LLD来自 网约车App。Billing Service
类别:, , , , , 。RideInvoicePaymentStrategyCreditCardPaymentWalletPayment
类别:, , , , , 。 Ride Invoice PaymentStrategy CreditCardPayment WalletPayment
接口:一个带有方法的接口。 并实现了该接口。IPaymentStrategyprocessPayment(amount)CreditCardPaymentWalletPayment
人际关系:类"has-a"对象(合成)。InvoiceRide
设计模式:策略模式用于允许用户无缝切换不同的支付方式。
主要区别:HLD与LLD一览表
高层设计(HLD)
低层设计(LLD)
重点
有哪些组成部分
每个组件的构建方式
受众
建筑师、利益相关者
工程师,开发者
抽象
系统级
模块/班级层面
文物
系统架构图,技术栈选择
类图、交互图、方法定义
示例
"我们将采用微服务架构,提供用户、订单和支付服务"
"将使用包含两种实现的接口":OrderServicePaymentProcessor
StripeProcessor
RazorpayProcessor
高性语言障碍与高级语言障碍如何协同工作
高密度发展和低语言发展不是替代选择。它们是设计过程中的连续步骤。
要求
高层设计
LLD:A 服务
LLD:服务B
LLD:C 服务
代码A
代码B。
代码C
流动
需求定义了系统应执行的任务
HLD将系统拆分为多个组成部分
LLD设计每个组件的内部结构
代码实现了LLD
编程资源
https://pan.quark.cn/s/7f7c83756948
更多资源
https://pan.quark.cn/s/bda57957c548