`

不,这样的DTO!

阅读更多

 

本文翻译自 Oh No! DTO! by Robert C. Martin,这篇文章很短,强调的内容简单得不能再简单,也许大家早就意识到,但是,我依然可以在很多产品的代码里面找到文中所说的“教条”的影子,我说不清为什么,在这里有激烈的讨论,你们说呢?

 

本周我在教授XP(极限编程,译注)的课程,我们要写给当前的应用写FitNesse(一种测试工具,译注)的基础测试代码。其中一位程序员使用了RowFixture(一种测试结果比较的工具,译注),这种工具需要使用DTO(数据传输对象)并且要求其中的变量都为公有的。这时候这位程序员提出了质疑:“DTO应该使用私有的变量和一套相应的getter、setter方法!”,“为什么呢?”我问。

 

到底是为什么?面向对象的信仰如此根深蒂固地影响我们,以至于我们都无法识别出来,这里根本就只是一个数据结构吗?为什么我们要用一堆毫无用处的getter、setter方法,去遵循那些没有人可以解释的通的教条,来膨胀我们的代码呢?

 

在我的观点中,面向对象程序包含两种实体:对象和数据结构。对象有私有属性和公有方法,数据结构只有公有属性并且没有方法(或者只有一些毫无意义的数据访问方法)。有很好的理由去保持变量的私有性,我们想知道是什么方法在操纵它们,我们可以保护对象的数据,我们不想让其它人依赖对象内部的细节,即DIP(依赖倒转原则,Dependency Inversion Principle,即要依赖于抽象,不依赖于具体,译注)。但另一方面,对一个单纯的数据结构使用getter和setter并没有什么好处,一个数据结构只是一种数据简单的容器,没别的了!

 

---------------------------------------------------------------------------------------------------------------------------------

 

2012-2-22,以下补充内容译自 The C++ Style Sweet Spot by Bjarne Stroustrup:

 

 

我尤其不喜欢一个类里面有一大堆getter、setter方法,这通常意味着这个类一开始就不该是一个类,这个东西只是个数据结构。既然它是数据结构,就让它成为数据结构好了。

 

文章系本人原创,转载请注明出处和作者

0
0
分享到:
评论
1 楼 mimimao0901 2012-03-07  
有道理! DTO只是一个数据结构而已,用public更方便!

相关推荐

    分页dto把html写在dto里

    这样的做法虽然可以减少代码重复,但可能使DTO职责不单一,违反了面向对象设计原则中的单一职责原则(SRP),可能导致DTO变得复杂且难以维护。 `importsearch.jsp`看起来是一个JSP(JavaServer Pages)文件,它是...

    快速生成DTO

    DTO不包含任何业务逻辑,主要是数据容器。在这个场景中,"快速生成DTO"指的是利用Excel模板来自动化创建DTO类,显著提高开发效率。下面将详细介绍这个过程及其相关知识点。 1. **DTO的用途**: DTO主要用于接口...

    登陆的dto.zip

    DTO对象通常不包含任何业务逻辑,仅仅是数据的载体,使得不同层之间的数据交换变得简单。在这个"登陆的dto.zip"压缩包中,我们可以看到与登录功能相关的DTO对象。 首先,ideco-crm-dto可能代表CRM(Customer ...

    DTO设计模式.docx

    DTO模式的核心思想是将数据封装在一个独立的对象中,这个对象不包含任何业务逻辑,仅仅用于数据的存储和获取。这样做的好处在于,当数据需要跨层传输时,可以避免直接传递复杂的业务对象,防止了不同层之间的相互...

    视图对象(VO、DTO)的应用!

    DTO就是为此而生,它仅包含需要传输的必要字段,不包含任何业务逻辑。例如,在微服务架构中,服务A需要向服务B传递用户信息,可以创建一个UserDTO,只包含姓名、ID等必要的信息,而不是整个User实体。 这两种对象在...

    导入Excel快速生成DTO

    在IT行业中,尤其是在Java开发领域,数据传输对象(DTO,Data Transfer Object)是一种常见的设计模式,用于在系统组件之间传递数据。"导入Excel快速生成DTO"这个标题暗示了一个工具或库,它能帮助开发者从Excel文件...

    数据库表转实体类和DTO

    数据库表转实体类和DTO是软件开发中一个常见的任务,特别是在Java后端开发中,它涉及到数据模型的设计和数据访问层的操作。实体类(Entity Class)通常代表数据库中的表,而DTO(Data Transfer Object)则用于在不同...

    Any2Dto插件,可以根据数据库和JavaCode生成强类型且精确字段的DTO

    它通常包含与数据库表对应的字段,但不包含任何业务逻辑。在Web服务或分布式系统中,DTO是数据交换的载体,减少了不同组件之间的依赖。 Any2Dto插件的工作原理是基于数据库的表结构和Java源代码,分析出需要生成DTO...

    简单的EntityFramework4.3+三层+DTO 简单Demo

    简单的EntityFramework4.3+三层+DTO,如果需要简化版的,我的资源里有一个不含DTO的版本。 这个Demo的主要功能是: 1、实体类的创建、复杂类型的嵌套 2、实体类的配置(主键、外键、一对一、1对多,多对多) 3、...

    java_dao_dto生成器

    "java_dao_dto生成器" 是一个工具,它自动化了创建DAO层和DTO(Data Transfer Object)的过程。DTO是用于在系统不同组件之间传递数据的对象,通常用来避免直接暴露底层数据结构。在Java开发中,手动编写这些类可能会...

    java DTO 详解

    如果不使用DTO,客户端可能需要通过多次调用服务端的接口来获取这些信息,每次调用都需要进行序列化和反序列化操作,不仅效率低下,还可能导致数据一致性问题。 采用DTO后,服务端可以将所有相关的商品信息封装到一...

    eclipse插件,根据数据库表自动生成DTO(pojo)插件

    这样,开发者无需手动编写这些类,只需专注于业务逻辑。支持的数据库包括MySQL和Oracle,这些都是常用的开源和商业关系型数据库系统。 `annotation.jar`文件表明插件利用了Java注解(Annotation)技术。注解是Java...

    feignclient发送get请求使用dto接收参数demo

    注解中的value属性应设置为服务提供者的服务ID,这样Feign就能找到对应的服务实例。 3. **定义请求方法** 接口中定义的方法将映射到HTTP请求。例如,对于GET请求,我们可以定义一个方法并使用`@GetMapping`注解。...

    DTO代码自动生成器

    DTO(Data Transfer Object)代码自动生成器是一种工具,旨在帮助开发者快速、高效地根据数据库模型创建对应的Java实体类。在软件开发过程中,DTO通常用于在系统不同层之间传递数据,避免了直接暴露业务对象,降低了...

    Dto转实体类 AutoMapper

    4. **自定义映射**:在某些情况下,Dto和实体类的属性名称可能不完全匹配,或者需要进行更复杂的转换,如类型转换、条件判断等。这时,可以使用`ForMember`或`ForPath`方法自定义映射规则: ```csharp config....

    Python库 | lol_dto-0.1a10.tar.gz

    对于Python开发者来说,了解并掌握像"lol_dto"这样的库,可以帮助他们更高效地处理《英雄联盟》相关的数据。例如,通过这个库,开发者可以快速地获取并解析游戏中的各种数据,进而构建数据分析应用、统计报告或者...

    kingdao自动生成DAO/DTO

    modify the property file of the database path, driver, user name, password, enter CMD to the D drive is running java-jar kingdao.jar disk in D test folder under the root directory of DAO and DTO ...

    Dto,javaBean,带注释自动生成

    它不包含业务逻辑,仅仅用于数据的封装,以避免暴露内部系统的结构。Dto通常用于服务层和视图层之间的数据传递,减少网络传输的数据量,提高性能。 JavaBean则是一个符合特定规范的Java类,主要遵循以下几点: 1. ...

    DTO数据传输对象简介PPT

    DTO数据传输对象简介PPT

    EF+Mapper结合使用实现Dto到实体类再到数据的(框架模型基础实现)

    在这里,我们创建了一个`UserDto`类,它与`User`类有相似的属性,但不包含数据库相关的属性,如Id。在配置文件中,我们定义了两个映射:从`User`到`UserDto`,以及从`UserDto`到`User`。 现在,我们可以在业务逻辑...

Global site tag (gtag.js) - Google Analytics