可以设计具有不变性的状态特征(值对象),但状态特征(值对象)不一定具有不变性,设计不变性的状态特征更多是为了高并发访问(主要是读)的一致性与有效性。
不变性设计的适用的场合—实例的状态被多个线程频繁读取(高并发环境中,实例状态被共享)。 ...
一、图解
|--------|
| |
| |--|
| | 变量
| |--|
| |
|--------|
|--------|
| |--|
| |
|--| |--| 变量集合
|--| |--|
| |
| |--|
|--------|
|-----|
| |
| |
|--| |
|--| | 值对象
| |
| |
|-----|
<p class="indent">
|
缺口是变量(属性),是不确定的。而值对象是确定,因为它是值。
二、观点
jdon007认为,后两者都是值对象,不变设计是因为并发需求。
而我的观点是:不是因为用而不变,而是因为不变而用。(是下面一切的总括)
三、SpeedVan观点详解
前两者其实是同一意思,都是变量。它们都是等待与值对象组合成对象特征(这与jdon007说的特征不一样)。jdon007把1与2、3分开,形成两组概念。而我虽然是三个概念,但前两个相似,可以合并,第二个概念只是为了区别过去扭曲的值对象而提出的。
值对象中,“对象”意味着“边界”,那么“值”意味着什么?我认为是一个系统的原子概念。如同数字系统的1、2、3……、字符系统的'a'、'b'、'c'……、字符串系统的"abc"、"bcd"、"acb"……等。值是已确定的最小单元的个体。所以值对象不存在变化,当结构和边界被确定后,一切就会确定下来。不创建出来,不代表该值概念不存在。
最后,既然谁也说服不了谁,也就不勉强,以后讨论尽可用可变/不变对象,避免歧义。
四、额外语
准确来说面向类只是面向对象一种实现方式,请记住类!=对象。通过类,通过原型对象,通过函数,都可以到达面向对象,只是各自方式不一样而已,有些静态,有些动态,但目的都是构造出边界(边界不是固定的,可静态,可动态,我认为scala这方面真的比较综合)。
2011年10月21日 11:14 "@xmuzyu"的内容
下面我再唠叨一下采用不变性的状态的一些想法,对于一个单机的系统,我们是可以通过synchronzied的方式来实现对对象状态的并发修改,而对于一个分布式的系统或者是集群中的时候,就很难使用synchronized了,但是这种情况下,我们转而 ...
xmuzyu,很久不见了。很少见你的文章了?
回题,在我认识到不变对象后,慢慢地单机也以这样方式来编写。在多核时代,并发已经成为趋势,如何发挥并发实力,也是一个重要课题了。自从banq介绍了Disrupter后,比起synchronzied方式,原子性的并行方式更好。同意banq的一句话:锁是并发计算的大敌。
[该贴被SpeedVan于2011-10-21 14:14修改过]
[该贴被SpeedVan于2011-10-21 14:16修改过]