原创 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
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.


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


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


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


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


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


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


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来绑定表现层中的数据。学过MVC、EF实体模型的都应该知道,我们可以定义...
  • ydm19891101
  • ydm19891101
  • 2015年02月12日 13:49
  • 791


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