实例解析vo,bo,po,dao

08-05-15 anjxue
首先说明我是个新手,这些概念我接触不久,我把我的想法提出来,希望大家指正
比如说一个系统设计到两个概念:“用户”、“订单”
用户跟订单是一对多关系,这里就不讨论权限(角色)那些概念了。

首先在form里,我们的页面让输入用户信息:用户名、密码,但是这里需要注意的是,这个信息里密码一般都是让输入两次的,那么我们的UserInfoForm如下:
public class UserInfoForm{
private String name;
private String pwd1;
private String pwd2;
get....
set....方法
}
注意这里有pwd1和pwd2两个值,跟页面两个文本框绑定

接着是vo,vo拿来传值的,但是vo里不需要两个pwd了,而vo又与订单有关联关系,故我理解vo应该这样:
public class UserInfoVO{
private String name;
private String pwd;
private List<OrderInfoVO> orderList;
get set方法...
}
我理解vo里是正统的oo思想,用户跟订单的关系通过一个List来表现

然后是po,我感觉po应该跟数据库表对应,这种一对多的关系,一般是在订单端加一个user_id,那么两个PO如下:
public class UserInfoPO{
private String name;
private String pwd;
get...set...
}
public class OrderInfoPO{
private String name;
private String userId;
}
注意这里,订单类里有个userId,就不是正宗的oo思想了,但为什么这么做呢?因为要做持久化,即DAO里需要这个形式

DAO:
pulic class UserInfoDAO(){
public void createUser(UserInfoPO user);
}
这里DAO引用的是PO,而不是VO,因为这样写起sql等会比较简易,而且便于持久层与业务层的解耦

总结:
1 当一个类里出现诸如:pwd1,pwd2这种形式时,那么它是个form
2 当一个类里,持有一个对象,或聚集这样正统的oo关系时,它是个vo
3 当一个类里有relatedObjectId这样的字段时,它是个po

对于BO我暂时没什么理解

不知道我的想法是否正确,希望大家指正 :)




[该贴被anjxue于2008-05-15 11:47修改过]

banq
2008-05-16 08:34
不要管那么多O,都是从各种角度命名的,就像同一个东西不同地方俗语有不同称谓。

本质上要从领域模型这个称谓入手,搞清楚实体对象和值对象等概念,将对象命名概念统一到Evans DDD上来。

fw2003
2008-05-17 12:57
我认为LZ你的FORM就是VO 其实我认为BO 即DOMAIN MODEL才是我们应该关注的重点

po最现实的意义是 用hibernate查询 或者插入更新 返回值得时候用 人家帮你封装了 vo是为了po与页面的值不完全对应 vo是完全对应的

java莫法返回多参数嘛 而且就算能返回一个参数一个参数的返回也麻烦 当然封装了就更好 而且封装不仅是为了数据的封装 更重要是把事物抽象成一个model 有实际对应意义 不是随便去封装数据 所以现在无意义vo(只是对数据的封装)已经淘汰了

anjxue
2008-05-19 13:48
如果FORM就是VO,那么VO里岂不是会出现pwd1,pwd2这样的情况?
vo我感觉是各层拿来传值的
那么传值的时候该给这两个的哪个赋值呢?
感觉不对劲