“对象不应该有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数据传输对象简介PPT
然而,对于VO对象、DTO对象以及前端Vue页面等非预置的代码生成需求,就需要我们对默认的代码生成器进行扩展和定制。 在MyBatisPlus 3.5.3版本中,代码生成器主要有两种类:`AutoGenerator`和`FastAutoGenerator`。`...
DTO是一种无业务逻辑的对象,它通常包含一组属性,用于在服务层和表现层之间传递数据。这种方式避免了直接操作数据库对象,提高了系统的灵活性和可维护性。 在Java开发中,当我们需要处理大量的表格数据,如Excel,...
在服务层和表示层之间,DTO用于传递数据,避免了直接暴露业务对象,从而降低了耦合度。 - DTO通常不含任何业务逻辑,只包含数据字段,可以是实体类的一个简化版或者适应特定展示需求的定制版。 3. **工具自动化...
在软件开发中,视图对象(View Object,简称VO)和数据传输对象(Data Transfer Object,简称DTO)是两种常见的设计模式,它们在系统架构中起着至关重要的作用。这两种对象主要用于解决数据模型与界面展示之间的数据...
在给定的压缩包文件中,可能包含了实现这一功能的相关代码示例,包括XML文件、数据传输对象(DTO,Data Transfer Object)以及一个用于读取文件的工具类。 首先,我们需要了解JAXB的基本工作原理。JAXB提供了一种...
当DTO对象从客户端传递到服务端后,处理逻辑层会接收到DTO,解析其中的数据,执行相应的验证和处理。 再者,ideco-crm-ap可能代表CRM系统的应用层(Application Layer)或者是API接口(Application Programming ...
标题“分页dto把html写在dto里”和描述“把分页按钮写在dto里,其他dto继承他”表明了一个特殊的实践,即将HTML代码直接包含在DTO对象中,以便于处理分页功能,并且其他DTO可能通过继承这个特殊的DTO来共享相同的...
在软件开发过程中,数据传输对象(Data Transfer Object, DTO)是一种常见的设计模式,用于在系统之间传递大量数据。DTO不包含任何业务逻辑,主要是数据容器。在这个场景中,"快速生成DTO"指的是利用Excel模板来自动...
DTO模式的核心思想是将数据封装在一个独立的对象中,这个对象不包含任何业务逻辑,仅仅用于数据的存储和获取。这样做的好处在于,当数据需要跨层传输时,可以避免直接传递复杂的业务对象,防止了不同层之间的相互...
而Mapper工具则用于对象之间的映射,如AutoMapper,它可以方便地将数据传输对象(DTO,Data Transfer Object)转换为实体类或者反之,大大简化了数据层和业务层之间的数据交换。本文将详细讲解如何结合使用EF和...
DTO是一种设计模式,主要用于隔离数据的表示层和业务层,防止直接操作数据库对象。它通常包含与数据库表对应的字段,但不包含任何业务逻辑。在Web服务或分布式系统中,DTO是数据交换的载体,减少了不同组件之间的...
在“demo-workspace”文件夹中,可能包含了一个完整的项目结构,包括了配置文件、接口定义、DTO类、主启动类等,你可以进一步探索和学习这个示例。理解并掌握这一技术,将有助于构建高效、可维护的微服务架构。
Dto(Data Transfer Object)和JavaBean是Java编程中常见的两种对象模式,它们在软件开发中扮演着重要角色,尤其是在数据交换和模型表示方面。这里我们将深入探讨这两种对象以及如何通过工具自动化生成它们,并且...
让繁琐的的数据集不需要开发者自己动手就可以封装的对应的bean中去
数据结构experiment是一个实验性教学活动,旨在让学生通过实际操作和实践来学习和掌握数据结构的知识和技能。在这个实验报告中,我们将设计和实现数制转换问题,应用栈的存储结构来实现十进制数到其他进制数的转换。...
Laravel多托 。 正在安装 $ composer require cblink/laravel-dto -vvv ... 您只需要确保遵循PSR-0,PSR-1和PSR-2编码准则即可。 任何新的代码贡献都必须在适用的情况下进行单元测试。 执照 麻省理工学院
DTO(数据传输对象) 概述 创建该库是为了解决以下问题:从数据源获取数据模型,并且需要删除,添加,合并或转换数据模型为相似或完全不同的对象。 其他语言也有类似的库(DataMapper,DTO(C#)等)。 我永远找不...
在Java开发中,数据传输对象(DTO)和持久化对象(POJO)是常见的概念,它们用于在不同层之间传递数据。手动创建这些类可能会耗费大量时间,特别是在处理大量数据库表时。因此,"eclipse插件,根据数据库表自动生成...
在分布式系统的设计中,DTO(Data Transfer Object,数据传输对象)是一种非常重要的概念和技术手段。当客户端需要与服务器端进行交互时,尤其是在涉及大量的数据交换场景下,传统的做法可能会带来一系列的问题。...