Development Methodology

DDD

  1. DDD简介

    • 定义:领域驱动设计(Domain - Driven Design,DDD)是一种软件开发方法,它强调以领域为核心来构建软件系统。将业务领域的概念、规则和流程直接映射到软件的设计和实现中,使软件能够更好地反映业务需求。

    • 目标:DDD的主要目标是解决软件系统复杂性的问题。通过对领域知识的深入挖掘和建模,使开发团队能够更好地理解业务,从而构建出更符合实际业务需求、更易于维护和扩展的软件系统。

  2. 核心概念

    • 领域(Domain)

      • 这是业务问题所在的空间范围,例如电商领域、金融领域等。它包含了该业务领域的所有知识、规则、流程和业务对象。例如,在电商领域,商品、订单、顾客、支付等都是领域的重要元素。

    • 领域模型(Domain Model)

      • 是对领域内的概念和规则进行抽象和建模的结果。它是领域知识的一种结构化表示,用于描述领域内的实体、值对象、聚合根等之间的关系。例如,在电商订单处理系统中,订单是一个聚合根,它包含了订单项(值对象)、顾客信息(实体)等相关元素,这些元素之间的关系构成了订单处理的领域模型。

    • 实体(Entity)

      • 具有唯一标识符的对象,其状态可以在生命周期内发生变化。例如,在电商系统中的顾客实体,每个顾客有一个唯一的ID,顾客的姓名、地址等信息可能会发生改变,但通过ID可以始终识别这个顾客。

    • 值对象(Value Object)

      • 没有唯一标识符,它的价值在于其属性值的组合。值对象用于描述一些不可变的、通过其属性来确定其相等性的对象。比如电商系统中的商品价格、颜色等可以作为值对象。如果两个价格对象的金额相同,那么它们在业务上可以认为是相等的。

    • 聚合根(Aggregate Root)

      • 是聚合的根节点,它是领域对象的一个边界,用于确保数据的一致性。聚合根外部对象不能直接访问聚合内的实体和值对象,只能通过聚合根来进行访问。例如,订单作为聚合根,外部系统如果要访问订单中的订单项,必须通过订单这个聚合根来操作,这样可以保证订单相关数据的一致性。

  3. 分层架构

    • 用户接口层(User Interface Layer)

      • 主要负责处理用户的请求和展示响应结果。它接收来自用户(如Web界面、移动应用等)的输入,将其转换为应用层可以理解的命令,然后将应用层返回的结果转换为用户可以理解的形式展示出来。例如,在一个Web应用中,用户接口层负责处理HTTP请求,调用应用层服务,然后将应用层返回的数据渲染成HTML页面返回给浏览器。

    • 应用层(Application Layer)

      • 是协调领域层和基础设施层的中间层。它负责编排业务逻辑,组织领域对象来完成具体的业务操作。应用层不包含业务规则本身,而是调用领域层的服务来实现业务规则。例如,在电商系统中,应用层会协调订单领域服务、库存领域服务等来完成下单的业务流程。

    • 领域层(Domain Layer)

      • 是DDD的核心层,包含了领域模型和领域服务。领域模型用于表示业务领域的实体、值对象等对象之间的关系和行为,领域服务则用于实现领域内的复杂业务逻辑,这些逻辑不能简单地归结到某个实体或值对象上。例如,在电商系统中,计算订单总价的逻辑可能是一个领域服务,因为它涉及到多个订单项价格的汇总等操作。

    • 基础设施层(Infrastructure Layer)

      • 为其他层提供技术支持,包括数据库访问、消息队列、文件存储等功能。它实现了领域层和应用层所依赖的底层技术细节。例如,在电商系统中,基础设施层负责将领域对象持久化到数据库中,或者通过消息队列发送订单状态变更通知等。

  4. 战略设计和战术设计

    • 战略设计(Strategic Design)

      • 主要关注如何划分领域、子领域和限界上下文。它确定了软件系统的整体架构和模块划分,使得不同的团队可以在不同的限界上下文内独立工作,减少不同模块之间的耦合。例如,在一个大型电商企业中,将商品管理、订单处理、客户服务等划分为不同的子领域和限界上下文,每个上下文有自己独立的业务规则和数据模型。

    • 战术设计(Tactical Design)

      • 侧重于在限界上下文内部进行领域模型的详细设计,包括实体、值对象、聚合根等的设计和它们之间的交互。战术设计是在战略设计确定的边界和架构基础上,对具体的领域模型进行精雕细琢,以确保能够准确地实现业务功能。例如,在订单处理的限界上下文中,设计订单聚合根及其包含的订单项值对象、顾客实体等的具体属性和行为。

  5. DDD的优势和挑战

    • 优势

      • 更好地理解业务:通过深入挖掘领域知识,开发团队能够和业务专家更好地沟通,准确把握业务需求,减少需求理解偏差。

      • 可维护性和扩展性:由于软件系统是基于领域模型构建的,当业务发生变化时,可以在领域模型的基础上进行修改和扩展,系统的结构相对稳定,易于维护。

      • 提高软件质量:DDD强调软件的设计要符合业务逻辑,使得软件更加健壮,能够更好地应对复杂的业务场景。

    • 挑战

      • 学习成本高:DDD涉及到许多复杂的概念和方法,开发团队需要花费时间学习和掌握,包括领域建模、限界上下文划分等。

      • 需要业务专家参与:有效的DDD实施需要业务专家深度参与,以确保领域模型准确反映业务知识,但在实际项目中,协调业务专家和开发团队可能会比较困难。

      • 设计和实现难度大:DDD的分层架构和领域模型设计要求较高的设计能力,在战术设计阶段,如何合理地划分实体、值对象等也具有一定的挑战性。

TDD

  • Unit test

  • Integrate/API test

  • Auto/Manual test

MDD

  • Log

  • Metrics

  • Tracing

  • Alert