首页 > 其他分享 >DDD领域驱动设计的四重边界

DDD领域驱动设计的四重边界

时间:2024-07-24 09:55:20浏览次数:13  
标签:聚合 边界 items 领域 public 四重 DDD

领域驱动设计(Domain-Driven Design, DDD)是一种针对复杂业务场景的软件设计方法,其核心思想是将业务领域知识贯穿整个软件开发生命周期,通过构建领域模型来指导设计和开发。DDD通过规划四重边界,将领域知识进行了合理的固化和分层,确保了系统的有序性和可维护性。本文将深入探讨DDD的四重边界,并通过代码示例来展示这些边界在实际项目中的应用。

第一重边界:确定愿景与目标

DDD的第一重边界在于确定项目的愿景与目标,划定问题空间,并明确核心子领域、通用子领域和支撑子领域。这一步骤帮助团队理清问题域中的优先级,为后续的设计工作奠定基础。

示例:

假设我们正在开发一个电商平台,首先需要明确平台的愿景是“打造一个用户友好、高效、可扩展的在线购物平台”。接下来,通过业务分析,我们可以确定以下几个子领域:商品管理、订单处理、用户管理、支付系统等。其中,商品管理和订单处理是核心子领域,用户管理和支付系统则是支撑子领域。

第二重边界:限界上下文

限界上下文(Bounded Context)是DDD中的第二重边界,它定义了领域模型的边界和范围,避免了不同领域之间的混淆和冲突。每个限界上下文都有自己的一套领域模型、业务规则和交互方式。

示例代码:

以订单处理子系统为例,我们可以定义一个限界上下文OrderContext,并在其中定义相关的领域实体、值对象、聚合等。

// 订单实体
public class Order {
    private String orderId;
    private List<OrderItem> items;
    // ... 其他属性和方法
}

// 订单项值对象
public class OrderItem {
    private String productId;
    private int quantity;
    // ... 其他属性和方法
}

// 订单服务(领域服务)
public class OrderService {
    public Order createOrder(List<OrderItem> items) {
        // 创建订单逻辑
        Order order = new Order();
        order.setItems(items);
        // ... 其他逻辑
        return order;
    }
}

第三重边界:分层架构

DDD的第三重边界体现在分层架构上,常见的分层包括用户界面层、应用层、领域层和基础设施层。每一层都有其特定的职责和交互方式,确保了系统的高内聚低耦合。

示例代码:

以下是一个简化的分层架构示例,展示了如何在订单处理子系统中应用DDD的分层架构。

// 用户界面层(Controller)
@RestController
@RequestMapping("/orders")
public class OrderController {
    private final OrderApplicationService orderApplicationService;

    public OrderController(OrderApplicationService orderApplicationService) {
        this.orderApplicationService = orderApplicationService;
    }

    @PostMapping
    public ResponseEntity<OrderDto> createOrder(@RequestBody List<OrderItemDto> items) {
        OrderDto orderDto = orderApplicationService.createOrder(items);
        return ResponseEntity.ok(orderDto);
    }
}

// 应用层(Application Service)
public class OrderApplicationService {
    private final OrderRepository orderRepository;
    private final OrderService orderService;

    public OrderApplicationService(OrderRepository orderRepository, OrderService orderService) {
        this.orderRepository = orderRepository;
        this.orderService = orderService;
    }

    public OrderDto createOrder(List<OrderItemDto> items) {
        // DTO转换为领域对象
        List<OrderItem> orderItems = items.stream()
            .map(OrderItemDto::toOrderItem)
            .collect(Collectors.toList());

        Order order = orderService.createOrder(orderItems);
        orderRepository.save(order);

        // 领域对象转换为DTO
        return order.toDto();
    }
}

// 领域层(Domain Service, Repository)
// ... 如前所示

// 基础设施层(Repository Implementation)
public class OrderRepositoryImpl implements OrderRepository {
    // 持久化逻辑
}

第四重边界:聚合设计

在领域层内部,为了保持领域模型的完整性和一致性,DDD引入了聚合(Aggregate)作为最小设计单元。聚合是一组具有内聚关系的相关对象的集合,每个聚合都有一个根实体(Aggregate Root)来维护聚合内部的一致性。

示例代码:

在订单处理子系统中,订单(Order)可以作为一个聚合根,订单项(OrderItem)则属于订单聚合的一部分。

public class Order {
    // ... 如前所示

    // 确保通过聚合根访问聚合内的其他对象
    public void addItem(OrderItem item) {
        this.items.add(item);
    }
}

// 聚合根外部不应直接访问聚合内的非根实体
// 例如,不应通过OrderItem来修改订单状态
结论

DDD的四重边界通过合理的固化和分层,确保了领域知识的有效传递和应用,提高了软件系统的可维护性和可扩展性。在实际项目中,团队应根据业务需求和技术栈,灵活运用DDD的原则和方法,构建高质量的软件系统。

标签:聚合,边界,items,领域,public,四重,DDD
From: https://blog.csdn.net/wjianwei666/article/details/140635095

相关文章

  • DDD(一)
    DDD领域驱动模型领域划分核心域:解决项目的核心问题,和组织业务紧密相关。支撑域:解决项目的非核心问题,具有组织特性,但不具有通用性。通用域:解决通用问题,没有组织特性。领域模型事务脚本界限上下文实体:”标识符“用来唯一定位一个对象,在数据库中我们一般用表的主键来实现......
  • Java语言程序设计基础篇_编程练习题**15.17 (几何问题:寻找边界矩形)
    **15.17(几何问題:寻找边界矩形)请编写一个程序,让用户可以在一个二维面板上动态地增加和移除点,如图15-29a所示。当点加入和移除的时候,一个最小的边界矩形更新显示。假设每个点的半径是10像素解题思路:这道题可以从编程练习题15.15修改新建一个面板Pane(),方法外部新建一个......
  • 浅谈Mike 3D中制作垂向水温分层边界
    前言:给大家更新一篇全新模块的讲解吧,MIKE3D中难点在于制作一种分层DFS2的边界,这种边界必须用实测的数据作为支撑,本次讲解以水温分层为例。step1:打开GridSeries中BlankGird,新建2dgridstep2:进入参数设置界面,坐标与模型设置一致,坐标原点可以设置成边界起点坐标(左手......
  • 探讨C++中巧妙的边界条件处理:以花坛种花问题为例【巧妙思想、边界条件】
    在算法题中,处理数组的边界条件是一个常见的挑战。特别是在涉及多条件判断时,如何高效且清晰地处理边界问题,可以显著提升代码的简洁性和可读性。本文将以一道经典的算法题——花坛种花问题,来探讨边界条件的巧妙处理方法。问题描述605.种花问题-力扣(LeetCode)给定一个由......
  • 2024年华为OD机试真题-图像物体的边界-C++-OD统一考试(C卷D卷)
     2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集)题目描述:给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体,2个物体相邻的格子为边界,求像素1代表的物体的边界个数。像素1代表的......
  • 领域驱动设计(DDD)的概述与应用
    个人名片......
  • DDD | 05-什么是仓储层
    四、什么是仓储层?在DDD中,仓储(Repository)是一种设计模式,它充当了领域层与数据存储层之间的桥梁。仓储的主要职责是提供一种抽象机制,使得领域对象(尤其是聚合根)可以被透明地持久化和检索,而无需暴露底层的数据访问技术细节给领域层。这样设计的目的是为了保持领域模型的纯净性,让业务......
  • DDD | 03-什么是实体对象
    二、什么是实体?实体(Entity)是一种核心的领域模型组件,用于表示具有唯一标识符、生命周期和行为的对象。实体是领域中关键概念的具体实例,它们通常对应于现实世界中的事物,比如用户、订单、账户等。主要特点唯一标识符(Identity):每个实体都有一个唯一的标识符,这个标识符是用来区......
  • DDD | 04-什么是聚合根
    三、什么是聚合根?聚合根(AggregateRoot)是DDD中的一个核心概念,用于组织和管理一组相关的领域对象,确保它们的整体一致性和完整性。聚合根是领域模型中的关键组件,它不仅封装了领域内的复杂业务逻辑,还提供了控制访问和维护数据一致性的机制,是构建可维护、可扩展的软件系统的重要基石......
  • DDD | 02-值对象拓展示例
    示例拓展金额和货币创建一个表示金额和货币的值对象(AmountVO),在系统中统一处理货币相关的数据,确保精度和一致性。importjava.math.BigDecimal;importjava.util.Currency;/***这个AmountVO类使用BigDecimal来精确存储金额值,避免了浮点运算可能带来的精度问题。同时,利用C......