1. ホーム
  2. java

[解決済み] DTO、VO、POJO、JavaBeansの違い?

2022-03-15 22:11:46

質問

似たような質問をいくつか見かけました。

また、どのような場面で使用されるのか、教えてください。あるいは、その目的について教えてください。

解決方法は?

ジャバビーンズ

JavaBeanは、以下のようなクラスです。 JavaBeansの規約 が定義したものです。Wikipediaには ジャバビーンズ があります。

JavaBeansは、ビルダーツールで視覚的に操作できるJavaの再利用可能なソフトウェアコンポーネントです。実質的には、特定の規約に従ったJavaプログラミング言語で書かれたクラスである。多くのオブジェクトを1つのオブジェクト(Bean)にカプセル化するために使用され、複数の個別のオブジェクトとしてではなく、1つのBeanオブジェクトとして受け渡しできるようにします。JavaBeanは,シリアライズ可能で,nullaryコンストラクタを持ち,ゲッター及びセッターメソッドを用いてプロパティにアクセスできるJavaオブジェクトである。

JavaBeanクラスとして機能するために、オブジェクトクラスはメソッドの命名、構築、および動作に関する特定の規則に従わなければなりません。これらの規約は,JavaBeansを使用し,再利用し,置き換え,接続することができるツールを可能にする。

必要な規約は以下の通りです。

  • クラスは、パブリックなデフォルトコンストラクタを持つ必要があります。これにより、編集および起動フレームワーク内で簡単にインスタンスを作成することができます。
  • クラスのプロパティは、標準的な命名規則に従って、get、set、その他のメソッド(いわゆるアクセッサメソッドやミューテータメソッド)を使ってアクセスできなければなりません。これにより,フレームワーク内で,ビーン状態の自動検査及び更新を容易に行うことができ,その多くは,様々なタイプのプロパティに対するカスタムエディタを含む。
  • クラスはシリアライズ可能であるべきである。これにより、アプリケーションやフレームワークは、VMやプラットフォームに依存しない方法で、Beanの状態を確実に保存、保管、復元することができます。

これらの要件は、インターフェースの実装ではなく、主に規約として表現されるため、開発者の中には、JavaBeansを特定の命名規則に従ったPlain Old Java Objectsと見なす人もいます。

POJO

Plain Old Java Object(POJO)とは、当初はシンプルで軽量なJavaオブジェクトを示すために導入された用語であり、いかなる javax.ejb 重量のあるEJB 2.x(特にEntity Beans、Stateless Session Beansはそれほど悪くないIMO)とは対照的に、インターフェイスを備えています。今日、この用語は、余分なものを持たない単純なオブジェクトに使用されます。繰り返しになりますが、Wikipediaは以下の定義で良い仕事をしています。 POJO :

POJOはPlain Old Java(プレーンオールドジャバ)の頭文字をとったものです。 オブジェクトです。この名前は であることを示します。 通常のJavaオブジェクトであり、特別なものではありません。 オブジェクトではなく、特に エンタープライズJavaBean(特に EJB3)。この用語は、Martin ファウラー、レベッカ・パーソンズ、ジョシュの3人。 2000年9月、マッケンジー。

<ブロッククオート

私たちは、なぜ人々が通常のオブジェクトを使用することに反対しているのか不思議に思っていました。 という結論に至りました。 シンプルなオブジェクトには という名前を付けました。そこで、私たちはそのような名前をつけました。 は、とてもうまくいきました。

この用語は を意味する古い用語です。 のように、派手な新機能は使わない。 POTS (Plain Old Telephone Service)の略。 テレフォニー、PODS(Plain Old Data C++で定義された構造体 が、C言語の機能しか使っていないものや PerlのPOD(Plain Old Documentation)です。

この用語は、おそらく 広く受け入れられるようになったのは 一般的でわかりやすい とは対照的な理解しやすい用語です。 複雑なオブジェクトフレームワーク A JavaBeanは、以下のようなPOJOです。 シリアライズ可能で、引数なしの コンストラクターにアクセスし プロパティはゲッターとセッターを使用して メソッドを使用します。エンタープライズJavaBeanは 単一のクラスではなく、コンポーネント全体 モデルです(これもEJB 3で軽減されました)。 Enterprise JavaBeansの複雑さ)。

POJOを使用した設計の普及に伴い より一般的に使用されるようになり、システム の一部をPOJOに与えるものが出てきました。 フレームワークで使用されている機能や どの部分を選択するか を、実際に必要とされている機能です。 HibernateやSpringがその例である。

バリューオブジェクト

バリューオブジェクトまたはVOは、次のようなオブジェクトです。 java.lang.Integer 値を保持するものです(だからバリューオブジェクト)。より正式な定義については、私はしばしばMartin Fowlerによる バリューオブジェクト :

エンタープライズ・アプリケーション・アーキテクチャのパターンでは、Value ObjectをMoneyやDate Range Objectのような小さなオブジェクトと説明した。その重要な特性は、参照セマンティクスではなく、値セマンティクスに従うということである。

2つのバリューオブジェクトが等しいのは、すべてのフィールドが等しい場合です。すべてのフィールドが等しいといっても、一部のフィールドが一意であればすべてのフィールドを比較する必要はありません。たとえば、通貨オブジェクトの通貨コードは、等価性をテストするのに十分です。

一般的なヒューリスティックとして、バリューオブジェクトは完全にイミュータブルであるべきです。もしバリューオブジェクトを変更したい場合は、そのオブジェクトを新しいものに置き換えるべきで、バリューオブジェクトの値自体を更新することは許されません。

初期のJ2EE文献では、バリュー・オブジェクトという用語を使って別の概念を表現していました。 データ転送オブジェクト . その後、彼らは使い方を変え、以下の用語を使用しています。 転送オブジェクト の代わりに

バリューオブジェクトに関するより良い資料が ウィキ および ディルク・リエーレ .

データ転送オブジェクト

Data Transfer ObjectまたはDTOは、EJBで導入された(アンチ)パターンである。EJBで多くのリモートコールを実行する代わりに、データをネットワーク経由で転送できる値オブジェクトにカプセル化することです:Data Transfer Object。Wikipediaにちゃんとした定義がある データ転送オブジェクト :

データ転送オブジェクト(DTO)は、以前はバリューオブジェクトまたはVOと呼ばれ、ソフトウェアアプリケーションのサブシステム間でデータを転送するために使用されるデザインパターンである。DTOは、データベースからデータを取得するために、データアクセスオブジェクトと組み合わせて使用されることがよくあります。

データ転送オブジェクトとビジネスオブジェクトやデータアクセスオブジェクトとの違いは、DTOは自身のデータの保存と取り出し(アクセッサとミューテータ)以外の振る舞いを持たないということです。

1つ目は、エンティティビーンがシリアライズ可能ではないという問題を回避すること、2つ目は、ビューで使用されるすべてのデータをフェッチしてDTOにマーシャルしてからプレゼンテーション層に制御を戻すというアセンブリフェーズを暗黙のうちに定義することです。


つまり、多くの人にとって、DTOとVOは同じものなのです(しかし、Fowlerは見たとおり、VOを別の意味で使っています)。ほとんどの場合、それらはJavaBeansの規約に従っており、したがってJavaBeansでもある。そして、すべてPOJOです。