データ転送オブジェクトは値オブジェクトと同じですか?
質問
データ転送オブジェクトは値オブジェクトと同じですか、それとも異なりますか?それらが異なる場合、どこでDTOを使用し、どこでVOを使用する必要がありますか?
私たちが話しているプログラミング言語はJavaであり、コンテキストは次のとおりです。データベースからデータをフェッチして処理し、最終的に処理された情報がフロントエンドに表示されるWebアプリケーションがあります。
解決
値オブジェクトは、同等性がアイデンティティに基づいていない単純なオブジェクトです。 データ転送オブジェクトは、ソフトウェアアプリケーションサブシステム間、通常はビジネスレイヤーとUI間でデータを転送するために使用されるオブジェクトです。プレーンデータのみに焦点を合わせているため、動作はありません。
他のヒント
実際のドメインオブジェクトをサービスのクライアントに送信したくない場合は、サービスの境界でDTOを使用します。これにより、クライアントとサービス間の依存関係を減らすことができます。
valuesオブジェクトは、同等性がIDに基づいていない単なるオブジェクトです。java.lang.Integer
DTOと値オブジェクトは実際には互いに代替ではありません。
データ転送オブジェクトは、大量のデータを1つのレイヤーまたは階層から別のレイヤーに移動するための応急修理です。目標は、大量のデータを同じデータ構造にパックして送信することにより、呼び出しの数を最小限に抑えることです。一緒。 Michaelがここの投稿で指摘しているのように、1つのレイヤーで使用されているクラスが公開されないように使用する人もいます。それを呼び出すレイヤーに。 DTOを応急修理と呼ぶとき、実装される正確な抽象的な概念がないことを意味します。これは、アプリケーション層間の通信を支援するための実用的な回避策です。
値オブジェクトは、金額、日付範囲、またはルックアップテーブル。それはアイデンティティを持っていません。つまり、それらがいくつかあったとしても、それ自体は物ではないので、どれがどれであるかを追跡することについて心配する必要はありません。
値オブジェクトを、エンティティと呼ばれる、システム内で一意のIDを持つものと対比します。顧客が支払いを行っていることを追跡するシステムがある場合、顧客と支払いは特定のものを表すためエンティティですが、支払いの金額は単なる値であり、それ自体では存在しません。あなたのシステムに関する限り。何かがシステムにどのように関連しているかによって、それが値オブジェクトであるかエンティティであるかが決まります。
それらは異なりますが、私は過去に2つを同じ意味で使用したことがあり、それは間違っています。Core J2EE Patternsブックの初版では、DTO(データ転送オブジェクト)がVO(値オブジェクト)と呼ばれていることを読みましたが、その参照を見つけることができませんでした。
DTO。これは、コンテナーであり、レイヤーと層の間でデータを転送するために使用されるビジネスロジックを持たないようにするために、ダム転送オブジェクトと呼ばれることもあります。ゲッター/セッターを持つ属性を持つオブジェクトである必要があります。
ただし、VOはJAVA列挙型に似ており、固定されたデータセットを表します。VOにはオブジェクトID(メモリ内のオブジェクトインスタンスのアドレス)がなく、その値によって識別され、不変です。