74

在这种情况下,您有“传输对象”(只有 getter/setter 的 POJO),它们由客户端库传递到您的 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。它们位于不同的包中,但我认为名称相同会​​令人困惑。是否有关于如何命名传输对象的最佳实践?

4

6 回答 6

230

数据传输对象类应遵循Java语言规范定义的命名约定

类别名称应为描述性名词或名词短语,不要过长,大小写混合,每个单词的首字母大写。

ClassLoader
SecurityManager
Thread
Dictionary
BufferedInputStream

[...]


用DTODto为类名添加后缀并没有真正的意义,也不能说明类本身代表什么。所以最好使用描述类目的的名称。

以下是您可以使用的名称建议的非详尽列表:

  • 某种命令
  • 某种配置
  • 某种凭证
  • 一些细节
  • 某种元素
  • 某种事件
  • 某种过滤器
  • 某种标题
  • 某种输入
  • 某种指令
  • 某种物品
  • 某种消息
  • 某种元数据
  • 某种操作
  • 某种输出
  • 某种有效载荷
  • 某种投影
  • SomeSortOf属性
  • SomeSortOf QueryParameter
  • SomeSortOf QueryResult
  • 某种表示
  • 某种请求
  • 某种资源
  • 某种反应
  • 某种结果
  • 某种
  • 一些设置
  • 某种规范
  • 某种状态
  • 某种总结

注 1:首字母缩写词或所有大写单词是否应作为单词处理,我想这取决于你。检查Java API,您会发现一些类似ZipInputStream/的错误GZIPInputStream。两个类都在同一个包中,命名约定不一致。HttpURLConnection也没有显示与首字母缩略词的任何一致性。

注 2:上面列出的一些名字是从Richard Dingwall写的这篇文章中借用的(原来的文章似乎不再可用,所以这里是 Web Archive 的缓存副本)。

于 2016-02-11T14:14:09.100 回答
50

我通常将“DTO”添加到类名称的末尾,并将所有 DTO 放在它们自己的包中。在您的示例中,我将其称为 com.x.core.dto.CarDTO。

于 2009-11-12T19:36:46.967 回答
7

添加 DTO 或 DAO 或其他任何内容都违反了 DRY。FQN 非常好,特别是如果它们真的是同一件事。

于 2009-11-12T19:50:15.567 回答
1

我阅读了上面的答案,我只是想添加一些东西。我不知何故讨厌这个词DTO,它似乎在对我尖叫。所以我尝试使用Payload后缀。例如,CarPayload

于 2021-02-04T12:09:30.730 回答
0

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

或者,如果您不介意类名中的对象一词,请使用 CarDto(汽车数据传输对象)之类的东西

于 2009-11-12T19:37:07.323 回答
-2

使用适合您正在使用的其他代码约定的约定。我个人使用后缀“TO”(例如,与 Customer 域类关联的数据传输对象名为 CustomerTO)。包结构也应该传达每种类的意图(so.foo.domain.Customer 和 so.foo.transport.CustomerTO)

于 2009-11-12T19:40:49.937 回答