9.1.领域驱动设计
目录
一、领域驱动设计核心哲学
-
战略设计与战术设计的分野 • 战略设计:限界上下文(Bounded Context)与上下文映射(Context Mapping) • 战术设计:实体、值对象、聚合根、领域服务的构建原则
-
统一语言(Ubiquitous Language)实践 • 领域专家与开发团队的协作范式(Event Storming工作坊设计) • 代码与文档的同步策略(Swagger + DDD Glossary)
二、领域模型设计与实现
-
领域模型构建方法论 • 四色建模法:时标对象(Moment-Interval)、角色(Role)、描述(Description)、参与方(Party) • 事件风暴(Event Storming):从业务事件到领域模型的推导流程
-
战术模式落地 • 聚合根设计:一致性边界与并发控制(乐观锁/悲观锁策略) • 领域事件:事件溯源(Event Sourcing)与消息中间件(Kafka/RocketMQ集成) • 防腐层(Anti-Corruption Layer):遗留系统适配与第三方服务隔离
三、大厂领域驱动架构实战
-
阿里电商商品中心案例 • 挑战:亿级SKU的复杂属性管理与搜索优化 • 方案: ◦ 商品核心域与供应链支撑域的限界上下文拆分 ◦ 基于领域事件的商品状态同步(Binlog + Canal实时监听)
-
腾讯金融支付清结算系统 • 挑战:多币种混合结算的复杂规则与审计合规 • 方案: ◦ 值对象模式实现货币计算(BigDecimal精度控制 + 汇率服务防腐层) ◦ 聚合根事务一致性保障(Saga模式 + 分布式事务框架Seata)
-
美团外卖订单履约系统 • 挑战:高峰期每秒10万订单的领域状态机管理 • 方案: ◦ 订单聚合根的并发控制(Redis分布式锁 + 数据库行锁混合策略) ◦ 领域事件驱动履约流程(订单创建 → 支付 → 派单 → 配送的状态迁移)
四、DDD与现代化架构融合
-
微服务架构下的DDD落地 • 限界上下文与服务边界的映射关系 ◦ 一上下文一服务 vs 一上下文多服务(基于团队与业务复杂度权衡) • 领域模型与REST/GraphQL API的设计协同 ◦ API资源模型到领域模型的转换策略(HATEOAS与领域动作的映射)
-
云原生与DDD的协同演进 • Sidecar模式承载防腐层逻辑:Envoy WASM实现协议转换与数据清洗 • Serverless领域函数设计:AWS Lambda实现无状态领域服务(如风控规则引擎)
-
中台化架构的DDD适配 • 业务中台的核心域抽象:用户中心、商品中心、交易中心的领域服务下沉 • 数据中台的领域模型扩展:基于领域事件的实时数仓构建(Flink + Hudi)
五、工具链与效能提升
-
DDD全生命周期工具 • 设计工具:Visual Paradigm领域建模、Miro在线事件风暴 • 代码生成:IDEA插件(如DDD Plugin)自动生成聚合根/仓储代码 • 测试验证:Cucumber + SpecFlow实现领域场景BDD测试
-
框架与中间件集成 • DDD框架选型:COLA架构 vs Axon Framework vs 自研框架 • 领域事件总线:Spring Cloud Stream与RocketMQ/Redis Stream集成
一、领域驱动设计核心哲学
1. 战略设计与战术设计的分野
战略设计:限界上下文与上下文映射
限界上下文(Bounded Context) 是领域驱动设计的核心战略模式,用于界定领域模型的边界。每个限界上下文对应一个独立的业务子域,拥有专属的领域模型和统一语言。
示例:电商系统上下文划分 • 商品上下文:管理SKU、库存、类目属性。 • 订单上下文:处理下单、支付、履约流程。 • 用户上下文:负责注册、登录、权限管理。
上下文映射(Context Mapping) 定义不同上下文间的交互方式,常见模式包括: • 合作关系(Partnership):两个上下文紧密协作,共享部分模型(如订单与物流)。 • 防腐层(Anti-Corruption Layer):隔离外部系统或遗留代码,避免污染核心域(如集成第三方支付)。
战术设计:实体、值对象、聚合根的构建原则
• 实体(Entity):具有唯一标识的对象(如订单ID)。
public class Order { private String orderId; // 唯一标识 private OrderStatus status; // 业务行为方法 public void cancel() { this.status = OrderStatus.CANCELLED; } }
• 值对象(Value Object):无唯一标识,通过属性定义(如地址)。
public class Address { private String province; private String city; // 值对象相等性由属性决定 @Override public boolean equals(Object obj) { ... } }
• 聚合根(Aggregate Root):一致性边界的管理者(如订单聚合根控制订单项变更)。
public class OrderAggregate { private Order order; private List<OrderItem> items; // 保证业务规则:订单总金额≥0 public void addItem(OrderItem item) { if (this.calculateTotal() + item.getPrice() < 0) { throw new IllegalStateException("Invalid total amount"); } this.items.add(item); } }
2. 统一语言(Ubiquitous Language)实践
领域专家与开发团队的协作范式
通过 Event Storming 工作坊 对齐业务与技术的理解:
-
事件风暴流程: • 识别领域事件:如“订单已创建”、“支付已成功”。 • 标注命令与角色:谁(用户/系统)触发了什么操作。 • 划分限界上下文:确定事件归属的领域边界。
-
产出物: • 事件流图(贴在墙上的便签矩阵)。 • 核心领域模型初稿。
代码与文档的同步策略
• Swagger 文档:API 设计需反映领域动作(如 /orders/{id}/cancel
)。 • DDD Glossary:维护术语表,确保业务词汇在代码中一致。
| 术语 | 定义 | 代码对应类 | |--------------|-----------------------------|------------------| | 订单 | 用户购买商品的交易凭证 | OrderAggregate | | 库存保留 | 预占商品库存以确保可售性 | InventoryService |
二、领域模型设计与实现
1. 领域模型构建方法论
四色建模法:时标对象、角色、描述、参与方
• 时标对象(Moment-Interval):记录业务关键时间点或时段(如订单创建时间)。 • 角色(Role):对象在特定场景下的职责(如用户作为“买家”角色)。 • 描述(Description):对象的静态属性(如商品规格参数)。 • 参与方(Party/Place/Thing):参与业务的主体(如用户、仓库、物流公司)。
示例:电商订单四色模型
classDiagram class Order { <<Moment>> String orderId Date createTime void cancel() } class User { <<Party>> String userId String role } Order --> User : placed by
事件风暴(Event Storming)推导领域模型
从业务事件到代码模型的转化流程:
-
事件抽取:梳理业务流程中的领域事件(如
OrderPlaced
、PaymentCompleted
)。 -
命令识别:确定触发事件的操作(如
PlaceOrderCommand
)。 -
聚合根设计:将事件和命令归属到聚合根(如
OrderAggregate
处理订单状态变更)。
2. 战术模式落地
聚合根设计:一致性边界与并发控制
• 一致性规则:聚合根负责维护内部对象的状态一致性。
public class OrderAggregate { private List<OrderItem> items; // 添加商品时校验库存 public void addItem(Product product, int quantity) { if (!product.isAvailable(quantity)) { throw new InsufficientStockException(); } items.add(new OrderItem(product, quantity)); } }
• 并发控制策略: • 乐观锁:通过版本号(@Version
)避免更新冲突。 • 悲观锁:数据库 SELECT FOR UPDATE
锁定聚合根。
领域事件:事件溯源与消息中间件集成
• 事件溯源(Event Sourcing):通过事件序列重建聚合根状态。
public class OrderAggregate { private List<DomainEvent> changes = new ArrayList<>(); public void cancel() { apply(new OrderCancelledEvent(this.orderId)); } private void apply(DomainEvent event) { // 更新状态并记录事件 changes.add(event); } }
• Kafka集成:发布领域事件供其他上下文订阅。
@Service public class OrderEventPublisher { @Autowired private KafkaTemplate<String, DomainEvent> kafkaTemplate; public void publish(OrderCancelledEvent event) { kafkaTemplate.send("order-events", event); } }
防腐层(Anti-Corruption Layer)隔离第三方服务
场景:集成外部支付系统,避免其API污染核心支付域模型。
public class PaymentAdapter { // 转换外部支付接口响应为内部领域模型 public PaymentResult adapt(ThirdPartyPaymentResponse response) { return new PaymentResult( response.getStatus().equals("SUCCESS") ? PaymentStatus.SUCCESS : PaymentStatus.FAILED, response.getTransactionId() ); } }
总结
本节深入解析了DDD的核心哲学与战术实践: • 战略设计 通过限界上下文划分复杂业务,战术设计 提供可落地的代码结构。 • 统一语言 确保业务与技术的一致性,事件风暴 是团队协作的关键工具。 • 聚合根与领域事件 是保障一致性和扩展性的核心模式,防腐层 解决系统集成中的模型污染问题。
大厂实战经验: • 阿里商品中心:通过聚合根管理十亿级SKU的库存一致性。 • 腾讯支付系统:利用事件溯源实现分布式事务的最终一致性。 • 美团订单履约:通过防腐层隔离第三方物流接口,提升系统稳定性。
这些模式与案例为企业构建高内聚、低耦合的领域模型提供了完整的方法论支撑。
三、大厂领域驱动架构实战
1. 阿里电商商品中心案例
挑战:亿级SKU的复杂属性管理与搜索优化
• 问题核心:商品属性动态扩展(如服装类目的尺码、颜色)、多维度搜索性能瓶颈。 • 业务复杂度:SKU属性组合爆炸(如手机型号×颜色×存储容量)。
解决方案
-
限界上下文拆分: • 商品核心域:管理基础商品信息、类目属性、SKU生成规则。 • 供应链支撑域:处理库存管理、供应商协同,通过防腐层隔离ERP系统。
// 商品核心域聚合根:ProductAggregate public class ProductAggregate { private String productId; private Map<String, Object> dynamicAttributes; // 动态属性存储 public void addAttribute(String key, Object value) { dynamicAttributes.put(key, value); } }
-
领域事件驱动状态同步: • Binlog监听:通过Canal捕获MySQL变更,发布商品更新事件。 • Elasticsearch同步:消费事件更新搜索索引,实现近实时搜索(1秒内延迟)。
# Canal客户端监听Binlog client = CanalClient(host='mysql-master') client.subscribe("mall.product") for change in client.listen(): emit_event(ProductUpdatedEvent(data=change.row_data))
2. 腾讯金融支付清结算系统
挑战:多币种混合结算与审计合规
• 精度问题:多币种汇率转换导致的小数位丢失(如0.1 USD = 0.78 HKD)。 • 审计追踪:需记录每一笔结算的完整轨迹以满足PCI-DSS标准。
解决方案
-
值对象模式实现货币计算:
@ValueObject public class Money { private final BigDecimal amount; private final Currency currency; public Money add(Money other) { BigDecimal converted = exchange(other); // 调用汇率服务 return new Money(this.amount.add(converted), this.currency); } }
-
Saga模式保障事务一致性: • Seata分布式事务:将结算拆分为“预扣款→汇率转换→最终结算”三个阶段。 • 补偿事务:若某阶段失败,自动触发反向操作(如退款)。
@GlobalTransactional public void settle(Order order) { deductFunds(order); // 阶段1:扣款 convertCurrency(order); // 阶段2:汇率转换 finalSettle(order); // 阶段3:最终结算 }
3. 美团外卖订单履约系统
挑战:高峰每秒10万订单的并发控制与状态管理
• 并发冲突:同一骑手被多个订单分配,导致状态覆盖。 • 状态机复杂度:订单需经历“创建→支付→派单→配送→完成”等十多个状态迁移。
解决方案
-
混合锁策略: • Redis分布式锁:粗粒度锁保障派单阶段互斥。 • 数据库行锁:细粒度锁控制订单项更新。
public void assignRider(String orderId, String riderId) { String lockKey = "order_assign:" + orderId; if (redisLock.tryLock(lockKey, 3)) { try { Order order = orderRepo.selectForUpdate(orderId); // 行锁 order.assignRider(riderId); } finally { redisLock.unlock(lockKey); } } }
-
领域事件驱动状态机: • 状态迁移规则:通过事件触发状态变更,避免硬编码。
public class OrderStateMachine { @Transition(on = "PAYMENT_COMPLETED", from = "CREATED", to = "PAID") public void onPaymentComplete(OrderEvent event) { // 检查业务规则:如订单金额是否匹配 } }
四、DDD与现代化架构融合
1. 微服务架构下的DDD落地
限界上下文与服务边界映射
• 一上下文一服务:适用于团队独立、业务复杂度低的场景(如用户服务)。 • 一上下文多服务:当上下文内存在多个子域时(如订单服务拆分为订单创建、订单查询)。
API与领域模型协同设计
• RESTful资源映射:
@PostMapping("/orders/{id}/cancel") public ResponseEntity<Void> cancelOrder(@PathVariable String id) { orderAppService.cancel(id); // 调用领域服务 return ResponseEntity.ok().build(); }
• HATEOAS超媒体驱动:
{ "orderId": "123", "status": "PAID", "_links": { "cancel": { "href": "/orders/123/cancel", "method": "POST" } } }
2. 云原生与DDD协同演进
Sidecar模式实现防腐层
• Envoy WASM过滤:转换第三方协议(如SOAP→REST)。
# Envoy WASM配置 filters: - name: wasm config: vm_config: runtime: "envoy.wasm.runtime.v8" code: local: filename: "/etc/envoy/soap_to_rest.wasm"
Serverless领域函数
• AWS Lambda风控规则引擎:
def lambda_handler(event, context): risk_score = calculate_risk(event['user_id']) return {"risk_level": "HIGH" if risk_score > 80 else "LOW"}
3. 中台化架构的DDD适配
业务中台核心域抽象
• 用户中心:抽象认证、权限管理为通用领域服务。 • 商品中心:提供标准化的类目管理、SKU生成API。
数据中台实时数仓构建
• Flink处理领域事件:
DataStream<OrderEvent> stream = env.addSource(kafkaSource); stream.keyBy(event -> event.getUserId()) .window(TumblingEventTimeWindows.of(Time.hours(1))) .aggregate(new OrderCountAggregate());
五、工具链与效能提升
1. DDD全生命周期工具
设计工具
• Visual Paradigm建模:
classDiagram class Order { -String orderId -OrderStatus status +cancel() } Order --> OrderItem : contains
代码生成
• IDEA DDD插件:自动生成聚合根、仓储接口。
// 自动生成仓储接口 public interface OrderRepository extends Repository<Order, String> { Order findByOrderId(String orderId); }
BDD测试验证
• Cucumber场景定义:
Feature: Order Cancellation Scenario: User cancels an unpaid order Given an order with status "CREATED" When the user cancels the order Then the order status should be "CANCELLED"
2. 框架与中间件集成
DDD框架选型
• COLA架构:阿里开源的轻量级DDD框架,模块化清晰。
<!-- COLA组件依赖 --> <dependency> <groupId>com.alibaba.cola</groupId> <artifactId>cola-component-ddd</artifactId> <version>4.3.1</version> </dependency>
• Axon Framework:支持事件溯源和CQRS,适合复杂事件驱动系统。
领域事件总线集成
• Spring Cloud Stream + RocketMQ:
spring: cloud: stream: bindings: orderEvent-out: destination: order-events content-type: application/json rocketmq: binder: name-server: rocketmq-nameserver:9876
总结
本节通过大厂实战案例与现代化架构融合,展现了DDD在复杂业务场景下的生命力: • 阿里商品中心:通过限界上下文拆分与事件驱动,支撑亿级SKU管理。 • 腾讯支付系统:值对象与Saga模式保障金融级精度与事务一致性。 • 美团订单履约:混合锁策略与状态机设计应对高并发挑战。
未来方向: • 智能化工具链:AI辅助领域建模(如自动识别聚合根边界)。 • 云原生深化:Service Mesh与Serverless进一步降低防腐层实现成本。 • 实时化数据:Flink流处理与领域事件深度结合,驱动实时决策。
通过工具链与框架的持续演进,DDD将持续赋能企业构建高响应力、高可维护性的业务系统。
相关文章:
9.1.领域驱动设计
目录 一、领域驱动设计核心哲学 战略设计与战术设计的分野 • 战略设计:限界上下文(Bounded Context)与上下文映射(Context Mapping) • 战术设计:实体、值对象、聚合根、领域服务的构建原则 统一语言&am…...
如何配置光猫+路由器实现外网IP访问内部网络?
文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置(路由模式时) 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置(可选) 五、防火墙设置六、测试配置七、安全注意事…...
C++题题题题题题题题题踢踢踢
后缀表达式求值 #include<bits/stdc.h> #include<algorithm> using namespace std; string a[100]; string b[100]; stack<string> op; int la0,lb0; int main(){while(true){cin>>a[la];if(a[la]".") break;la;}for(int i0;i<la;i){if(…...
M. Moving Both Hands(反向图+Dijkstra)
Problem - 1725M - Codeforces 题目大意:给你一个有向图,起始点在1,问起始点分别与另外n-1个 点相遇的最短时间,无法相遇输出-1。 思路:反向建图,第一层建原图,第二层建反向图,两层…...
11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design
76个工业组件库示例汇总 参数化三维产品设计组件 (注塑模具与公差分析) 概述 这是一个交互式的 Web 组件,旨在演示简单的三维零件(如带凸台的方块)的参数化设计过程,并结合注塑模具设计(如开模动画)与公…...
智能座舱开发工程师面试题
一、基础知识类 简述智能座舱的核心组成部分及其功能 要求从硬件(如显示屏、传感器、控制器)和软件(操作系统、中间件、应用程序)层面展开,阐述各部分如何协同实现座舱的智能化体验。 对比 Android Automotive、QNX…...
【连载14】基础智能体的进展与挑战综述-多智能体系统设计
基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 在基于大语言模型的多智能体系统(LLM-MAS)中,合作目标和合…...
06.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending
本实例主要讲解内容 这个Three.js示例展示了**骨骼动画(Skinning)和变形动画(Morphing)**的结合应用。通过加载一个机器人模型,演示了如何同时控制角色的肢体动作和面部表情,实现更加丰富的角色动画效果。 核心技术包括: 多动画混合与淡入…...
【Java学习日记36】:javabeen学生系统
ideal快捷键...
.Net HttpClient 使用请求数据
HttpClient 使用请求数据 0、初始化及全局设置 //初始化:必须先执行一次 #!import ./ini.ipynb1、使用url 传参 参数放在Url里,形如:http://www.baidu.com?namezhangsan&age18, GET、Head请求用的比较多。优点是简单、方便࿰…...
详解 Java 并发编程 synchronized 关键字
synchronized 关键字的作用 synchronized 是 Java 中用于实现线程同步的关键字,主要用于解决多线程环境下的资源竞争问题。它可以修饰方法或代码块,确保同一时间只有一个线程可以执行被修饰的代码,从而避免数据不一致的问题。 synchronized…...
《Go小技巧易错点100例》第三十二篇
本期分享: 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全: 1)双存储结构: 包含原子化的 read(只读缓存,无锁快…...
时序约束高级进阶使用详解四:Set_False_Path
目录 一、背景 二、Set_False_Path 2.1 Set_false_path常用场景 2.2 Set_false_path的优势 2.3 Set_false_path设置项 2.4 细节区分 三、工程示例 3.1 工程代码 3.2 时序约束如下 3.3 时序报告 3.4 常规场景 3.4.1 设计代码 3.4.2 约束场景 3.4.3 约束对象总结…...
每日定投40刀BTC(16)20250428 - 20250511
定投 坚持 《恒道》 长河九曲本微流,岱岳摩云起累丘。 铁杵十年销作刃,寒窗五鼓淬成钩。已谙蜀栈盘空险,更蓄湘竹带泪遒。 莫问枯荣何日证,星霜满鬓亦从头。...
C# 高效处理海量数据:解决嵌套并行的性能陷阱
C# 高效处理海量数据:解决嵌套并行的性能陷阱 问题场景 假设我们需要在 10万条ID 和 1万个目录路径 中,快速找到所有满足以下条件的路径: 路径本身包含ID字符串该路径的子目录中也包含同名ID 初始代码采用Parallel.ForEach嵌套Task.Run&am…...
【Java EE初阶 --- 多线程(初阶)】线程安全问题
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 线程不安全的原因根本原因…...
从InfluxDB到StarRocks:Grab实现Spark监控平台10倍性能提升
Grab 是东南亚领先的超级应用,业务涵盖外卖配送、出行服务和数字金融,覆盖东南亚八个国家的 800 多个城市,每天为数百万用户提供一站式服务,包括点餐、购物、寄送包裹、打车、在线支付等。 为了优化 Spark 监控性能,Gr…...
《Redis应用实例》学习笔记,第一章:缓存文本数据
前言 最近在学习《Redis应用实例》,这本书并没有讲任何底层,而是聚焦实战用法,梳理了 32 种 Redis 的常见用法。我的笔记在 Github 上,用 Jupyter 记录,会有更好的阅读体验,作者的源码在这里:h…...
Redis 缓存
缓存介绍 Redis 最主要三个用途: 1)存储数据(内存数据库) 2)消息队列 3)缓存 对于硬件的访问速度,通常有以下情况: CPU 寄存器 > 内存 > 硬盘 > 网络 缓存的核心…...
Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析
Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析 在实时数据处理和流式计算领域,Apache Flink 已成为行业标杆。而 Flink CDC(Change Data Capture) 作为其生态中的重要组件,为数据库的实时变更捕获提供了强大的能力。 本文将从以下几个方面进行深入讲解: 什…...
缓存(4):常见缓存 概念、问题、现象 及 预防问题
常见缓存概念 缓存特征: 命中率、最大元素、清空策略 命中率:命中率返回正确结果数/请求缓存次数 它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。 最大元素(最大空间):缓存中可以存放的最大元素的…...
实战项目6(09)
目录 任务场景一 【r1配置】 【r2配置】 【r3配置】 任务场景二 【r1配置】 【r2配置】 【r3配置】 任务场景三 【r1配置】 【r2配置】 【r3配置】 任务场景一 按照下图完成网络拓扑搭建和配置 任务要求:在…...
MySQL 数据库故障排查指南
MySQL 数据库故障排查指南 本指南旨在帮助您识别和解决常见的 MySQL 数据库故障。我们将从问题识别开始,逐步深入到具体的故障类型和排查步骤。 1. 问题识别与信息收集 在开始排查之前,首先需要清晰地了解问题的现象和范围。 故障现象: 数…...
MacOS Python3安装
python一般在Mac上会自带,但是大多都是python2。 python2和python3并不存在上下版本兼容的情况,所以python2和python3可以同时安装在一台设备上,并且python3的一些语法和python2并不互通。 所以在Mac电脑上即使有自带python,想要使…...
锁相放大技术:从噪声中提取微弱信号的利器
锁相放大技术:从噪声中提取微弱信号的利器 一、什么是锁相放大? 锁相放大(Lock-in Amplification)是一种用于检测微弱信号的技术,它能够从强噪声背景中提取出我们感兴趣的特定信号。想象一下在嘈杂的派对上听清某个人…...
机器学习总结
1.BN【batch normalization】 https://zhuanlan.zhihu.com/p/93643523 减少 2.L1L2正则化 l1:稀疏 l2:权重减小 3.泛化误差 训练误差计算了训练集的误差,而泛化误差是计算全集的误差。 4.dropout 训练过程中神经元p的概率失活 一文彻底搞懂深度学习&#x…...
基于神经网络的无源雷达测向系统仿真实现
基于神经网络的无源雷达测向系统仿真实现 项目概述 本项目实现了基于卷积神经网络(CNN)的无源雷达方向到达角(DOA)估计系统。通过深度学习方法,系统能够从接收到的雷达信号中准确估计出信号源的方向,适用于单目标和多目标场景。相比传统的DOA估计算法&…...
《用MATLAB玩转游戏开发》Flappy Bird:小鸟飞行大战MATLAB趣味实现
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-Flappy Bird:小鸟飞行大战MATLAB趣味实现 文章目录 《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互…...
【C/C++】跟我一起学_C++同步机制效率对比与优化策略
文章目录 C同步机制效率对比与优化策略1 效率对比2 核心同步机制详解与适用场景3 性能优化建议4 场景对比表5 总结 C同步机制效率对比与优化策略 多线程编程中,同步机制的选择直接影响程序性能与资源利用率。 主流同步方式: 互斥锁原子操作读写锁条件变量无锁数据…...
linux 三剑客命令学习
grep Grep 是一个命令行工具,用于在文本文件中搜索打印匹配指定模式的行。它的名称来自于 “Global Regular Expression Print”(全局正则表达式打印),它最初是由 Unix 系统上的一种工具实现的。Grep 工具在 Linux 和其他类 Unix…...
【js基础笔记] - 包含es6 类的使用
文章目录 js基础js 预解析js变量提升 DOM相关知识节点选择器获取属性节点创建节点插入节点替换节点克隆节点获取节点属性获取元素尺寸获取元素偏移量标准的dom事件流阻止事件传播阻止默认行为事件委托 正则表达式js复杂类型元字符 - 基本元字符元字符 - 边界符元字符 - 限定符元…...
《Linux命令行大全(第2版)》PDF下载
内容简介 本书对Linux命令行进行详细的介绍,全书内容包括4个部分,第一部分由Shell的介绍开启命令行基础知识的学习之旅;第二部分讲述配置文件的编辑,如何通过命令行控制计算机;第三部分探讨常见的任务与必备工具&…...
补补表面粗糙度的相关知识(一)
表面粗糙度,或简称粗糙度,是指表面不光滑的特性。这个在机械加工行业内可以说是绝绝的必备知识之一,但往往也是最容易被忽略的,因为往往天天接触的反而不怎么关心,或者没有真正的去认真学习掌握。对于像我一样…...
Python实用工具:pdf转doc
该工具只能使用在英文目录下,且无法转换出图片,以及文本特殊格式。 下载依赖项 pip install PyPDF2 升级依赖项 pip install PyPDF2 --upgrade 查看库版本 python -c "import PyPDF2; print(PyPDF2.__version__)" 下载第二个依赖项 pip i…...
基于Dify实现对Excel的数据分析
在dify部署完成后,大家就可以基于此进行各种应用场景建设,目前dify支持聊天助手(包括对话工作流)、工作流、agent等模式的场景建设,我们在日常工作中经常会遇到各种各样的数据清洗、格式转换处理、数据统计成图等数据分…...
Win全兼容!五五 Excel Word 转 PDF 工具解决多场景转换难题
各位办公小能手们!今天给你们介绍一款超牛的工具——五五Excel Word批量转PDF工具V5.5版。这玩意儿专注搞批量格式转换,能把Excel(.xls/.xlsx)和Word(.doc/.docx)文档唰唰地变成PDF格式。 先说说它的核心功…...
java加强 -Collection集合
集合是一种容器,类似于数组,但集合的大小可变,开发中也非常常用。Collection代表单列集合,每个元素(数据)只包含1个值。Collection集合分为两类,List集合与set集合。 特点 List系列集合&#…...
BGP实验练习1
需求: 要求五台路由器的环回地址均可以相互访问 需求分析: 1.图中存在五个路由器 AR1、AR2、AR3、AR4、AR5,分属不同自治系统(AS),AR1 在 AS 100,AR2 - AR4 在 AS 200,AR5 在 AS …...
Nginx location静态文件映射配置
遇到问题? 以下这个Nginx的配置,愿意为访问https://abc.com会指向一个动态网站,访问https://abc.com/tongsongzj时会访问静态网站,但是配置之后(注意看后面那个location /tongsongzj/静态文件映射的配置)&…...
四、Hive DDL表定义、数据类型、SerDe 与分隔符核心
在理解了 Hive 数据库的基本操作后,本篇笔记将深入到数据存储的核心单元——表 (Table) 的定义和管理。掌握如何创建表、选择合适的数据类型、以及配置数据的读写方式 (特别是 SerDe 和分隔符),是高效使用 Hive 的关键。 一、创建表 (CREATE TABLE)&…...
每日脚本 5.11 - 进制转换和ascii字符
前置知识 python中各个进制的开头 二进制 : 0b 八进制 : 0o 十六进制 : 0x 进制转换函数 : bin() 转为2进制 oct() 转换为八进制的函数 hex() 转换为16进制的函数 ascii码和字符之间的转换 : chr(97) 码转为字符 …...
cookie和session的区别
一、基本概念 1. Cookie 定义:Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据(通常小于4KB),浏览器会在后续请求中自动携带该数据。作用:用于跟踪用户状态(如登录状态)、记…...
Kotlin Multiplatform--03:项目实战
Kotlin Multiplatform--03:项目实战 引言配置iOS开发环境配置项目环境运行程序 引言 本章将会带领读者进行项目实战,了解如何从零开始编译一个能同时在Android和iOS运行的App。开发环境一般来说需要使用Macbook,笔者没试过Windows是否能开发。…...
图形学、人机交互、VR/AR领域文献速读【持续更新中...】
(1)笔者在时间有限的情况下,想要多积累一些自身课题之外的新文献、新知识,所以开了这一篇文章。 (2)想通过将文献喂给大模型,并向大模型提问的方式来快速理解文献的重要信息(如基础i…...
opencascade.js stp vite 调试笔记
Hello, World! | OpenCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 当你不知道文件写哪的时候trae还是有点用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plugi…...
openharmony系统移植之gpu mesa3d适配
openharmony系统移植之gpu mesa3d适配 文章目录 openharmony系统移植之gpu mesa3d适配1. 环境说明2. gpu内核panfrost驱动2.1 使能panfrost驱动2.2 panfrost dts配置 3. buildroot下测试gpu驱动3.1 buildroot配置编译 4. ohos下mesa3d适配4.1 ohos下mesa3d编译调试4.1.2 编译4.…...
Java开发经验——阿里巴巴编码规范经验总结2
摘要 这篇文章是关于Java开发中阿里巴巴编码规范的经验总结。它强调了避免使用Apache BeanUtils进行属性复制,因为它效率低下且类型转换不安全。推荐使用Spring BeanUtils、Hutool BeanUtil、MapStruct或手动赋值等替代方案。文章还指出不应在视图模板中加入复杂逻…...
Linux中常见开发工具简单介绍
目录 apt/yum 介绍 常用命令 install remove list vim 介绍 常用模式 命令模式 插入模式 批量操作 底行模式 模式替换图 vim的配置文件 gcc/g 介绍 处理过程 预处理 编译 汇编 链接 库 静态库 动态库(共享库) make/Makefile …...
深入理解深度Q网络DQN:基于python从零实现
DQN是什么玩意儿? 深度Q网络(DQN)是深度强化学习领域里一个超厉害的算法。它把Q学习和深度神经网络巧妙地结合在了一起,专门用来搞定那些状态空间维度特别高、特别复杂的难题。它展示了用函数近似来学习价值函数的超能力…...
使用lldb看看Rust的HashMap
目录 前言 正文 读取桶的状态 获取键值对 键值对的指针地址 此时,读取数据 读取索引4的键值对 多添加几个键值对 使用i32作为键,&str作为值 使用i32作为键,String作为值 前言 前面使用ldb看了看不同的类型,这篇再使用…...