热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP深度解析:聚合与事件溯源

本文深入探讨了领域驱动设计(DDD)中的聚合概念及其在事件溯源架构中的应用。聚合是一组紧密相关的类,这些类作为一个整体运作,形成一个有明确边界的组织。只有通过聚合根才能与聚合内的对象进行交互。

本文讨论了领域驱动设计(DDD)中的关键概念——聚合,以及它在事件溯源架构中的角色。作为DDD战术设计的重要组成部分,理解聚合对于构建复杂系统至关重要。


聚合是指一组紧密相关的类,它们作为一个整体运作,形成一个具有明确边界的组织。边界内的对象只能通过聚合根(Aggregate Root)与外界交互。聚合不同于通用集合(collection),后者是一个更广泛的概念,而聚合则特定于领域模型。


实体


实体用于建模独立的事物,每个实体都有一个唯一的标识符,如ID、UUID或用户名等。实体通常是可变的,其状态随时间变化。在DDD中,ORM模型中的Model可以视为实体。例如,数据库中的每条记录都有自己的ID,记录的内容也会发生变化。


class User extends Model
{
private int $id;

public function __construct(int $id)
{
$this->id = $id;
}

public function changePassword(string $password)
{
// 领域逻辑
}
}

$user = new User(1);
$user->changePassword('new_password');

值对象


值对象用于描述、量化或测量实体。与实体不同,值对象没有唯一标识符,且是不可变的。一旦创建,值对象的属性就不能更改。如果需要修改值对象的状态,应创建一个新的值对象。


无标识符性

值对象不应具有如ID、UUID等标识符。


不可变性

值对象创建后,其值不能被修改。在定义值对象时,应避免提供修改其内部属性的方法。如果需要变更方法,该方法应返回一个新的值对象实例。


class Money
{
private int $amountInCent;
private string $currency;

public function __construct(int $amountInCent, string $currency)
{
$this->amountInCent = $amountInCent;
$this->currency = $currency;
}

public function getAmountInCent(): int
{
return $this->amountInCent;
}

public function getCurrency(): string
{
return $this->currency;
}

public function add(Money $money): Money
{
if ($this->currency !== $money->getCurrency()) {
throw new \Exception('不能添加不同货币');
}
return new Money(
$this->amountInCent + $money->getAmountInCent(),
$this->currency
);
}
}

可替换性

由于值对象的不可变性,如果两个值对象的值相等,则它们可以互换使用。例如,两张10元人民币可以互换而不引起任何问题。


许多领域模型可以使用值对象来建模,这提供了安全和灵活的代码管理方式。例如,密码可以使用值对象来实现,确保其有效性和安全性。


class Password
{
private string $value;

public function __construct(string $value)
{
$this->guard($value);
$this->value = $value;
}

public function toString(): string
{
return $this->value;
}

private function guard(string $value)
{
if (empty($value)) {
throw new \Exception('无效的密码值');
}
}
}

$user = new User(1);
$password = new Password('secure_password');
$user->changePassword($password);

初始化后的密码对象肯定是有效的,因为我们在构造函数中进行了验证。这为后续代码提供了安全保障。


聚合根


聚合根本质上是一个实体,但它在聚合中扮演特殊角色,作为聚合对外的唯一接口。可以将聚合比作一个家庭户口簿,聚合根则是户主,所有操作都需要通过户主进行。


领域事件


领域事件是指领域中与业务直接相关的事件,与基础设施和代码框架无关。因此,领域事件不应是像EmailSent或RecordUpdated这样的通用框架事件。领域事件在聚合根中生成,并持久化存储,以确保所有事件的正确性。如果有任何异常,领域事件不会被错误地保存。


总结


在事件溯源架构中,聚合由一个聚合根和一个或多个上述部分组成。通过理解和应用这些概念,可以更好地设计和实现复杂的业务系统。


本文转载自【何以解耦】:原文链接,如果你对TDD、DDD和简洁代码感兴趣,欢迎关注公众号【何以解耦】,一起探索软件开发之道。


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • VPX611是北京青翼科技推出的一款采用6U VPX架构的高性能数据存储板。该板卡搭载两片Xilinx Kintex-7系列FPGA作为主控单元,内置RAID控制器,支持多达8个mSATA盘,最大存储容量可达8TB,持续写入带宽高达3.2GB/s。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • IT项目管理过程中的方法、工具、技术
    工欲善其事,必先利其器。而对于一个软件开发项目,最重要的器就是方法,工具和技术。而这三要素中重要的又是方法论,方法是基础&# ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
author-avatar
小怡的宝_594
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有