ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

超越基本数据类型:探索实体和值对象

2024-03-25 15:59:01  阅读:146  来源: 互联网

标签:PHP 数据 代码





啊,PHP 中的数据建模 - 有时感觉就像与一群数字猫争吵!特别是当您盯着一个类并且不确定它是实体还是值对象时。

让我告诉你,我去过那里。

在我的 PHP 之旅的早期,我正在从事一个项目,一位高级开发人员建议我将特定类从值对象更改为实体。

现在,在那时,这些术语对我来说就像是外星语言。

实体?值对象?他们都持有数据,对吧?有什么大不了的?

好吧,那位开发人员看到了我脸上的困惑,并花了一些时间来解释其中的差异。这真是一个“啊哈!” 对我来说这一刻。这是我学到的东西(也是我希望当时知道的东西):


将您的数据想象为构建块:


将您的数据视为应用程序的构建块。其中一些块就像乐高迷你人偶——它们是具有独特角色和故事的独特个体。

这些是你的实体。

它们有一个生命周期,可以随着时间的推移而改变(想象一下用户改变他们的个人资料图片),并且通常与其他实体有关系(用户创建订单)。


值对象:简单、不可变的块:


另一方面,一些数据块本身更像基本的乐高积木。它们代表描述某事物的简单、不变的值。

这些是你的价值对象。

将它们想象成一块砖块的颜色或形状——它们对整个画面有贡献,但没有单独的故事。


我的经历:从混乱到清晰:


那么,回到我和我当时设计的班级。

事实证明它代表一个地址——用户的街道、城市和邮政编码。乍一看,它似乎是一个简单的值对象。但高级开发人员指出了一些至关重要的事情:随着时间的推移,用户(实体)的地址可能会发生变化。

这就是区别变得清晰的地方。

地址可能是一组简单的数据,但它描述了一个实体(用户)并且有可能被修改。因此,将其建模为实体更为合适。让我们编写清晰的代码!


下面是一些代码示例来说明差异:


实体:
class User {
  private $id;
  private $name;
  private $email;
  private $address; // This can be an entity itself containing address details

// Methods for setting, getting, and manipulating user data (e.g., updating address)
}

实体User代表一个复杂的概念,具有唯一的 ID、名称、电子邮件,并且可能还Address包含描述其位置的实体。

值对象:(假设我们有一个单独的Product实体)
class Price {
  private $amount;
  private $currency;

// Constructor to set the initial values (immutable)
  public function __construct(float $amount, string $currency) {
    $this->amount = $amount;
    $this->currency = $currency;
  }
  // Methods to access the price components (no modification)
}

值对象Price代表一段简单的、不变的数据。它描述了 aProduct的价格,但没有自己的标识。


选择正确的工具:


那么,什么时候使用哪个?快速回顾一下:

实体:将实体用于具有生命周期和关系的复杂、独特的事物。

值对象:将值对象用于简单、不可变的数据,这些数据无需其自己的标识即可描述某些内容。


总结……主要区别:实体与值对象


身份与属性:实体具有独特的身份并由唯一标识符定义,而值对象则由其属性来表征并且缺乏个体身份。

可变性与不可变性:实体是可变的并且可以随着时间的推移而改变,而值对象是不可变的并且一旦实例化就保持其状态。

平等:实体根据同一性进行比较,而值对象根据属性的平等性进行比较。

理解这些概念使我的数据建模变得更加顺利。

请记住,使用正确的数据结构可以使您的代码井然有序且更易于理解,不仅对您而且对未来的开发人员也如此!

标签:PHP,数据,代码
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有