描述事物的一些特征,比如颜色、尺寸、金额等,相对独立于实体的一些概念,没有标识。 ...
值对象不是描述有什么特征,而是说该特征如何。在“颜色=红”式子中,值对象是“红”。之前看过说跟常量,枚举差不多。其实也可以这么认为,但常量,枚举是有限的,而且不是从约束条件出发,明显带有局限性。值对象只需要符合存在约束,就可以成立。而实现上的区别是,常量和枚举必须是编译时期确定,而值对象根据存在约束就可以在运行时确定,可以理解为相对实时的状态。
你所提到的“一致性”就是我说到的存在约束。但跟“不变性”是两回事,“不变性”来自下面几个地方:
1、值对象是描述一个瞬时状态,它不是用来描述过程。也就是说众多值对象组成的是一个离散关注的状态集。
2、值对象是整体概念,哪怕只是一丁点不同,就是不同的值对象;而且不能独立观察,不能说只是当中的某个值变了,而是说整个都变了。如Color(红,绿,蓝)变量集合,值对象Color(255,255,255)给出的信息就是白色,Color(255,255,0)给出的信息是黄色,油漆使东西从白色变黄色,即color = Color(255,255,255);变成color = Color(255,255,0);而不是说当中白色当中的“蓝”变了,所以颜色变成黄色,即color = Color(255,255,255).setBlue(0)。
white = Color(255,255,255);
yellow = white.setBlue(0);
white == yellow?
white.equal(yellow)?
3、受实体概念所约束,值对象代表有意义属性的具体状态,即本身整体就含有某种特殊意义,而不是分割看待。实体有颜色属性,则说明遵循该意义的值对象,就是颜色中一种,各种颜色相互独立。
不变性的意义(自己的粗略总结),除了技术上说的共享,还有就是可使概念清晰(白色就白色,黄色就黄色),脱离没意义的代码;在实现实体的状态迁移时,不会使实体存在没意义的时刻;没意义时刻脱离实体,使读锁更低频率出现;而同时值对象一直是处于有意义状态,只要获取到值对象都是有意义,不论任何时刻……其实还有不少意义,只是我也没那个时间去全局总结。
后注:
没意义时刻:
Color(255,255,255)向Color(0,0,0)转变
color = Color(255,255,255);
color.setRed(0);//color处于没意义时刻
color.setGreen(0);//color处于没意义时刻
color.setBlue(0);//改变完后变成有意义
没意义时刻,不分共享不共享,若果共享的时候也存在没意义时刻,就会带来共享问题。而这种没意义时刻,是一种过程化思想的体现。
[该贴被SpeedVan于2011-07-28 10:39修改过]