DTO的迷思,以及“对象”和“数据结构”

原创 2004年02月27日 10:25:00

“对象不应该有public的field,应该用getter/setter将field封装起来。”我们对于这个规则已经太熟悉,熟悉得完全忘记了它的由来。Uncle Bob提出了一个问题:完全用于传输数据的DTO是否需要getter/setter?实际上,在很多时候,DTO并不是一个“对象”(我们用这个词表示“数据与行为的组合体”),仅仅是一个“数据结构”——把数据从一个地方带到另一个地方。给“数据结构”加上getter/setter,从OOD的角度来说着实没什么价值。

但是我至少有两个理由反驳Uncle Bob的话。第一,有时DTO要对其中携带的数据加以组合或变换,给出适合UI层的形式,这时需要getter(甚至setter)的封装;第二,用jakarta-commons-beanutils工具可以很方便地在提供了Java Bean语意(即getter/setter)的对象之间复制属性。

Uncle Bob's Software Craftsmanship Corner

Oh No! DTO!

by Robert C. Martin
February 26, 2004
Summary
Should DTOs have public variables? Or should they have private variables with getters and setters?

I'm teaching an XP Immersion(TM) class this week. We are writing FitNesse tests as the acceptance tests for the application we are writing. One of the programmers was using a RowFixture. RowFixture requires the use of a DTO (Data Transfer Object) and insists that the variables be public. The programmer was aghast. "DTOs are always made with private variables and getters and setters!" he said. "Why?" I asked.

Why indeed? Has the religion of OO carried us so far away from common sense that we can't recognize a data structure when we see one? Why do we need to bloat our code with a bunch of useless getters and setters just to fulfill some dogmatic rule that nobody can adequately explain?

In my view OO programs contain two kinds of entities: Objects and Data Structures. Objects have private data and public methods. Data Structures have public data and no methods (or sometimes trivial navigational methods). There are very good reasons for keeping the variables in an object private. We want to know which functions can manipulate them. We want to protect the invariants of the object. We don't want others to depend on our details (DIP). On the other hand there is no good reason to use getters and setters in a data structure. A data structure is simply a packet of data, nothing more.

DTO的迷思,以及“对象”和“数据结构”

“对象不应该有public的field,应该用getter/setter将field封装起来。”我们对于这个规则已经太熟悉,熟悉得完全忘记了它的由来。Uncle Bob提出了一个问题:完全用于传输...
  • chenguoda
  • chenguoda
  • 2008年04月12日 14:59
  • 237

DTO与VO,PO等常见值对象的区别

ational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。 ...
  • AnneQiQi
  • AnneQiQi
  • 2016年05月19日 20:38
  • 1361

DTO--数据传输对象

层间数据传输的过程就是服务的执行者将数据返回给服务的调用者的过程。在非分布式系统中由于有类似Open session in view这样的“怪胎解决方案”的存在,所以层间数据传输的问题并没有充分暴露出...
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2013年10月18日 11:13
  • 15959

dao和dto

DAO: data access object数据访问对象 这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要. 主要用来封装对数据库的访问。 通过它可以把POJO持久化为P...
  • uikoo9
  • uikoo9
  • 2013年04月09日 21:02
  • 3221

DTO数据传输对象、AutoMapper了解(一)

在web应用程序中,我们通常把系统结构分为三层/多层。 其中Model层存放我们的实体类. UI层,业务逻辑层,数据访问层均引用了Model层. 在前台页面发送一个http请求,后台处理...
  • q646926099
  • q646926099
  • 2016年07月26日 16:55
  • 1521

什么是DTO

转贴:http://book.csdn.net/bookfiles/427/10042715313.shtml    层间数据传输的过程就是服务的执行者将数据返回给服务的调用者的过程。在非分布式系统中...
  • syzhwh
  • syzhwh
  • 2008年06月04日 15:44
  • 3526

DTO和POJO实体类之间值映射

package cn.test.util; import java.lang.reflect.Method; import java.util.List; public class AutoMap...
  • q646926099
  • q646926099
  • 2017年08月31日 15:58
  • 282

Struts2 将页面参数赋值给DTO

 1、实现ServletRequestAware使用原生态HttpServletRequest    HttpServletRequest request = getRequest(); Enu...
  • linminqin
  • linminqin
  • 2011年05月25日 20:08
  • 3235

框架中为何要定义DTO

我们为什么需要DTO(数据传输对象) DTO即数据传输对象。但从定义上看就是简单的用来传递数据的。主要用途是在框架中定义DTO来绑定表现层中的数据。学过MVC、EF实体模型的都应该知道,我们可以定义...
  • ydm19891101
  • ydm19891101
  • 2015年02月12日 13:49
  • 791

Hibernate根据查询内容封装成对象(DTO)

List list=session.createQuery("select new dto.SpacesDTO(s.id, s.num, s.state, s.type, o.name) from S...
  • wwwcomcn123
  • wwwcomcn123
  • 2013年11月02日 19:27
  • 1826
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DTO的迷思,以及“对象”和“数据结构”
举报原因:
原因补充:

(最多只允许输入30个字)