超越基本数据类型:探索实体和值对象
作者:互联网
啊,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的价格,但没有自己的标识。
选择正确的工具:
那么,什么时候使用哪个?快速回顾一下:
实体:将实体用于具有生命周期和关系的复杂、独特的事物。
值对象:将值对象用于简单、不可变的数据,这些数据无需其自己的标识即可描述某些内容。
总结……主要区别:实体与值对象
身份与属性:实体具有独特的身份并由唯一标识符定义,而值对象则由其属性来表征并且缺乏个体身份。
可变性与不可变性:实体是可变的并且可以随着时间的推移而改变,而值对象是不可变的并且一旦实例化就保持其状态。
平等:实体根据同一性进行比较,而值对象根据属性的平等性进行比较。
理解这些概念使我的数据建模变得更加顺利。
请记住,使用正确的数据结构可以使您的代码井然有序且更易于理解,不仅对您而且对未来的开发人员也如此!