当前位置: 首页 > news >正文

理解DDD领域驱动设计思想

一、引言

在软件开发的广袤领域中,领域驱动设计(Domain-Driven Design,简称 DDD)犹如一颗璀璨的明星,备受瞩目。对于期望运用 DDD 开展项目的研发人员而言,明晰 DDD 的本质是实现其有效应用的基石。需注意的是,DDD 并非 MVC 式的工程结构,也非等同于微服务架构,更非单纯的设计模式。那么,DDD 究竟为何物?

二、DDD 的定义与核心概念

(一)DDD 的定义
DDD 即领域驱动设计(Domain-Driven Design),是一种举足轻重的软件开发方法,由 Eric Evans 在其著作《领域驱动设计:软件核心复杂性应对之道》中率先提出。DDD 着重于创建与业务领域紧密相连的软件模型,以确保软件能够精准地化解实际问题。

(二)DDD 的核心理念

  1. 领域模型(Domain Model):是对特定业务领域知识的精准阐释,涵盖实体(Entities)、值对象(Value Objects)、服务(Services)、聚合(Aggregates)、聚合根(Aggregate Roots)等概念。领域模型乃 DDD 的核心之所在,它反映了业务专家的语言和决策。
  2. 统一语言(Ubiquitous Language):是开发团队与业务专家共同运用的语言,在整个项目中保持一致,确保所有人对业务概念达成相同的理解,从而降低沟通成本并减少误解。
  3. 限界上下文(Bounded Context):是明确界定的系统边界,在此边界内部存有一套统一的模型和语言。不同的限界上下文之间可能存在不同的模型,它们通过上下文映射(Context Mapping)来实现交互与集成。
  4. 聚合(Aggregate):是一组相关对象的集合,被视作数据修改的单元。每个聚合都具有一个聚合根,它是外部对象与聚合内部对象交互的唯一入口。
  5. 领域服务(Domain Services):当某些行为不自然地归属于任何实体或值对象时,这些行为可被定义为领域服务。领域服务通常代表着领域中的一些操作或业务逻辑。
  6. 应用服务(Application Services):作为软件的组成部分,它协调领域对象来执行任务。应用服务负责应用程序的工作流程,但并不包含业务规则或知识。
  7. 基础设施(Infrastructure):包含为领域模型提供持久化机制(如数据库)、消息传递、应用程序的配置等技术组件。
  8. 领域事件(Domain Events):是领域中发生的具有意义的业务事件,它们能够触发其他子系统的反应或流程。

DDD 的目标在于将软件的关注点聚焦于核心领域,并借助丰富的领域模型来管控复杂性,进而提升软件的质量和可维护性。DDD 强调与业务专家的紧密协作,以确保软件解决方案能够精准地反映业务需求。通过此种方式,软件开发团队能够打造出更为灵活、可扩展且与业务紧密融合的系统。

三、DDD 中的软件设计方法

(一)范式 (Paradigms)
范式乃是软件设计与开发的基本风格或哲学,它界定了编程的基本原则与模式。常见的软件设计范式包括:

  1. 结构化编程:强调程序结构的重要性,运用顺序、选择和循环控制结构。
  2. 面向对象编程 (OOP):立足于对象的概念,将数据和处理数据的方法进行封装。
  3. 函数式编程:将计算视作数学函数的评估,规避状态改变和可变数据。
  4. 事件驱动编程:以事件为核心,响应用户操作、消息或其他系统事件。

(二)模型 (Models)
模型是对软件系统的抽象表述,用于助力理解、设计和测试系统。常用的软件设计模型包含:

  1. UML (统一建模语言):一套图形化的建模语言,用于描述、设计和文档化软件项目。
  2. ER 模型 (实体 - 关系模型):应用于数据库设计,描绘数据的实体及其之间的关系。
  3. 状态机模型:描述系统可能的状态、事件以及在这些事件发生时的转换。

(三)框架 (Frameworks)
框架是一套预先设定的代码库和组件,用于为软件开发提供骨架。框架通常定义了应用程序的结构,提供了一组通用的功能和模式,以便开发者能够专注于实现特定的业务逻辑。例如:

  1. Spring Framework:一个针对 Java 应用程序的全面编程和配置模型。
  2. Ruby on Rails:一个用于快速开发 Web 应用程序的 Ruby 框架。
  3. Django:一个高级 Python Web 框架,鼓励快速开发和干净、实用的设计。
     

(四)方法论 (Methodologies)
方法论是一套指引软件开发过程的规则和实践,涵盖项目管理、开发流程、团队协作等方面。常见的软件开发方法论有:

  1. 敏捷开发:一种迭代和增量的开发方法,强调灵活性和客户合作。
  2. Scrum:一种敏捷开发框架,用于管理复杂的软件和产品开发。
  3. 瀑布模型:一种线性顺序的开发方法,将项目划分为不同阶段,每个阶段完成后才可进入下一个阶段。

(五)主要活动
软件设计的主要活动涵盖建模、测试、工程、开发、部署和维护。

  1. 建模 (Modeling):通过创建模型来呈现系统的不同方面,例如运用 UML 图来描述系统架构。
  2. 测试 (Testing):确保软件的质量,包含单元测试、集成测试、系统测试和验收测试。
  3. 工程 (Engineering):应用工程原则和实践来构建软件,包括需求分析、设计、实现和测试。
  4. 开发 (Development):编写代码并实现功能,将设计转化为实际的软件产品。
  5. 部署 (Deployment):将软件发布到生产环境,使其可供用户使用。
  6. 维护 (Maintenance):在软件发布后对其进行更新和改进,修复缺陷,提升性能和适应性。

每个活动均是软件开发生命周期的重要构成部分,它们相互依存,共同保障软件项目的成功。

四、DDD 的设计手段与概念

(一)DDD 是什么
DDD 作为一种软件设计方法,是指导软件工程设计的有效手段,它提供了各类切割工程模型的技巧,如领域、界限上下文、实体、值对象、聚合、工厂、仓储等。通过 DDD 的指导思想,我们能够在前期投入更多时间,更为合理地规划出可持续迭代的工程设计。

在 DDD 中,存在一套共识的工程两阶段设计手段,分别为战略设计战术设计

  1. 战略设计:主要应对繁杂的业务需求,通过抽象、分治的过程,将其合理地拆分为独立的多个微服务,从而实现分而治之。评估拆分是否合理的标准在于需求开发上线时,是否每次都需要大量操作多个微服务的开发和上线。倘若出现此种情况,那么这种战略设计便是一种失败的微服务单体设计。因此,少数几个中等规模的单体应用,周边环绕着一个服务生态系统的设计,更具实际意义。
  2. 战术设计:在此范畴下,主要探讨如何基于面向对象思维,运用领域模型来表达业务概念。在未进行领域模型设计的架构中,通常映射到 MVC 三层架构下,Service + 数据模型的开发模式会致使 Service 变得扁平且包含大量复杂的业务逻辑代码。加之行为对象与功能逻辑的分离,贫血模型的开发方式,使得行为对象的不断交叉使用,这是导致系统复杂度持续增加且难以维护的根本原因。故而,在这一阶段,需要设计每一个能够表达领域概念的模型,并运用实体、聚合、领域服务来承载。

(二)DDD 的概念

  1. 充血模型
    • 定义:充血模型是将对象的属性信息与行为逻辑汇聚到一个类中,常用的手段如在对象内提供属于当前对象的信息校验、拼装缓存 Key、不含服务接口调用的逻辑处理等。
    • 扩展:充血不仅可以是一个类的设计和一个类内的方法设计,也可以是整个包结构一个包下包括了用于实现此包 Service 服务所需的各类零部件(模型、仓储、工厂),也可被视为充血模型。同时,我们还会在一个同类的类下,提供对应的内部类,如用户实名,包括通信类、实名卡、银行卡、四要素等。如此在代码编写中能够更清晰地看到子类的所属信息,更易于理解代码逻辑,也便于维护迭代。
  1. 领域模型
    • 定义:领域模型是指特定业务领域内,业务规则、策略以及业务流程的抽象与封装。在设计手段上,通过风暴模型拆分领域模块,形成界限上下文。其最大的区别在于将原有的众多 Service + 数据模型的方式,拆分为独立的有边界的领域模块。每个领域内创建自身所属的领域对象(实体、聚合、值对象)、仓储服务(DAO 操作)、工厂、端口适配器 (调用外部接口的手段)等
    • 演变:在原本的 Service + 贫血的数据模型开发指导下,Service 串联调用每一个功能模块。这些基础设施(对象、方法、接口)是相互调用的。这是由于贫血模型未进行面向对象的设计,所有的需求开发仅有详细设计。转换到充血模型下,以一个领域功能为聚合,将拆分一个领域内所需的 Service 作为领域服务,将 VO、Req、Res 重新设计为领域对象,将 DAO、Redis 等持久化操作为仓储等。例如,一套账户服务中的授信认证、开户、提额降额等,每一个均是一个独立的领域,在每个独立的领域内,创建自身领域所需的各项信息。
    • 特点:领域模型自身仅关注业务功能的实现,不与外部任何接口和服务直接连接。而是通过仓库和端口适配器,定义调用外部数据的含有出入参对象的接口标准,让基础设施层进行具体的调用实现。通过这样的方式,使领域只关心业务实现,同时做好防腐工作。
  1. 实体、聚合、值对象
    • 实体
      • 概念:实体是以领域服务功能目标为导向,依托于持久化层数据设计的领域对象。持久化 PO 对象是原子类对象,不具备业务语义,而实体对象是具有业务语义且具有唯一标识的对象,伴随于领域服务方法的全生命周期对象。
      • 特征
        • 唯一标识:实体具有一个能够区分其他实体的标识符,可以是 ID、复合键或自然键,关键在于能够唯一地标识实体实例。
        • 领域标识:实体的标识通常来源于业务领域,在系统中是独一无二的。
        • 委派标识:在某些情况下,实体的标识可能是由 ORM 框架自动生成的,如数据库中的自增主键。
      • 用途
        • 表达业务概念:用于在软件中表达具体的业务概念,如用户、订单、交易等。
        • 封装业务逻辑:实体不仅承载数据,还封装了业务规则和逻辑。
        • 保持数据一致性:负责维护自身的状态和数据一致性。
      • 实现手段
        • 定义实体类:包含实体的属性、构造函数、方法等。
        • 实现唯一标识:为实体类提供一个唯一标识的属性,如 ID,并确保在实体的生命周期中这个标识保持不变。
        • 封装行为:在实体类中实现业务逻辑的方法。
        • 使用 ORM 框架:将实体映射到数据库表中,简化数据持久化的操作。
        • 实现领域服务:对于跨实体或跨聚合的操作,实现领域服务来处理。
        • 使用领域事件:当实体的状态发生变化时,发布领域事件,通知其他部分的系统进行相应的处理。
    • 值对象
      • 概念:值对象是由一组属性构成的,它们共同描绘了一个领域概念。与实体不同,值对象无需具有一个唯一的标识符来对其进行区分。值对象通常是不可变的,一旦创建,其状态不应改变
      • 特征
        • 不可变性:值对象一旦被创建,其状态就不应发生变化。
        • 等价性:值对象的等价性是基于对象的属性值,而非对象的引用。
        • 替换性:任何需要改变值对象的操作都会导致创建一个新的值对象实例,而非修改现有的实例。
        • 侧重于描述事物的状态:通常用于描述事物的状态,而非事物的唯一身份。
        • 可复用性:值对象可以在不同的领域实体或其他值对象中重复使用。
      • 用途
        • 金额和货币(如价格、工资、费用等)。
        • 度量和数据(如重量、长度、体积等)。
        • 范围或区间(如日期范围、温度区间等)。
        • 复杂的数学模型(如坐标、向量等)。
        • 任何其他需要封装的属性集合。
      • 实现手段
        • 定义不可变类:确保类的所有属性都是私有的,并且只能通过构造函数来设置。
        • 重写 equals 和 hashCode 方法:确保值对象的等价性是基于它们的属性值,而非对象的引用。
        • 提供只读访问器:只提供获取属性值的方法,不提供修改属性值的方法。
        • 使用工厂方法或构造函数创建实例:确保值对象的有效性和一致性。
        • 考虑序列化支持:若值对象需要在网络上传输或存储到数据库中,需要提供序列化和反序列化的支持。
    • 聚合
      • 概念:聚合是领域模型中的关键概念,它是一组具有内聚性的相关对象的集合,这些对象共同协作以执行某些业务规则或操作。聚合定义了一组对象的边界,这些对象可被视为一个单一的单元进行处理。
      • 特征
        • 一致性边界:确保其内部对象的状态变化是一致的。
        • 根实体:每个聚合都有一个根实体(Aggregate Root),它是聚合的入口点,拥有一个全局唯一的标识符,其他对象通过根实体与聚合进行交互。
        • 事务边界:聚合也定义了事务的边界,在聚合内部,所有的变更操作应当是原子的,即它们要么全部成功,要么全部失败,以此来保证数据的一致性。
      • 用途
        • 封装业务逻辑:通过将相关的对象和操作封装在一起,提供了一个清晰的业务逻辑模型,有助于业务规则的实施和维护。
        • 保证一致性:确保内部状态的一致性,通过定义清晰的边界和规则,聚合可以在内部强制执行业务规则,从而保证数据的一致性。
        • 简化复杂性:通过组织相关的对象,简化了领域模型的复杂性。这有助于开发者更好地理解和扩展系统。
      • 实现手段
        • 定义聚合根:选择合适的聚合根是实现聚合的首要步骤,聚合根应当是能够代表整个聚合的实体,并且拥有唯一标识。
        • 限制访问路径:只能通过聚合根来修改聚合内的对象,不允许直接修改聚合内部对象的状态,以此来维护边界和一致性。
        • 设计事务策略:在聚合内部实现事务一致性,确保操作要么全部完成,要么全部回滚。对于聚合之间的交互,可以采用领域事件或其他机制来实现最终一致性。
        • 封装业务规则:在聚合内部实现业务规则和逻辑,确保所有的业务操作都遵循这些规则。
        • 持久化:聚合根通常与数据持久化层进行交互,以保存聚合的状态。这通常涉及到对象 - 关系映射(ORM)或其他数据映射技术。
  1. 仓储和适配器
    • 特征
      • 封装持久化操作:Repository 负责封装所有与数据源交互的操作,如创建、读取、更新和删除(CRUD)操作。
      • 领域对象的集合管理:Repository 通常被视为领域对象的集合,提供了查询和过滤这些对象的方法,使得领域对象的获取和管理更为便捷。
      • 抽象接口:Repository 定义了一个与持久化机制无关的接口,使得领域层的代码能够在不同的持久化机制之间进行切换,而无需修改业务逻辑。
    • 用途
      • 数据访问抽象:为领域层提供了一个清晰的数据访问接口,使得领域对象能够专注于业务逻辑的实现,而非数据访问的细节。
      • 领域对象的查询和管理:使得对领域对象的查询和管理变得更加方便和灵活,支持复杂的查询逻辑。
      • 领域逻辑与数据存储分离:通过 Repository 模式,领域逻辑与数据存储逻辑分离,提高了领域模型的纯粹性和可测试性。
      • 优化数据访问:Repository 实现可以包含数据访问的优化策略,如缓存、批处理操作等,以提升应用程序的性能。
    • 实现手段
      • 定义 Repository 接口:在领域层定义一个或多个 Repository 接口,这些接口声明了所需的数据访问方法。
      • 实现 Repository 接口:在基础设施层或数据访问层实现这些接口,具体实现可能是使用 ORM 框架,如 MyBatis、Hibernate 等,或者直接使用数据库访问 API,如 JDBC 等。
      • 依赖注入:在应用程序中使用依赖注入(DI)来将具体的 Repository 实现注入到需要它们的领域服务或应用服务中。
      • 使用规范模式(Specification Pattern):为了构建复杂的查询,可以结合使用规范模式,将业务规则封装为单独的业务逻辑单元,这些单元可以被 Repository 用来构建查询。
      • 仓储解耦:仓储解耦的手段运用了依赖倒置的设计,所有领域需要的外部服务,不再直接引入外部的服务,而是通过定义接口的方式在领域层定义,在基础设施层实现。这样做的好处是,当外部服务发生变化时,领域层的代码不需要进行修改,只需要修改基础设施层的实现即可。
         

五、DDD 在实际项目中的应用

(一)项目背景

以一个电商平台为例,随着业务的不断发展,系统变得越来越复杂,传统的开发方式已经难以满足需求。存在的问题包括:业务逻辑分散在各个模块中,导致代码难以理解和维护;系统的扩展性差,难以应对新的业务需求;不同模块之间的沟通成本高,容易出现理解不一致的情况。

(二)DDD 的应用过程
1. 领域分析
- 与业务专家进行深入沟通,了解电商业务的流程和规则。
- 识别出核心领域概念,如商品、订单、用户、库存等。
- 确定限界上下文,将电商系统划分为商品管理、订单管理、用户管理、库存管理等多个限界上下文。
2. 建立领域模型
- 针对每个限界上下文,建立相应的领域模型。
- 例如,在订单管理限界上下文中,定义订单实体、订单值对象、订单聚合等。
- 确定实体之间的关系,以及聚合的边界和规则。
3. 设计战术层面
- 根据领域模型,设计相应的领域服务、应用服务和基础设施。
- 领域服务负责实现核心业务逻辑,应用服务负责协调领域对象的操作,基础设施提供技术支持。
- 例如,在订单管理中,设计订单创建、订单支付、订单发货等领域服务。
4. 代码实现
- 按照DDD的设计原则,进行代码的实现。
- 确保代码的结构清晰,易于理解和维护。
- 运用充血模型,将业务逻辑封装在领域对象中。
5. 持续优化
- 在项目开发过程中,不断对领域模型和代码进行优化。
- 根据业务需求的变化,及时调整领域模型和设计。
- 进行持续集成和测试,确保系统的质量和稳定性。

(三)应用效果
通过应用DDD,电商平台系统的质量和可维护性得到了显著提升。
1. 代码的可读性和可理解性增强,新成员能够更快地熟悉业务和代码。
2. 系统的扩展性得到了提高,能够更轻松地应对新的业务需求。
3. 不同模块之间的沟通更加顺畅,减少了因理解不一致而导致的问题。

六、总结

领域驱动设计是一种以领域为核心的软件开发方法,通过深入理解业务领域,建立清晰的领域模型,能够有效地提高软件的质量和可维护性。在实际项目中,应用DDD需要团队成员具备良好的业务理解能力和技术水平,同时需要不断地实践和总结经验。只有这样,才能真正发挥DDD的优势,打造出高质量的软件系统。

希望本文能够为广大开发者提供一些有益的参考,让我们共同在领域驱动设计的道路上不断探索和前行。

相关文章:

理解DDD领域驱动设计思想

一、引言 在软件开发的广袤领域中,领域驱动设计(Domain-Driven Design,简称 DDD)犹如一颗璀璨的明星,备受瞩目。对于期望运用 DDD 开展项目的研发人员而言,明晰 DDD 的本质是实现其有效应用的基石。需注意…...

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作,那么恭喜你,你已经踏上了一段充满魔法与惊喜的旅程!不过,别忘了,视频的灵魂不仅仅在于画面,更在于那直击心灵的音效。 想象一下,一个精心剪辑的片段,…...

12.2 使用prometheus-sdk向pushgateway打点

本节重点介绍 : 使用golang sdk打prometheus4种指标,推送到pushgateway gauge、counter、histogram、summary的初始化4种类似的设置值的方法推送到pushgateway的方法 prometheus配置采集pushgateway,grafana上配大盘 golang-sdk 项目地址 https://git…...

HTTPS 详解

HTTPS 是以安全为目标的 HTTP 通道,它在 HTTP 中加入 SSL 层以提高数据传输的安全性。HTTP 被用于在 Web 浏览器和网站服务器之间传递信息,但以明文形式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务…...

Microsoft Edge 使用方法与秘诀概览

目录 ​编辑引言 Microsoft Edge 功能与技巧概览 掌握这些设置技巧,让 Edge 浏览器的体验更干净 1. 使用阅读视图 2. 开启广告过滤 3. 管理扩展 4. 个性化新标签页 5. 使用网页截图 6. 清理浏览器缓存 7. 管理启动设置 8. 自定义地址栏建议 9. 使用内置笔…...

【视频】onvif、RTP、RTCP、SDP、RTSP、gb21818区别

ONVIF (Open Network Video Interface Forum): ONVIF是一个全球性的开放网络视频接口论坛,致力于发展基于IP网络的物联网设备的标准化。它提供了一个通用的标准接口,使不同厂商生产的网络视频产品能够互相兼容。 RTP (Real-time Transport Protocol): R…...

8-4 循环神经网络

对于 (8.4.2)中的函数 f f f,隐变量模型不是近似值。 毕竟 h t h_{t} ht​是可以仅仅存储到目前为止观察到的所有数据, 然而这样的操作可能会使计算和存储的代价都变得昂贵。 回想一下,我们在前面讨论过的具有隐藏单元的隐藏层。 值得注意的…...

Linux系统编程 --- 多线程

线程:是进程内的一个执行分支,线程的执行粒度,要比进程要细。 一、线程的概念 1、Linux中线程该如何理解 地址空间就是进程的资源窗口。 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是&#xff1…...

Grafana中的rate与irate以及histogram

用法 rate rate函数用于计算一个时间序列在给定时间范围内的平均速率。它对每个数据点进行线性插值来计算速率,因此对于平滑和稳定的数据来说,rate是一个不错的选择。语法如下: rate(metric_name[time_range])metric_name: 指标名称。time…...

什么是网络安全态势感知

态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力,是以安全大数据为基础,从全局视角提升对安全威胁的发现识别、理解分析、响应处置能力的一种方式、最终是为了决策与行动,是安全能力的落地 态势感知的重要性 随着网络与信息技术的…...

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {...

高效同步与处理:ADTF流服务在自动驾驶数采中的应用

目录 一、ADTF 流服务 1、流服务源&#xff08;Streaming Source&#xff09; 2、流服务汇&#xff08;Streaming Sink&#xff09; 二、数据链路 1、数据管道&#xff08;Data Pipe&#xff09; 2、子流&#xff08;Substreams&#xff09; 3、触发管道&#xff08;Tri…...

【Arduino】ATmega328PB 连接 LSM6DS3 姿态传感器,并读数据(不确定 ESP 系列是否可行,但大概率是可行的)

总览 1.初始化 ATmega328PB&#xff0c;默认大家已经完成了 328 的配置准备工作&#xff0c;已经直接能够向里面写入程序 2.接线&#xff0c;然后验证 mega328 的 I2C 设备接口能否扫描到 LSM6DS3 3.编写代码&#xff0c;上传&#xff0c;查看串口数据。完成。 一、初始化 AT…...

live2d + edge-tts 优雅的实现数字人讲话 ~

震惊&#xff01;live2d数字人竟开口说话 ~ 之前有想做数字人相关项目&#xff0c;查了一些方案。看了一些三方大厂的商用方案&#xff0c;口型有点尴尬&#xff0c;而且很多是采用视频流的方案&#xff0c;对流量的消耗很大。后来了解了live2d 技术&#xff0c;常在博客网页上…...

二进制安装php

下载php二进制包&#xff1a; 官网地址&#xff1a;https://www.php.net/releases/ PHP: Releaseshttps://www.php.net/releases/在里边可以选择自己要下载的包进行下载&#xff1b; 下载完成后进行解压&#xff1a; tar xvzf php-7.3.12.tar.gz 解压后 进入目录进行预编…...

旧版Pycharm支持的python版本记录

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;旧版Pycharm支持的python版本记录-CSDN博客 前言&#xff1a;近期由于打算研究GitHub上一个开源量化交易平台开发框架&#xff0c;但是该框架是基于python3.10的版本开发&#xff0c;所…...

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…...

C++面试基础系列-struct

系列文章目录 文章目录 系列文章目录C面试基础系列-struct1.C中struct2.C中struct2.1.同名函数2.2.typedef定义结构体别名2.3.继承 3.总结3.1.C和C中的Struct区别 4.struct字节对齐5.struct与const 关于作者 C面试基础系列-struct 1.C中struct struct里面只能放数据类型&#…...

代码随想录算法训练营 | 动态规划 part05

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 例子&#xff1a; 背包可容纳重…...

英特尔XPU大模型应用创新

...

仿Muduo库实现高并发服务器——socket网络通信模块

本项目就是基于TCP网络通信搭建的。 TCP: 客户端&#xff1a;socket(),connect(). 服务端&#xff1a;socket(),bind(),listen(),accept(). 下面代码就是对原生API网络套接字的封装。需要熟悉原生API网络套接字接口。 下面这段代码&#xff0c;没什么好讲的&#xff0c;就不…...

模型 神经网络(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。仿脑智能&#xff0c;深度学习&#xff0c;精准识别。 1 神经网络的应用 1.1 鸢尾花分类经典问题 神经网络的一个经典且详细的经典应用是鸢尾花分类问题 。主要是通过构建一个神经网络模型来自动区分…...

事务的使用

1.如何使用事务: 1.1.事务的完成过程&#xff1a; 1.步骤1&#xff1a;开启事务2.步骤2&#xff1a;一系列的DML操作3.步骤3&#xff1a;事务结束状态&#xff1a;提交事务(COMMIT)&#xff0c;中止事务&#xff08;事务回滚ROLLBACK&#xff09; 1.2.事务分类&#xff1a; …...

【免费】企业级大模型应用推荐:星环科技无涯·问知

无涯问知是星环科技发布的大模型应用系统&#xff0c;那么我们先简单了解下星环科技吧&#xff01; 星环科技&#xff08;股票代码&#xff1a;688031&#xff09;致力于打造企业级大数据和人工智能基础软件&#xff0c;围绕数据的集成、存储、治理、建模、分析、挖掘和流通等数…...

从〇 搭建PO模式的Web UI自动化测试框架

Page Object模式简介 核心思想 将页面元素和操作行为封装在独立的类中&#xff0c;形成页面对象&#xff08;Page Object&#xff09;。每个页面对象代表应用程序中的一个特定页面或组件。 优点&#xff1a; 代码复用性高 页面对象可以在多个测试用例中复用。 易于维护 …...

在Ubuntu中重装Vscode(没有Edit Configurations(JSON)以及有错误但不标红波浪线怎么办?)

在学习时需要将vscode删除重装&#xff0c;市面上很多方法都不能删干净&#xff0c;删除之后拓展都还在。因此下面的方法可以彻底删除。注意&#xff0c;我安装时使用的是snap方法。 如果你的VScode没有Edit Configurations(JSON)&#xff0c;以及有错误但不标红波浪线的话&…...

Oracle 用户-表空间-表之间关系常用SQL

问题&#xff1a; 当某一个表数据量特别大&#xff0c;突然插入数据一直失败&#xff0c;可能是表空间不足&#xff0c;需要查看表的使用率 用户-表空间-表之间关系&#xff1a;用户可以有多个表空间&#xff0c;表空间可以有多个表&#xff0c;表只能拥有一个表空间和用户 1.…...

家政服务管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理阿姨管理&#xff0c;家政公司管理&#xff0c;服务项目管理&#xff0c;家政预约管理&#xff0c;评价管理&#xff0c;留言板管理&#xff0c;系统管理 微信端账号功能包括…...

【算法】并查集的介绍与使用

1.并查集的概论 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&#xff0c;我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成&#xff1a; …...

Shell——运算符

在 Shell 编程中&#xff0c;运算符用于执行各种类型的操作&#xff0c;如算术运算、字符串比较、文件测试等。以下是 Shell 中常用的运算符分类和示例&#xff1a; 1. 算术运算符 Shell 中使用 expr 或 $(( ... )) 来进行算术运算。 : 加法-: 减法*: 乘法/: 除法%: 取余**:…...

SweetAlert2

1. SweetAlert2 SweetAlert2是一个基于JavaScript的库, 用于在网页上替换标准的警告框(alert), 确认框(confirm)和提示框(prompt), 并提供更加美观和用户友好的界面.需要在项目中引入SweetAlert2, 可以通过CDN链接或者将库文件下载到你的项目中来实现这一点. 通过CDN引入:<…...

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…...

Java版自动化测试之Selenium

1. 准备 编程语言&#xff1a;Java JDK版本&#xff1a;17 Maven版本&#xff1a;3.6.1 2. 开始 声明&#xff1a;本次只测试Java的Selenium自动化功能 本次示例过程&#xff1a;打开谷歌游览器&#xff0c;进入目标网址&#xff0c;找到网页的输入框元素&#xff0c;输入指…...

【计算机网络】——计算机网络的性能指标

速率&#xff08;speed&#xff09; 连接在计算机网络上的主机在数字信道上传送数据的速率。 影响条件&#xff1a; 带宽&#xff08;band width&#xff09; 指在固定的时间可传输的资料数量 单位&#xff1a;bps或HZ 吞吐量&#xff08;throughtput&#xff09; 指对网络、…...

MongoDB数据类型介绍

MongoDB作为一种高性能、开源、无模式的文档型数据库&#xff0c;支持丰富的数据类型&#xff0c;以满足各种复杂的数据存储需求。本文将详细介绍MongoDB支持的主要数据类型&#xff0c;包括数值类型、字符串类型、日期和时间类型、布尔类型、二进制类型、数组、对象以及其他扩…...

【SpringBoot】SpringBoot 中 Bean 管理和拦截器的使用

目录 1.Bean管理 1.1 自定义Bean对象 1.2 Bean的作用域和生命周期 2.拦截器的使用 1.Bean管理 默认情况下&#xff0c;Spring项目启动时&#xff0c;会把我们常用的Bean都创建好放在IOC容器中&#xff0c;但是有时候我们自定义的类需要手动配置bean&#xff0c;这里主要介绍…...

Spring IoCDI(中)--IoC的进步

通过上文的讲解和学习, 我们已经知道了Spring IoC 和DI的基本操作, 接下来我们来系统的学习Spring IoC和DI 的操作. 前⾯我们提到IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对 象&#xff0c;也就是bean的存储。 1. Bean的…...

读软件开发安全之道:概念、设计与实施02经典原则

1. CIA原则 1.1. 软件安全都构建在信息安全的三大基本原则之上&#xff0c;即机密性(confidentiality)、完整性(integrity)和可用性(availability) 1.2. 双方交换的数据 1.2.1. 从技术上看&#xff0c;端点之间的数据交换本身就会削弱交互的机密性 1.2.2. 隐藏通信数据量的一…...

MySQL中处理JSON数据:大数据分析的新方向,详解与示例

文章目录 1. MySQL中的JSON数据类型2. JSON函数和运算符3. 创建JSON列的表4. 插入JSON数据5. 查询JSON数据6. 复杂查询和聚合7. JSON 数据的索引8. 总结 在当今的大数据时代&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&a…...

【图形学】TA之路-矩阵

在 Unity 中&#xff0c;矩阵广泛用于处理各种图形变换&#xff0c;例如平移、旋转、缩放等。矩阵的使用不仅限于三维空间&#xff0c;还可以应用于二维空间的操作。了解矩阵及其运算对于游戏开发和计算机图形学非常重要。Unity 中使用的是行向量不是列向量&#xff0c;这个要注…...

LAMM: Label Alignment for Multi-Modal Prompt Learning

系列论文研读目录 文章目录 系列论文研读目录文章题目含义AbstractIntroductionRelated WorkVision Language ModelsPrompt Learning MethodologyPreliminaries of CLIPLabel AlignmentHierarchical Loss 分层损失Parameter Space 参数空间Feature Space 特征空间Logits Space …...

mac编译opencv 通用架构库的记录

1,通用架构 (x86_64;arm64&#xff09;要设置的配置项&#xff1a; CPU_BASELINE CPU_DISPATCH 上面这两个我设置成SSE_3&#xff0c;其他选项未尝试&#xff0c;比如不设置。 CMAKE_OSX_ARCHITECTURES:x86_64;arm64 WITH_IPP:不勾选 2,contrib库的添加&#xff1a; 第一次…...

Python 向IP地址发送字符串

Python 向IP地址发送字符串 在网络编程中&#xff0c;使得不同设备间能够进行数据传输是一项基本任务。Python提供了强大的库&#xff0c;帮助开发者轻松地实现这种通信。本文将介绍如何使用Python通过UDP协议向特定的IP地址发送字符串信息。 UDP协议简介 UDP&#xff08;用…...

上升响应式Web设计:纯HTML和CSS的实现技巧-1

响应式Web设计&#xff08;Responsive Web Design, RWD&#xff09;是一种旨在确保网站在不同设备和屏幕尺寸下都能良好运行的网页设计策略。通过纯HTML和CSS实现响应式设计&#xff0c;主要依赖于媒体查询&#xff08;Media Queries&#xff09;、灵活的布局、可伸缩的图片和字…...

利用java结合python实现gis在线绘图,主要技术java+python+matlab+idw+Kriging

主要技术javapythonmatlabidwKriging** GIS中的等值面和等高线绘图主要用于表达连续空间数据的分布情况&#xff0c;特别适用于需要展示三维空间中某个变量随位置变化的应用场景。 具体来说&#xff0c;以下是一些适合使用GIS等值面和等高线绘图的场景&#xff1a; 地形与地貌…...

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程&#xff08;上&#xff09;。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员&#xff0c;所以他们本身并不是context&#xff0c;因而…...

执行docker compose命令出现 Additional property include is not allowed

问题背景 在由docker-compose.yml的文件目录下执行命令 docker compose up -d 出现错误 Additional ininoperty include is not allowed 原因 我的docker-compose.yml 文件中出现了include标签旧版本的docker-compose 不支持此标签 解决办法 下载支持的docker-compose 解决…...

STM32通过I2C硬件读写MPU6050

目录 STM32通过I2C硬件读写MPU6050 1. STM32的I2C外设简介 2. STM32的I2C基本框图 3. STIM32硬件I2C主机发送流程 10位地址与7位地址的区别 7位主机发送的时序流程 7位主机接收的时序流程 4. STM32硬件与软件的波形对比 5. STM32配置硬件I2C外设流程 6. STM32的I2C.h…...

ubuntu2204-中文输入法-pycharm-python-django开发环境搭建

文章目录 1.系统常用设置1.1.安装中文输入法1.2.配置输入法1.3.卸载输入法1.4.配置镜像源2.java安装3.pycharm安装与启动4.卸载ubuntu2204默认版本5.安装Anaconda5.1.安装软件依赖包5.2.安装命令5.3.激活安装5.4.常用命令5.5.修改默认启动源6.安装mysql6.1.离线安装mysql6.2.在…...

【学习笔记】Matlab和python双语言的学习(一元线性回归)

文章目录 前言一、一元线性回归回归分析的一般步骤一元线性回归的基本形式回归方程参数的最小二乘法估计对回归方程的各种检验估计标准误差的计算回归直线的拟合优度判定系数显著性检验 二、示例三、代码实现----Matlab四、代码实现----python回归系数的置信区间公式残差的置信…...