我认为这是主观的,取决于您的设计。
尽管大多数情况下,这似乎是来自活动记录的设计。在活动记录中,您的实体具有执行数据库操作的方法,因此还必须知道它的数据库标识符。
当使用其他模式(例如带有数据映射器的存储库)时,将这些数据存储在对象中变得不必要,并且可能不合适。
以一个Person
物体为例。我的名字在一个家庭中可能是唯一的,也可能不是唯一的。随着人口的增长,更大的名字不再是唯一的,因此我们为越来越大的系统提出了替代标识符。这些示例包括:我的驾驶执照和社会保险号。我并非天生就分配了ID,因此必须申请所有这些ID。
由于它们不是通用的,因此大多数不能为软件提供良好的主键/ ID。SSN至少在其特定系统之外,显然对社会保障局来说是唯一且一致的。由于我们通常不是此信息的提供者,因此您不会称其为,id
而是称其为代表的数据,例如SSN
。有时甚至包含完全组合的对象,例如DriversLicense
,可能包含驾驶执照所包含的所有信息。
因此,所有常规ID都是系统中的代理键,并且可以用内存引用替换,仅包含ID以使查找和持久记录变得更加容易。
由于an id
不是概念数据,因此我怀疑它(通常)是否属于对象内,因为它不是来自域。而是应保留其目的,即识别没有其他方法可以表示唯一标识的对象。这可以在存储库/集合中轻松完成。
在软件中,如果您需要将对象表示为列表或将其持久化,则只需从存储库/集合对象或与此相关的其他对象中进行操作即可。传递到数据映射器(如果是单独的)时,只需传递即可.update( id, obj )
。
免责声明:我尚未尝试构建一个不包含实体内ID的系统,因此可能证明自己是错误的。