主頁 >  其他 > [譯文] 物體與值物件到底是不是一回事?

[譯文] 物體與值物件到底是不是一回事?

2020-09-11 18:41:44 其他

原文: Is Entity the same as Value Object?

In this post, we’ll discuss an interesting question about whether the concepts of Entity and Value Object are the same.

在這篇文章中, 我們將討論一個有趣的問題, 關于物體與值物件的概念是否相同.

I wrote a lot about entities and value objects. Here’s the go-to post if you need to learn more about what they are and the differences between them: Entity vs Value Object: the ultimate list of differences. And to this date, I find interesting angles to look at these concepts from.

我寫了一堆關于物體和值物件的文章. 如果你需要了解它們是什么以及它們之間的區別, 可參考下這篇文章: 物體 vs 值物件: 終極差異清單. 到目前為止, 我發現了一些有趣的角度來探索這些概念.

This one comes from Panos Kousidis who asked a insightful question in the comments to one of my posts about value objects:

這個問題來來源于 Panos Kousidis, 他在我的一篇 關于值物件的一篇文章 的評論中提出了一個極為深刻的問題:

Can we consider an "Entity" as a "ValueObject" that compares only its Id for equality? Can this result in defining the base entity class as

我們是否可以考慮將 物體 視作為 值物件, 僅比較它們的 Id 是否相等? 可否將物體基類定義為:

public abstract class Entity : ValueObject
{
   public int Id { get; protected set; }

   protected override IEnumerable<object> GetEqualityComponents()
   {
       yield return Id;
   }
}

This is a deep question which doesn’t have a quick answer, so let’s break it down into two parts. Here’s what differentiates entities from value objects (again, taken from this article):

這是個很難回答的問題, 所以我們將其分為兩部分. 這里有關于物體和值物件區別的文章(還是這里, 取自 這篇文章):

  • Identity comparison
  • 識別符號比較.
  • Immutability
  • 不可變性.
  • History preservation*
  • 歷史維持*.

(譯者注: History preservation, 歷史維持. 這個翻譯是 茶姨 提供的, 我在 領域驅動設計:軟體核心復雜性應對之道(修訂版) 并沒找到對應翻譯, 還可譯為 "歷史保存", 大概意思是物體的狀態變更的記錄將會保存下來.)

Let’s review the treatment of entities as value objects with regards to each of these two items.

讓我們重新看下, 將物體視為值物件的處理方法, 其中涉及到這兩項 (作者指的是 物體值物件) 中的每一項.

識別符號比較 (Identity comparison)

Identity comparison defines how two instances of a class compare to each other.

識別符號比較 定義類的兩個實體如何相互比較彼此.

Entities are compared by their identifiers. Two objects are deemed equal if they have the same Id:

物體通過它們的識別符號在彼此之間進行比較. 對于兩個物件, 若他們擁有相同的 Id, 則被認為是相等的.

Identifier equality

Identifier equality (識別符號的相等)

Value objects are compared by their content. Two value objects are deemed the same if their contents match:

值物件則根據他們的內容去比較. 若兩個值物件的內容完全相同, 則被認為相等.

Identifier equality

Structural equality (結構的相等)

Note that although you usually compare value objects by all of their contents, it doesn’t have to always be the case. Some fields might not matter for identity comparison.

注意, 盡管通常通過值物件的內容比較來比較他們, 但可不一定總是這樣. 某些欄位在比較識別符號的時候可能并不重要.

An example is the Error class I brought up in a recent article:

一個例子是這個我在 最近的一篇文章 中提到的 Error 類:

public sealed class Error : ValueObject
{
    public string Code { get; }
    public string Message { get; }

    internal Error(string code, string message)
    {
        Code = code;
        Message = message;
    }

    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return Code; // the only field used for comparison (唯一用于比較的欄位).
    }
}

This class contains two fields:

此類包含兩個欄位 (此處有爭議, 上文代碼里應為屬性, 但作者在此文中經常混用 field(欄位)property(屬性)):

  • Code?—?this is what defines an error,
  • Message?—?for additional debug information just for developers.
  • Code —? 這個定義了錯誤碼,
  • Message —? 僅為開發者附加的除錯資訊.

If you pass errors to external systems, those systems shouldn’t ever bind to error messages, only to their codes. This is why the Error class uses only the Code field for identity comparison: changes in debug messages don’t matter; two errors with the same code are treated as the same error even if their messages differ.

如果你將錯誤傳遞給外部系統, 那么這些系統不應該與錯誤資訊系結, 而應該僅僅系結到給他們錯誤碼. 這就是為什么 Error 類僅使用 Code 欄位作為識別符號比較: 除錯資訊的變化無關緊要. 具有相同錯誤碼的兩個錯誤被認為是相同的錯誤, 即使它們的訊息不同.

This is where Panos Kousidis' question comes from too. If you can exclude some fields from a value object’s identity comparison, can you also exclude all of them (except for the Id) and end up with the code like the following?

這也就是 Panos Kousidis 的問題根源. 如果你能從值物件的識別符號比較中排除一些欄位, 那么是否還能排除除了 Id 之外所有欄位, 直到它們的類似于下面的代碼?

public abstract class Entity : ValueObject
{
    public int Id { get; protected set; }

    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return Id;
    }
}

public class Customer : Entity
{
    public string Name { get; protected set; }
    public string Email { get; protected set; }
}

You definitely can, I don’t see any reason why not. So, from the identity comparison perspective, the answer to the question "Can you treat Entity and Value Object as the same concept?" is yes.

你完全可以這么做, 我看不出來有什么理由不可以. 因此, 從識別符號比較的視角, "是否可以將物體和值物件視為相同的概念?" 的答案是 "YES".

不可變性 (Immutability)

In terms of immutability, the difference between entities and value object is that value objects are immutable, whereas entities are almost always mutable. You don’t modify a value object; instead, you create a new one and replace the old instance with it.

在不可變性上, 物體與值物件的區別在于值物件是不可變的, 而物體幾乎總是可變的. 不需要修改值物件; 而是創建一個值物件的新實體去替換舊實體.

One could argue that immutability isn’t a defining property of a value object either. You could even apply the same line of reasoning as with identity comparison and say that what matters is immutability of the fields that form the value object’s identity, and that all other fields can be left mutable. In the example with the Error class, that would mean being able to change the Message field, but not Code.

有人可能會說, 不可變性也不是值物件的屬性定義. 你甚至可以應用同樣的推理作為 識別符號比較, 并說重要的是構成值物件的識別符號欄位的不可變性, 而其它所有的欄位可以保持可變的. 在 Error 類的示例中, 意味著可以修改 Message 欄位, 但是不能修改 Code 欄位.

And it’s true that fields that form the object’s identity must not change. This requirement works similarly for entities and value objects:

的確, 構成物件的識別符號欄位不能變更, 這一要求同樣適用于物體和值物件:

  • The modification of an entity’s Id field would turn that entity into a different one. Thus, such a modification is prohibited.
  • 修改物體的 Id 欄位會將該物體變成另外一個物體. 因此, 這種修改是被禁止的.
  • Similarly, the modification of fields that form a value object’s identity would, too, turn that value object into a different one.
  • 同樣地, 對構成值物件的識別符號欄位修改也會將該值物件轉變成另外一個不同的值物件.

But what about the remaining fields? If we can change an entity’s properties (except for the Id one), can’t we also change the fields of a value object, as long as they aren’t part of its identity?

但是剩余其它的欄位呢? 如果我們能改變一個物體除 Id 外的屬性, 那么我們是否也可以修改值物件的欄位, 只要這些欄位不是值物件識別符號的一部分?

On the surface, it looks like we can, but this line of reasoning falls apart when you take into account the 3rd component that differentiates entities from value objects: history preservation.

從表面上看, 我們好像可以這樣子做, 但是當考慮到物體與值物件的第三個區別: 歷史維持 時, 這種推理就經不起推敲了.

歷史維持 (History preservation)

History preservation is whether or not an object has a history in your domain model.

歷史維持 指的是物件在域模型中是否具有歷史記錄.

Entities have such a history (even though you might not store it explicitly). In other words, entities live in a continuum: they are created, modified, and deleted?—?all at different points in time. Value objects don’t have a history; they are a mere snapshot of some state.

物體就具有這樣的歷史記錄 (即使你可能沒有顯示地存盤它). 換句話說, 物體是連續存在的: 它們在不同的時間點被創建, 修改和洗掉. 值物件沒有歷史, 它們僅僅是某些狀態的快照.

The modification of a value object implicitly extends its lifetime beyond just being a snapshot. Such a modification assumes the value object also has a history, which goes against the requirement of not preserving history in value objects.

值物件的修改隱式地延長了其生存期, 而不僅僅是作為快照. 這樣的修改假設值物件也具有歷史記錄, 但是這違反了值物件中不保留歷史記錄的要求.

History preservation is what answers the question of "Can you treat Entity and Value Object as the same concept?". That answer is no.

歷史維持是對 "可以將物體物件和值物件視為同一個概念?" 這一問題的回答, 答案是否定的.

總結 (Summary)

The answer to the question of "Can we consider an entity as a value object that compares only its Id for equality?" boils down to three parts:

"我們是否可以考慮將 物體 視作為 值物件, 僅比較它們的 Id 是否相等?" 這個問題的回答可以歸結為三個部分:

  • In terms of identity comparison, the answer is yes.
  • 就比較識別符號而言, 答案是可以.
  • In terms of immutability, the answer is yes.
  • 就不可變性而言, 答案是可以.
  • In terms of history preservation, the answer is no.
  • 就歷史保護而言, 答案是不能.

Thus, the overall answer is also no.

因此, 總的答案也是不能的.

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/6677.html

標籤:其他

上一篇:[譯文] C# 8 已成舊聞, 向前, 抵達 C# 9!

下一篇:Theia架構

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more