【问题标题】:Java data transfer object naming convention?Java 数据传输对象命名约定?
【发布时间】:2010-12-16 00:52:35
【问题描述】:

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

【问题讨论】:

  • 在客户端库中,可以改名吗?
  • 是的,我们控制着客户端库。因此,如果我们愿意,我们可以将名称更改为“ClientCar”。
  • 本例中没有主类。冒着让自己失业的风险,我必须声明我对 DTO、POJO 等没有任何信仰。

标签: java naming-conventions data-transfer-objects


【解决方案1】:

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

【讨论】:

  • 它不是特别漂亮,但它确实意味着您可以同时导入 dto 和“main”类。没有后缀会使所有额外的包名的复制代码非常难看。
  • 当我有多个同一个类的 DTO 时会怎样?
  • 我会避免在 DTO 中使用大写字母 - 如果在类名中使用缩写,它会使其可读性降低。这就是为什么我更喜欢CarDto
【解决方案2】:

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

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

【讨论】:

  • 你觉得类 java.lang.Object 怎么样?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我不反对.. 除了我发现同名的代码让人难以理解。您可以指定使用客户端 API 的 FQN,但这也有点麻烦。
    • 清晰度也是一个重要的考虑因素。 DRY 很重要,但并非不可侵犯。当其他考虑被证明同样重要或更重要时,我们遵循的大多数原则都可能被违反。对 DRY 的迂腐也会导致代码中的异味。
    • 当您有原始实体、DTO 对象、缓存对象、NoSQL 对象,所有名称都相同,只是在不同的包中时,什么都不添加会使在 IDE 中找到正确的对象变得更加困难。跨度>
    • FQN 是并且不应在代码中使用。嘘。
    • FQN 表示完全限定名称,以防万一有人想知道
    【解决方案5】:

    Data Transfer Object 类应该遵循在Java Language Specification 中定义的name convention

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

    ClassLoader
    SecurityManager
    Thread
    Dictionary
    BufferedInputStream
    

    [...]


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

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

    • SomeSortOf命令
    • SomeSortOf配置
    • SomeSortOf凭据
    • SomeSortOf详情
    • SomeSortOf元素
    • SomeSortOf事件
    • SomeSortOf过滤器
    • SomeSortOf标题
    • SomeSortOf输入
    • SomeSortOf说明
    • SomeSortOf项目
    • SomeSortOf消息
    • SomeSortOf元数据
    • SomeSortOf操作
    • SomeSortOf输出
    • SomeSortOf有效负载
    • SomeSortOf投影
    • SomeSortOf属性
    • SomeSortOf查询参数
    • SomeSortOf查询结果
    • SomeSortOf表示
    • SomeSortOf请求
    • SomeSortOf资源
    • SomeSortOf响应
    • SomeSortOf结果
    • SomeSortOf
    • SomeSortOf设置
    • SomeSortOf规范
    • SomeSortOf状态
    • SomeSortOf总结

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

    注2:上面列出的一些名字是从Richard Dingwall写的这个article借来的(原来的文章好像已经没有了,所以here's a cached copy来自Web Archive )。

    【讨论】:

    • 不太相信。例如,异常类通常具有“异常”后缀。您是否认为这也是不好的做法。您能否说明在什么情况下可以接受静态后缀。谢谢!
    • @OleksandrPapchenko 我不确定这是否是一个公平的比较。 DTO 后缀是宽泛的、抽象的,并没有说明太多关​​于类本身的信息。如果您打算使用 DTO 模式,请选择一个描述类含义的名称。例如,QueryParameterQueryResult 后缀比 DTO 后缀更清楚地定义了表示查询参数或查询结果的类。
    • “没有真正的意义,也没有过多地说明类本身”它准确地描述了类的目的是什么,数据传输。 Car 类是一个真实世界的实体,它应该包含行为和业务约束。 CarDto 类是一个包含用于传输的数据的类。尤其是当 DTO 这个词广为人知时,看到 CarDto 的人会确切地知道它是什么,而不是看到两个 Car 类。
    • 帖子好像还在,只是在另一个域下:richarddingwall.name/2010/04/17/…
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2020-07-27
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多