DDD中我假象的一个奇怪的问题,希望大家指教。

前提是,对象都在内存中。

那么当我们验证也是业务的一部分,那么比如修改A对象。


A.name = "haha" ; // 这里是对的

A.age = 122;
// 这里根据业务验证是错的,但是A.name 已经被更改了,这时候要回轮到A.name 的起始值才对。我可以回轮到初始值,但是这个就和数据的更改方式有差异了,按照数据库的方式,更改时会提交到数据库,而按照纯OO的方式思考,这里的A是内存唯一的。

// 也就是说,我们不考虑技术层面,而是世界唯一的一个 A对象来说, 我们需要做的是 如下::

A.age = 122;
// 这时候抛出异常,那么还要把 A.name 更改回原来的值才行。



[该贴被brighthas于2012-07-16 14:00修改过]

你通过实体对象中的方法,保证name和age更改在逻辑上一致性即可。
比如:


synchronized void methodA(){
A.name = "haha" ;
if (A.age = 100)
A.age = 122;
}

这时你不能再用事务回滚来看这个问题,因为事务回滚是从黑盒子来解决这类问题,解决的粒度无疑是粗的,代价也是昂贵的。

而我们一旦通过对象中具体方法来保证,比如再加上线程安全机制如同步锁,就不会发生除了业务逻辑错误以外的其他错误了。