论坛首页 Java企业应用论坛

VO(DTO)模式在分层架构设计中是否需要的扯淡

浏览 42547 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-04-25   最后修改:2011-04-25
VO DTO POJO,都只是数据的封装而已,
如果每层交互都要做对象转换,重复代码多,
除了增加研发和维护的人力成本,意义究竟有多大,值得思考!
0 请登录后投票
   发表时间:2011-04-25  
引用
而不能什么都不让他们知道,只是强制执行。


 
0 请登录后投票
   发表时间:2011-04-25  
star022 写道
VO DTO POJO,都只是数据的封装而已,
如果每层交互都要做对象转换,重复代码多,
除了增加研发和维护的人力成本,意义究竟有多大,值得思考!

如果你看完本文,还不明白为什么要用。我就没有办法了。
0 请登录后投票
   发表时间:2011-04-26   最后修改:2011-04-26
就问楼主一个问题:OO中的Object与layer之间有啥关系,这个啥关系都没有的道理如搞不清楚,扯那些po,dto,vo都是浮云,浮动在层上的云。
0 请登录后投票
   发表时间:2011-04-26   最后修改:2011-04-26
peterwei 写道
star022 写道
VO DTO POJO,都只是数据的封装而已,
如果每层交互都要做对象转换,重复代码多,
除了增加研发和维护的人力成本,意义究竟有多大,值得思考!

如果你看完本文,还不明白为什么要用。我就没有办法了。


死读书不如无书,具体问题灵活,灵活对待,
层与层之间的交互,不可能完全断开,就算是层与层之间数据对象转换,也算是一种耦合,
一旦上层数据结构有变动,很有可能会影响到下一层,
如:view层与service层传封装数据的vo或dto增减属性,很有可能会影响到service与dao层封装数据的po,
此时,将vo(dto)、po区分得太清楚,从设计角度看,貌似变清晰了,
而站在研发实际效果来看,是失败的。

站在交互的全流程的角度来看,view<-->service<-->dao,层与层之间的交互的“xo”,只是对数据的封装罢了,
采用统一的对象来处理,从实用主义来说,是合理的,这种应该是大多数情况,
一些特定场景,如“防火墙”、层与层之间,敏感数据隔离等,做有必要的转换,则是有意义的。

Rod Johnson在 J2EE without ejb中是反对用DTO的,他这么反对,相信是有他的道理的。
0 请登录后投票
   发表时间:2011-04-26  
yimlin 写道
vo和po的区别就不多说了。

vo的作用有两种:
1.模块隔离:对外暴露,屏蔽内部实现。
2.分布式支持:用于异步传输;

换句话说:
如果不打算进行严格的模块化/组件化,又没有分布式场景,就不应该使用VO。
如果不打算进行严格的模块化/组件化,但存在部分分布式场景,比如lz所说的flex,那么针对部分进行VO开发即可;

此外,决定是否启用VO除了上述两个作用对应的场景外,另有如下两个因数:
1.PO是否是Rich Model?
2.开发人员是按分层分工还是按功能分工?

如果PO是贫血的,且是按分层分工开发的那么应该启用VO,因为,由于后台模型变化导致前台的调整会带来沟通协调的成本;
如果PO是Rich Model,且是按功能分工,那么就不应使用VO,VO和PO只会趋近,最终带来更多的维护成本,且在Rich Model下只变后台不变前台的比率较低,大部分情况下,功能的调整/改进会同时影响前后台。


+1
0 请登录后投票
   发表时间:2011-04-26  
donglee 写道
peterwei 写道
star022 写道
VO DTO POJO,都只是数据的封装而已,
如果每层交互都要做对象转换,重复代码多,
除了增加研发和维护的人力成本,意义究竟有多大,值得思考!

如果你看完本文,还不明白为什么要用。我就没有办法了。


死读书不如无书,具体问题灵活,灵活对待,
层与层之间的交互,不可能完全断开,就算是层与层之间数据对象转换,也算是一种耦合,
一旦上层数据结构有变动,很有可能会影响到下一层,
如:view层与service层传封装数据的vo或dto增减属性,很有可能会影响到service与dao层封装数据的po,
此时,将vo(dto)、po区分得太清楚,从设计角度看,貌似变清晰了,
而站在研发实际效果来看,是失败的。

站在交互的全流程的角度来看,view<-->service<-->dao,层与层之间的交互的“xo”,只是对数据的封装罢了,
采用统一的对象来处理,从实用主义来说,是合理的,这种应该是大多数情况,
一些特定场景,如“防火墙”、层与层之间,敏感数据隔离等,做有必要的转换,则是有意义的。

Rod Johnson在 J2EE without ejb中是反对用DTO的,他这么反对,相信是有他的道理的。

关于Rod大叔反对,前面楼上有人说我们是断章取义了。哈哈。你可以了解一下。
0 请登录后投票
   发表时间:2011-04-26  

从本质上讲,一般的系统,需要的只是从数据库到界面的一种映射,所以,原始的简单系统是jsp+sql来处理。

但是sql还是比较复杂的,加入了po作为数据库的代理,让这种复杂度的范围尽量缩小

而po和界面间的转换,并没有这种复杂度,加入vo很可能不能减少复杂度,反而增加复杂度。我觉得po和界面间,只需要定义好映射规则,就可以足够清晰了。

0 请登录后投票
   发表时间:2011-04-26  
gtssgtss 写道

从本质上讲,一般的系统,需要的只是从数据库到界面的一种映射,所以,原始的简单系统是jsp+sql来处理。

但是sql还是比较复杂的,加入了po作为数据库的代理,让这种复杂度的范围尽量缩小

而po和界面间的转换,并没有这种复杂度,加入vo很可能不能减少复杂度,反而增加复杂度。我觉得po和界面间,只需要定义好映射规则,就可以足够清晰了。


是这样的。我们大多数项目,都是PO透传所有层。并不需要VO.但一些特定的项目还是需要的,就如我所说的:为什么要用DTO(VO)。
0 请登录后投票
   发表时间:2011-04-26  
star022 写道
VO DTO POJO,都只是数据的封装而已,
如果每层交互都要做对象转换,重复代码多
除了增加研发和维护的人力成本,意义究竟有多大,值得思考!

我往往会找一些工具,或者自己扩展一些插件来完成这样的转换
比如 pojo对象转换成dto对象 我运用到了beanutils和注解形式自己写了个工具,转换也只是一行代码而已
User user = ......
UserDTO uDTO = MyBeanUtils.convert(user,UserDTO.class);
List<User> userList = .....
List<UserDTO> userDTOList = MyBeanUtils.convertList(userList,UserDTO.class);


0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics