1.引言
提到值對象,我們可能立馬就想到值類型和引用類型。而在C#中,值類型的代表是strut和enum,引用類型的代表是class、interface、delegate等。值類型和引用類型的區(qū)別,大家肯定都知道,值類型分配在棧上,引用類型分配在堆上。
那是不是值類型對應(yīng)的就是值對象,引用類型對應(yīng)的就是實(shí)體嗎?很抱歉,不是的。
值對象我們要分開來看,其包含兩個詞:值和對象。值是什么?比如,數(shù)字(1、2、3.14),字符串(“hello world”、“DDD”),金額(¥50、$50),地址(深圳市南山區(qū)科技園)它們都是一個值,這個值有什么特點(diǎn)呢,固定不變,表述一個具體的概念。對象又是什么?一切皆為對象,是對現(xiàn)實(shí)世界的抽象,用來描述一個具體的事物。那值對象=值+對象=將一個值用對象的方式進(jìn)行表述,來表達(dá)一個具體的固定不變的概念。
所以了解值對象,我們關(guān)鍵要抓住關(guān)鍵字——值。
2.值的特征
1就是代表數(shù)字1,“Hello DDD”就是一個固定字符串,“¥50”就是表示人民幣50元。假設(shè)你手上有一沓鈔票,我們?nèi)コ匈徫锏臅r候,很顯然我們會根據(jù)面額去付款,不會拿20元當(dāng)50元花,也不會把美元當(dāng)人民幣花,畢竟¥50≠$50。那對于鈔票來說,我們怎么識別它們,無非就是鈔票上印刷的數(shù)字面額和貨幣單位。你可能會說了,每張鈔票上都印有編號,就算同樣面額的毛爺爺,那它也不一樣。這個陳述,我竟然無言以對。但我只想問你,你平時購物付款,是用編號識別面額的啊?編號顯然是銀行關(guān)心的事,與我們無關(guān)。
我們這里提到的數(shù)字面額、貨幣單位和編號,除此之外還有發(fā)行日期,其實(shí)都是鈔票的基本特征,在coding中我們會根據(jù)場景選擇性的對某些特征以屬性的形式加以抽象。而在我們?nèi)粘OM(fèi)的場景下,顯然編號和發(fā)行日期這兩個特征我們可以直接忽略不計(jì)。
從上面這個例子我們可用總結(jié)出值的特征:
表示一個具體的概念
通過值的屬性對其識別
屬性判等
固定不變
3.案例分析
購物網(wǎng)站都會維護(hù)客戶收貨地址信息來進(jìn)行發(fā)貨處理,一個地址信息一般主要包含省份、城市、區(qū)縣、街道、郵政編碼信息。
如果要讓我們設(shè)計(jì),我們肯定噼里啪啦就把代碼寫下來了:
/// <summary> /// 地址