值对象本身就是一个稳定的描述,不存在过程变化。相关的值对象的描述,组成了变量的变化过程。

I = I(t)这式子只表达了I与t的变化规律,但没从根本上描述I是多少。当我们去取值时,是取一个变量的当前状态。我可以分析下你这个I(t)。I(t)理解为函数时,也就说明I代表的是一个变化规律,而非电流,而整个I(t)便当为值。I的变化规律 = I(t);但当I理解为电流时,则不能以I(t)为值,因为其不能描述电流的具体状况。A问:“这电流表显示的电流是多少?”,B答:“I(t)”,A:“!!!”。

I = I(t)还可以有另外一种理解,I和I(t)都共同指向一个值对象,I(t)本身不是值对象,但经过传参运算后,得到一个值对象,然后该值对象赋给变量I。但这时的t是一个已确定的值。

I = I(t);

I = I(60);
看起来很相似,但却代表着不同的意思。
I = I(t);的I意味着电流与时间变化规律,而非电流,规律变量 = 具体规律,函数变量 = 具体函数,这是符合变量与值的关系;
如公式集合U = {I(t),I2(t),I3(t)……};,公式变量I,A问:“请问该电流公式是什么?”B答:“I(t)”。这里非常明显地看出,此时的I(t)不是一个变化的存在,而是一个值,就是I(t)。考虑t的变化,已经不是I得范围了。

I = I(60);的I意味着电流,I(60)得出I规律在t=60时的值,把该值赋给I。

请理解,变量和值本身就有一种关系。在赋值之前,请确定变量的含义。

最简单的:

I = I(t);

println(I);

请问,输出是什么?

2011年07月29日 09:23 "@jdon007"的内容
VALUE OBJECTS are instantiated to represent elements of the design that we care about only for what they are, not who or ...

首先何谓what they are?若果不是稳定的确定的概念,如何来描述what?这里说到的which,我认为是what的定语,因为考虑which的话,即使相同的what,也因which而变得不同。不管是你的"1",还是我的"1"。

而从相同的时间变化率,只是道出了他们可以划分为同一边界,但没有从值的角度去考虑。所以并不能道出值对象的本质。值对象 = 以值的概念存在的对象。你只解析了从时间角度来划分对象,但忽略了值概念。

2011年07月29日 09:23 "@jdon007"的内容
交流电(I(t) = 2t+3) 和直流电(I(t) = 5)的当前时刻的值都是5,5是特征?5是直流的特征,因为直流的特征是一个常量特征;但却不能表示交流电的特征,2t+3才是交流电的特征,5只能表示当前时刻交流电的值。一个值对象就是一个 ...

首先我表示,之前浏览论坛时,各种错误。导致回复可能有些对应不上,请不要执着我回复的先后顺序。

好,正题:

值对象不是特征。对于一个具体事物,它的特征是“属性 = 值对象”这一个整体。交流电的一个特征:电流与时间关系函数(属性) = 2t+3(值对象,这可以是一个String,也可以是一个function)。割裂出属性或者值对象都不能成为特征。值对象描述事物属性,属性与值对象组成特征。交流电还有很多特征,但交流电本身在此讨论下是一个事物,不是特征。

在OO中,实体就是包含时间的对象,它是变化的综合体,而值对象(状态)则是对实体的离散描述(时间上)。(PS:场景的概念出现就是完善时间和空间的整体描述)

常数和枚举是非常大局限性的,首先其不能从逻辑来定义,只能硬性定义,其次,它们是有限的,对于相对无限状态,却无法定义。所以之前就说到,一种是编译期定义,一种是运行期定义的。

关于并行消息,这个我同意,而且这是和值对象是站在同一阵营——想从根本上摆脱锁。一个对象接受了消息,那么其内部属性是逐个改变,还是整体替换呢?逐个概念仍然会出现锁,因为要保证其一致性。所以值对象是从一致性方面解脱锁,并行消息是从同步异步方面解锁锁。
[该贴被SpeedVan于2011-07-29 11:14修改过]
[该贴被SpeedVan于2011-07-29 11:44修改过]

VALUE OBJECTS are instantiated to represent elements of the design that we care about only for what they are, not who or which they are.

看来你还是没有理解这句话(这是书中的定义呀),就拿合同这个的例子,balance是一个VO,为什么呢?因为除了contract,order也可以有balance, bank card也可以有balance, 这是值对象:只关心是什么,不关心它们是谁或者是哪一个。

再比如,花有颜色,衣服有颜色,颜色就是一个特征或者值对象;花是红色的,衣服是红色,红色也是一个特征或者值对象,只是此时特征是一个常量而已。

状态特征可以从模型上剥离,正如行为特征可以从模型上剥离,在场景中根据业务规则进行凝聚,成为真正的对象。

比如,I(t) = 2t+3,也是一个特征,可以用来描述交流电,也可以用来描述位移,甚至一条直线,特征的具体指向哪一个模型,在场景中凝聚时,自然确定。比如我们在讨论电流,它就是指交流电的特征;我们在讨论解析几何,它就是指直线的特征。

摆脱锁,不是值对象的目标。锁是多线程环境下,状态共享时的一种保护状态机制。任何东西只要具备不变性,就可以去掉锁,这跟是否是值对象一丁点都没有关系。消息传递并发因为没有状态共享这一说,所以天生就不需要锁,摆脱锁更谈不上是其目标。

关于值对象我已经尽力说清楚了,如果你还是有不同的看法,我也没辙了。我也已经舍弃了值对象这个概念,取而代之使用“状态特征”来描述。

2011年07月29日 13:58 "@jdon007"的内容
看来你还是没有理解这句话(这是书中的定义呀),就拿合同这个的例子,balance是一个VO,为什么呢?因为除了contract,order也可以有balance, bank card也可以有balance, 这是值对象:只关心是什么,不关心 ...

我看你是彻底搞混了变量与值的关系。我只能从根本上否决,值对象不是变量。你的观点“balance是一个VO”就是错误的,无论谁拥有balance,都只是拥有balance这一个属性(变量),而不是值对象(值)。(或者可以这样问题你:属性是值对象吗?)

属性不能描述对象,只能装载描述对象的内容——值或值对象。order有balance属性,只能说明订单上有余额这一项(可以说是描述类),但某张订单(对象)的余额是具体的值或值对象,而“余额 = 值”就是这一对象的特征,这个特征能区别于其他某些对象(余额 != 值)。若果你是说区别于没有balance的东西时,我只能说你是在类与类比较特征,而不是对象与对象比较特征。值对象是放在具体实体上,而不是类上。

从过去随意可变的容器对象,提出值对象必须不可变。是为了去掉过去在“修改状态时,必须锁起来再一个个修改,以保证一致性”这样的一个弊端,即使是同样地结果。值是不变的,把值落实为对象,就成了不变的值对象。
[该贴被SpeedVan于2011-07-29 14:30修改过]
[该贴被SpeedVan于2011-07-29 14:32修改过]
[该贴被SpeedVan于2011-07-29 14:38修改过]
[该贴被SpeedVan于2011-07-29 14:41修改过]

2011年07月29日 14:29 "@SpeedVan"的内容
属性是值对象吗?) ...

变量和值者这么简单的关系,我怎么会混淆呢?小学时我就已经分的很清楚了,至今都打交道了几十年了,我分不清楚,真是让我哭笑不得。

属性是什么?是对象的特征!值对象是什么?是从对象身上凝聚剥离的特征!特征是特征吗?这问题问得我都不知道怎么回答。

至于你非得把“不变性”强加在值对象身上,这是你的自由。还有类与对象,变量与值是相对的关系,在元编程或泛型中类也可视为一个值,

只要你往更高的抽象的层次上,类也会变成一个值;往更低的抽象层次看,对象也会变成一个变量。

假如一个对象表示为一组时间函数: {x1(t),x2(t),...},每个时间函数刻画对象的某个特征,那么一个特征就是一个时间函数,就是关于时间的变量。

对象是有生命的,不是静止的。我们可以说对象在“某个时刻”的特征为某个值,却不能说笼统地对象的特征是某个值,除非这个对象的特征是一个常量。

2011年07月29日 15:17 "@jdon007"的内容
属性是什么?是对象的特征!值对象是什么?是从对象身上凝聚剥离的特征!特征是特征吗?这问题问得我都不知道怎么回答。 ...

根本分歧点:属性是否是对象的特征。

我持有观点:具体属性不是对象特征,而是类的特征。因为当一个类看作对象的时候。根据对象的特征为“属性 = 值”。以Order类(把类看作对象)为例,“属性1 = balance”。以Order对象为例,“balance = 值”。实体为对象,实体属性就是该对象属性,值对象就是该对象属性的值。

层次一说我认同,如下:

该花是红的。这句话我想了下有点不妥,因为“红的”是一个形容词,“该花是红的花”。所以需换一种说法,把“颜色”一词提出来:该花的颜色是红的。实体是“该花”,特征是“颜色是红的”。(not flower = red,is color = red!)

颜色一词怎么才能算上特征呢?把花类这一类看作对象!!但这时花是对象,而不是类:
花类是有颜色的。换种说法:花类的属性1是颜色(或花类其中一个属性是颜色)。实体是“花类”,特征是“属性1是颜色”。

Order和balance例子套用上面例子即可。

“红色”不是特征,只是一个值(值对象),它是一个描述词(名词,貌似也可以做形容词)。它与String,int等类型的值的地位等同,"123"、1、true,把这些对象化后,就是值对象。

过去我说谈论实体时,不喜欢用值对象,是因为,Value Object对应的是Reference Object。而实体本应该是对应实体状态。很多人谈的Object是Reference Object,从而忘记了Value Object存在而已。

最后,请回忆下,彻底的对象语言是怎么样?1变成对象,"123"变成对象,按你的说法1是有生命的,不是静止的,它有可能变成2。若果真是这样,那么对象语言真让人哭笑不得了。我很早之前就与banq达成共识,对象思维就是边界思维,不管是生还是死,变还是不变,只要存在边界,划分边界,就能建立对象。而值对象就是以一组固定的概念作为边界,因为固定,所以具有不变性。红色就是红色,难道它会变成白色这一概念么?new Red()永远equal new Red(),因为其他们都是同一组固定概念,这就是值对象。

[该贴被SpeedVan于2011-07-29 16:03修改过]
[该贴被SpeedVan于2011-07-29 16:14修改过]
[该贴被SpeedVan于2011-07-29 16:18修改过]
[该贴被SpeedVan于2011-07-29 16:47修改过]
[该贴被SpeedVan于2011-07-29 16:51修改过]

发现color = Red;可以用两种方式去描述:颜色是红色;颜色是红的。所以上面例子是没有问题的。
人是一个对象。

如果你认为今天的你,不是昨天的你,说的通;
如果你认为今天的你,还是昨天的你,也说得通。

但不管你怎么认为, 人可以被描述为。

human <= {f1(t), f2(t), ...}, 一组特征(feature)函数/变量

昨天的你 => {f1(昨天), f2(昨天),...}; 一组常数
今天的你 => {f2(今天), f2(今天),...}; 另一组常数

至于你认为昨天的你和今天的你完全是两个不同的对象,还是认为是同一个对象,只是处于两种不同的状态。

这个你高兴选哪个就选难个,取决你对象的定义或边界的划分,你认为对象就是瞬态的值也无妨。

因为我对“对象”这一个词也不太感冒,只是这里的OO氛围太浓厚了,使用别的语言,几乎无法交流。

比如一个班级有50个同学,在夏令营一切生活了半个月,这期间总共出现了多少个人(对象)(假设1天就是一个瞬态)?我想答案显而易见。

所有对象都是值对象?1天一个状态,50人15天,即有50*15*1 = 750个人的状态。但是因为我们把人作为实体,所以仍然是50个人。

对象只谈论边界,java是基于类的所以对象就显得相对固定,但类似js语言边界是易于变化的。值对象,只是一种特殊对象,它可以作为实体状态的一种落实。

多精彩的帖子。看了一下午,但是我看着还是模模糊糊。
OO思想还是得加强啊。