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