由于客户信息软件具有上面提到的两个特征:一个是记载客观事物在某一时刻的状态、一个是在数学规律的驱动下进行状态的转换,所以领域模型也相应地包含了这两个特征。而具有这两个特征的信息,我们常常分别称之为静态信息和动态信息。什么是静态信息和动态信息呢?举个例子,一辆汽车,有四个车轮、一个车厢。轮胎的直径和车厢的外形尺寸是汽车的静态信息。在某一个时刻,前轮向左方偏转45度角,偏转了45度角的前轮也是汽车的静态信息。
此外,这辆车的最高时速是200千米,这也是汽车的静态信息。 对于这辆汽车来说,有动态信息吗?答案是没有。也许有人会问,如果这辆车以60千米的时速向前行驶呢?这是动态信息吗?我的回答是:不是。想象一下,如果你把椅子从12楼丢下去,椅子会具有自我状态改变的能力吗?无论是汽车还是椅子,它们状态的变化,都是在外力的作用下发生的。我把这种外力,理解为动态信息。外力的大小,决定了状态变化的速度,这其中包含了数学上的规律。 这种想法和Martin Fowler是不同的。Martin Fowier认为,没有行为的对象不是一个真正的对象。这也许是基于他对对象这个概念的理解,换句话说,他有自己的角度来建立模型与客观事物的映射关系。
而我推荐的客户信息软件映射更加直接,例如,一把椅子,它不会自己添加新的椅子,也不会自动消失(删除)。椅子对象就是关于椅子的信息,所有的信息都是静态的。 下面我再举一个静态信息的例子。 Bruce Eckel在Thinking in Java一书中提到了一个电灯泡。记得吗?这个电灯泡具有brighten接口。假设,在电灯泡对象上提供这个brighten行为是合理的,那么,电灯泡收到了相应的消息之后会如何呢?电灯泡对象的状态应该发生变化——灯丝中通过的电流会增大,灯丝发热会更加厉害。可是,仔细想想,单独考虑电灯泡对象的状态是有问题的,因为电网的电压波动会造成电流大小的波动,电灯泡因此会变得忽明忽暗。这说明,如果离开了电网电压这个因素(静态信息),根本无法正确地设置电灯泡的参数(静态信息)。为了做出更好的解释,我们必须假定有一个数学规律在发生作用。 我们继续看Bruce Eckel的电灯泡隐喻。
在电灯泡对象的描述中,没有说明brighten接口中会做些二次开发,但我很愿意猜测下去。我想客户信息软件这个接口中的实现,应该没有对外部对象的任何依赖,而只是做些修改对象本身状态的工作。为什么这么想呢?