Javaデータ転送オブジェクトネーミング条約?
-
19-09-2019 - |
質問
クライアントライブラリによってAPIに渡される「転送オブジェクト」(Pojo's Just Getters/Settersを使用)を持っているこのシナリオを考えると、転送オブジェクトに名前を付ける最良の方法は何ですか?
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
. 。彼らは異なるパッケージにありますが、同じ名前を持っていると混乱していると思います。転送オブジェクトの名前を付ける方法についてのベストプラクティスはありますか?
解決
通常、クラス名の最後に「DTO」を追加し、すべてのDTOを自分のパッケージに入れます。あなたの例では、私はそれをcom.x.core.dto.cardtoと呼びます。
他のヒント
dアタ tランサフ obuject クラスはに従う必要があります 名前コンベンション で定義されています Java言語仕様:
クラスタイプの名前は、大文字の各単語の最初の文字と混合した場合、説明的な名詞または名詞句である必要があります。
ClassLoader SecurityManager Thread Dictionary BufferedInputStream
[...]
クラス名の接尾辞 dto また dto 本当に意味がなく、クラス自体についてあまり語っていません。説明する名前を使用することを検討してください 目的 あなたのクラスの。
以下は、使用できる名前の提案の網羅的ではないリストです。
- somesortof指示
- somesortof構成
- somesortof資格
- somesortof詳細
- somesortofエレメント
- somesortofイベント
- somesortofヘッダ
- somesortof入力
- somesortof命令
- somesortofアイテム
- somesortofメッセージ
- somesortofメタデータ
- somesortof手術
- somesortof出力
- somesortofペイロード
- somesortof投影
- somesortofqueryparameter
- somesortofqueryResult
- somesortof表現
- somesortofリクエスト
- somesortofリソース
- somesortof応答
- somesortof結果
- somesortof行
- somesortof設定
- somesortof仕様
- somesortof状態
- somesortof概要
注1: 頭字語であろうとすべての大文字の単語を単語として処理する必要があるかどうかにかかわらず、私はそれがあなた次第だと思います。を確認します Java API そして、あなたはようないくつかのつまずきを見つけるでしょう ZipInputStream
/ GZIPInputStream
. 。両方のクラスがあります 同じパッケージ そして、名前条約は一貫していません。 HttpURLConnection
頭字語との一貫性も示されません。
注2: 上記のいくつかの名前はこれから借りました 論文 によって書かれた リチャード・ディングウォール (元の記事はもう利用できないようですので、 これがキャッシュされたコピーです Webアーカイブから)。
DTOまたはDAOなどを追加すると、乾燥します。 FQNは、特に本当に同じものであれば、まったく問題ありません。
この種の行動を示すクラスには、ベストプラクティスやコンベンションがあるとは思いません。私は個人的には、クラス名のいずれの単語オブジェクトが好きではありません。 poko.carなどの資格を使用するか、車(Pojoアクセス用)Carbiz(ビジネスドメインクラスの場合)のような命名条約を使用することもできます。
または、クラス名の単語オブジェクトを気にしない場合は、cardto(車のデータ転送オブジェクト)のようなものになります
使用している他のコードコンベンションの中で適切なコンベンションを使用します。私は個人的に「 "to"に接尾辞を使用します(たとえば、顧客ドメインクラスに関連付けられたデータ転送オブジェクトはCustomertoという名前です)。また、パッケージ構造は、各タイプのクラスの意図を伝える必要があります(so.foo.domain.customer and so.foo.transport.customerto)