关于实体和值对象
日期:2011-11-30
点击:83
来源: qiuriyuchen
分享至:
领域建模里区分的实体和值对象,其实没有绝对的分法,计算机是对现实问题的建模,建模的复杂度是要看解决问题的复杂度。模型的意义要和问题中的对象参与的业务相匹配。。
如果我们写字的笔丢了,我们要再拿一支来用,那你需要什么样的呢?如果你介意颜色,那你的需求就是再拿一个颜色一样的,如果你介意手感,就拿个型号一样的。在程序中对这样的需求做一个抽象的话,就是需求一个事物只关心它的一些属性,只要属性一样就可以满足需求,这样抽象出来的概念叫值对象。
但如这支笔是父母送的生日礼物,换一个就算看起来完全一样也不一样了,你也不会认为是同一个,就算送的那个坏了,也还是原来的那个。程序中对这样的需求认为是实体,它有生命周期,就算是属性改变了也还是原来的那个。
总结下,值对象是关心它的属性,如果属性值改变了,就认为是不同的对象,为了约束这一点,最好把值对象做成不可变的。实体关心的是生命周期,一般用不能重复的标识来标识这一点。
说到这可能会觉得一切都很明白了,但实际情况是,在现实生活中区分可能相对容易些,但要把要让计算机解决的问题分成值对象和实体就不是那么回事了。
因为计算机中所有的对象都是有限的,只要是计算机造出的对象,都能重新造出个完全一样的对象(对于计算机执行来说),举个例子,我正在做一个英语的软件,里面的生单词对象,如果当成实体当然可以,改变词义后,还是原来的单词。如果要改变单词拼写更合理的方法是要删除当前单词再新建一个单词了。但我也可以把它当成一个值对象,这样不管是改变了拼写还是词意,我都新建一个值对象。两种方式都是可行的。所以我首先要说一个观点,在计算机里没有说一定非得用值对象或实体才能做出来的东西。对于计算机来说,实体是在大部分情况下,对属性的改变不新建一个对象(除非影响到了实体的语义),只改变属性;值对象则是只要属性改变变就新建一个值对象。而且在很多情况下,很难抉择。如果通过业务(也就是现实世界)就能判断出来那是最好了,如果通过业务很难判断,因为有些东西在现实世界也很抽象。比如我的系统里的生词。
有一个在现实里很难区分时,怎么在计算机编程世界里区分的方法。成本分析法,可以先假设设计成值对象,值对象都做成不可变的。再考虑改变的情况多么,改变属性,就新建一个值对象,如果属性总变,而且对象很复杂,那么你当然会觉得每次因为一点改变就得重新建立一个对象,还得删除原来的对象太麻烦了,显然实体更适合。
总结下,实体比值对象的复杂,如果值对象就可以满足需求,就不要使用实体。