Java数据传输对象的命名规范?

86

假设有这样一个情境,您有一些“传输对象”(POJO,只包含 getter/setter 方法),这些对象由客户端库传递给您的 API。在这种情况下,最佳的传输对象命名方式是什么?

package com.x.core; 

public class Car {
        private String make;
        private String model;

        public Car(com.x.clientapi.Car car) {
             this.make = car.getMake();
             this.model = car.getModel();
        }
}

在这个例子中,你的主类和传输对象都名为Car。它们位于不同的包中,但我认为使用相同的名称会令人困惑。是否有最佳实践来命名传输对象?


它在客户端库中,你可以更改名称吗? - Murali VP
是的,我们控制客户端库。因此,如果我们想要,我们可以将其更改为“ClientCar”。 - Marcus Leon
1
这个例子中没有主类。冒着让自己失业的风险,我必须声明我完全不相信 DTOs、POJOs 等等。 - user207421
7个回答

255

数据传输对象Data Transfer Object类应该遵循命名约定, 这个约定在Java语言规范中有定义:

Names of class types should be descriptive nouns or noun phrases, not overly long, in mixed case with the first letter of each word capitalized.

ClassLoader
SecurityManager
Thread
Dictionary
BufferedInputStream

[...]


在类名后面加上DTO或Dto并不能告诉我们太多关于这个类本身的信息,除了表明它携带数据而没有任何行为。因此,不要仅仅称呼你的对象为DTO,考虑使用更有意义的名称,以传达类更好的语义。
以下是一些可能会用到的名称建议,但并不穷尽:
  • 某种命令
  • 某种配置
  • 某种凭证
  • 某种详情
  • 某种元素
  • 某种事件
  • 某种过滤器
  • 某种头部
  • 某种输入
  • 某种指令
  • 某种
  • 某种消息
  • 某种元数据
  • 某种操作
  • 某种输出
  • 某种负载
  • 某种投影
  • 某种属性
  • 某种查询参数
  • 某种查询结果
  • 某种表示
  • 某种请求
  • 某种资源
  • 某种响应
  • 某种结果
  • 某种
  • 某种设置
  • 某种规范
  • 某种状态
  • 某种摘要

注意1:缩略语或全大写单词是否应该作为单词处理,我想这取决于您。查看Java API,您将发现一些障碍,例如ZipInputStream / GZIPInputStream。这两个类位于同一个包中,命名约定不一致。HttpURLConnection也没有遵循缩略语的一致性。

注意2:上述一些名称是从Richard Dingwall撰写的文章中借用的(原始文章似乎不再可用,因此这里是Web Archive的缓存副本)。


6
并不完全认同。例如,异常类通常都会以“Exception”作为后缀。您是否认为这也是不良做法?请问在什么情况下使用静态后缀是可以接受的?谢谢! - Oleksandr Papchenko
6
我不确定这是一个公平的比较。 DTO 后缀很宽泛,抽象,并且不能太多地描述类本身。如果你打算使用 DTO 模式,请选择一个能描述这个类用途的名称。例如,"QueryParameter" 和 "QueryResult" 后缀比 "DTO" 后缀更清晰地定义了表示查询参数或查询结果的类。 - cassiomolin
45
“is not really meaningful and doesn't tell much about the class itself” 的意思是“并没有真正的意义,也不能很好地说明这个类本身的内容”。它确切地描述了这个类的目的——数据传输。Car类是一个现实世界中的实体,预期应该包含行为和业务限制。CarDto类是一个包含用于传输的数据的类。特别是在DTO术语被广泛使用的情况下,看到CarDto的人将会清楚地知道它是什么,而不是看到两个Car类。 - Orestis P.
1
似乎帖子仍然存在,只是在另一个域名下:https://richarddingwall.name/2010/04/17/try-not-to-call-your-objects-dtos/ - DDMC

61

通常我会在类名后面加上'DTO',并将所有DTO放在它们自己的包中。以您的示例为例,我会把它命名为com.x.core.dto.CarDTO。


3
虽然不太美观,但它确实意味着你可以导入dto和“主”类。没有后缀会让复制代码变得非常难看,还要加上所有额外的包名。 - Michael Rutherfurd
9
当我有多个相同类的DTO时,该怎么办? - Flying Dumpling
49
我建议在 DTO 中避免使用大写字母 - 如果在类名中使用缩写,会使其更难阅读。因此,我更喜欢 CarDto - Vlasec
2
当你写“Dto”时,你仍然在写一个缩写。那么,使用小写字母的“t”和“o”有什么区别呢?是因为当你使用小写字母时,“Dto”后面的单词更容易被识别吗? - SametSahin
1
@SametSahin 我认为最好将它写成小写,以尊重Java驼峰命名规范。这样看起来更易读,尽管这取决于个人偏好。 - Dorian Naaji
1
@SametSahin 我认为最好将其写成小写,以尊重Java驼峰命名规范。这样看起来更易读,尽管这取决于个人偏好。 - undefined

8

添加DTO或DAO或其他任何内容都会违反DRY原则。如果它们真的是同一件事情,完全可以使用FQN。


2
我并不反对,只是我发现代码中使用相同的名称很令人困惑。你可以指定客户端API使用的FQN,但这也有些繁琐。 - Marcus Leon
23
清晰度也是一个重要的考虑因素。保持DRY原则很重要,但并非绝对不可违反。大多数我们遵循的原则在其他考虑因素同样或更为重要时可以被违反。对DRY过于追求会导致代码中出现问题。 - Matt Friedman
24
如果在IDE中存在相同名称但位于不同包中的原始实体、DTO对象、缓存对象和NoSQL对象,而这些对象没有任何区别的话,那么如果不做任何修改,就很难找到正确的对象。 - Vlasec
2
FQN 是不应该在代码中使用的。天哪。 - magallanes
13
FQN代表Fully Qualified Name,以防有人不明白。 - kiedysktos
显示剩余2条评论

2

我看了上面的答案,只想补充一些内容。我有点讨厌 DTO 这个词,感觉它在对我尖叫。所以我尝试使用 Payload 后缀。例如,CarPayload


3
最好使用一些常见的名称,因为这样可以让其他人更快、更好地理解你的代码。 - Alex
@Alex 看看这个词本身,“DTO”,你怎么能从中理解到什么呢?只是一个缩写而已。 - ata
1
使其与仅有的模型/实体不同。 - Alex
@ata 因为它是一种设计模式,当人们看到 "DTO" 时,他们会知道你在谈论什么。但如果 Payload 对你有用,就使用它吧。 - koraljko

1

我认为没有一个最佳实践或惯例适用于呈现这种行为的类。我个人不喜欢在任何类名中使用Object这个单词。您可以使用一些限定词,例如Poko.Car,或使用一些命名约定,例如 Car(用于POJO) CarDa(用于数据访问) CarBiz(用于业务域类)

或者,如果您不介意在类名中使用对象这个词,请选择类似于CarDto(Car数据传输对象)的内容。


10
你觉得java.lang.Object这门课怎么样? - Ben Thurley

0
使用符合你正在使用的其他代码约定的惯例。我个人使用后缀“TO”(例如,与客户域类相关联的数据传输对象命名为CustomerTO)。 此外,包结构应传达每种类型类的意图(例如,so.foo.domain.Customer和so.foo.transport.CustomerTO)。

0
缩写和首字母缩略词应该使用驼峰命名法
由于“DTO”是一个有效的缩写或首字母缩略词(还有很多其他有效的缩写或首字母缩略词,例如“CPU”,“JSON”,“REST”,“HTTP”),我们将其视为其他单词一样:采用驼峰命名法。
当缩写或首字母缩略词本身被广泛知晓和理解时,即没有任何误解它可能代表什么意思时,缩写或首字母缩略词才是有效的(参见Java命名规范)。
Car car = new Car();
CarDto carDto = new CarMapper().toDto(car);

旁注 - 事物的演变:
使用驼峰命名法来缩写并不总是被实施的,有很多旧代码没有遵守这个规则(尚未),参见URL(自JDK1.0起)URL。一些代码已经发展并且是两者的混合HttpURLConnection(自JDK1.1起)HTTPURL。较新的代码大多遵循缩写的代码约定,例如来自Spring框架的代码RestTemplate REST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接