Java 数据传输对象命名约定?

假设您有“传输对象”(POJO,只有 getters/setters),它们由客户端库传递到您的 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


答案 1

Data Transfer Object 类应遵循 Java 语言规范中定义的名称约定

类类型的名称应是描述性名词或名词短语,不要太长,在混合大小写中,每个单词的第一个字母大写。

ClassLoader
SecurityManager
Thread
Dictionary
BufferedInputStream

[...]


在类名后添加 DTODto 后缀除了指示类携带数据而没有任何行为之外,不会对类本身有太多了解。因此,与其将对象称为 DTO,不如考虑更有意义的名称,这些名称为类传达更好的语义。

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

  • SomeSortOfCommand
  • SomeSortOfConfiguration
  • SomeSortOfCredentials
  • SomeSortOfDetails
  • SomeSortOfElement
  • SomeSortOfEvent
  • SomeSortOfFilter
  • SomeSortOfHeader
  • SomeSortOfInput
  • SomeSortOfInstruction
  • SomeSortOfItem
  • SomeSortOfMessage
  • SomeSortOfMetadata
  • SomeSortOfOperation
  • SomeSortOfOutput
  • SomeSortOfPayload
  • SomeSortOfProjection
  • SomeSortOfProperties
  • SomeSortOfQueryParameter
  • SomeSortOfQueryResult
  • SomeSortOfRepresentation
  • SomeSortOfRequest
  • SomeSortOfResource
  • SomeSortOfResponse
  • SomeSortOfResult
  • SomeSortOfRow
  • SomeSortOfSettings
  • SomeSortOfSpecification
  • SomeSortOfStatus
  • SomeSortOfSummary

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

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


答案 2

我通常会在类名的末尾添加“DTO”,并将所有DTO放在自己的包中。在你的例子中,我会称之为com.x.core.dto.CarDTO。