实例解析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修改过]

                   

2
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我感觉是各层拿来传值的

那么传值的时候该给这两个的哪个赋值呢?

感觉不对劲