SpeedVan认为的VO
VO,全称Value Object,中文名值对象。
我们平常说的Object一般是Reference Object,这是带有实体意味的。而VO相对于RO,有很大对立性。
1、没有所谓的唯一标识,若果真要说唯一标示,整个VO就是唯一标识。
2、VO有强烈的整体性,当一个VO被提出时,它一定代表着一种含义,且不能分割看待。
3、VO有着本质的不变性,这源自Value(值)的概念,VO是一种以Object存在的Value。这是与“变量集合”最核心的区别。
4、VO有着强烈的存在约束,基本就是一致性意思,这是这个存在约束决定该VO是否有效。
一、三项性质的体现:
例子:某图形对象:
graph{
edges = 3;
area = Area(5,cm2);
}
1、整体性:
获取面积时,不能如下表述:
num = graph.getArea().getNum();
unit = graph.getArea().getUnit();
println("面积为:"+num+unit);
应该如下:
area = graph.getArea();
println("面积为:"+area);//既然成为值,那么准备把toString也准备下吧。
2、不变性:
改变面积为原来2倍时,不能如下表述:
oldNum = graph.getArea().getNum();//破坏整体性
newNum = oldNum*2;
graph.getArea().setNum(newNum);//破坏不变性,值的本质严重破坏了
应该如下:
受语言限制,不能重载操作符:
{
oldNum = graph.getArea().getNum();
oldUnit = graph.getArea().getUnit();
newNum = oldNum*2;
newUnit = oldUnit;//这句为方便可以省略,这里是表达出本意。
newArea = new Area(newNum,newUnit);
}//大括号内的可以抽成一个函数
graph.setArea(newArea);
若果操作符更重载,则如下:
oldArea = graph.getArea();
newArea = oldArea*2;
graph.setArea(newArea);
3、存在约束:
newArea = new Area(-10,mc2);//在构造时,就调用检查函数,没效时,throw Exception,java一个比较麻烦的地方就是这里,new Area在异常时,不能让newArea获取“无效值”,来继续执行。也就是new Area失败时,newArea自动 = null,然后继续执行。js,scala这方面做得很舒服。有效体现在多个方面,一种是某值在有效域,一种是几个值符合某条约束,当然可能还有其他,这里就只是提点一下。
后注:因为java不是什么纯的OO语言,操作符不是针对对象,而是基本类型,有时回避这些问题,需要自己写函数解决。而写法还有更好的,这里先放上是我最初写法。
(这次快就说完是什么和怎么样了,下次就说为什么会这样,因为内容较多,需要整理一下)
待续,持续更新……
[该贴被SpeedVan于2011-08-05 11:42修改过]