質問

最近、データ転送オブジェクト(DTO)はアンチパターン

なぜですか?代替手段は何ですか?

役に立ちましたか?

解決

一部のプロジェクトには、すべてのデータが2回ある。ドメインオブジェクトとして1回、データ転送オブジェクトとして1回。

この複製には莫大なコストがかかります。そのため、アーキテクチャは価値があるためにこの分離から大きな利益を得る必要があります。

他のヒント

DTOはアンチパターンではありません。ワイヤーを介して(たとえば、Ajax呼び出しのWebページに)データを送信する場合、宛先が使用するデータのみを送信することで帯域幅を確実に節約する必要があります。また、プレゼンテーション層がネイティブのビジネスオブジェクトとはわずかに異なる形式のデータを持つと便利な場合がよくあります。

これはJava指向の質問ですが、.NET言語では、匿名型、シリアル化、およびLINQを使用すると、DTOをオンザフライで構築できるため、セットアップと使用時のオーバーヘッドが削減されます。

EJB 3.0のAntiPatternのDTO は次のように述べています。

  

エンティティの重い性質   以前のEJB仕様のBean   EJB 3.0、使用の結果   データ転送のようなデザインパターン   オブジェクト(DTO)。 DTOは   軽量オブジェクト(   エンティティBean自体でした   最初の場所)、送信に使用   層全体のデータ...現在EJB 3.0   specはEntity Beanモデルを同じにします   プレーンな古いJavaオブジェクト(POJO)として。と   この新しいPOJOモデルでは、   それぞれにDTOを作成する必要が長くなります   エンティティまたは一連のエンティティ... If   EJB 3.0エンティティを送信したい   層を越えてそれらをちょうど作ります   java.io.Serialiazableを実装する

DTO自体がアンチパターンであるとは思いませんが、DTOの使用に関連するアンチパターンがあります。ビル・ダドニーは、例としてDTO爆発について言及しています。

http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf

ここに記載されているDTOの不正使用も多数あります:

http:// anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/

これらは、階層間でデータを渡す手段として3層システム(通常はテクノロジーとしてEJBを使用)が原因で発生しました。 Springなどのフレームワークに基づく最新のJavaシステムのほとんどは、単一層でドメインオブジェクト(多くの場合、JPAなどの注釈が付けられている)としてPOJOを使用する別の簡略化されたビューを使用します。ここでのDTOの使用は不要です。

オブジェクト指向の純粋主義者は、オブジェクトが実際のドメインオブジェクトではなくデータテーブル表現になるため、DTOはアンチパターンであると言うでしょう。

DTOが悪用される可能性があるため、DTOはアンチパターンであると考える人もいます。あるべきでない/そうする必要がないときによく使われます。

この記事いくつかの不正行為について漠然と説明しています。

分散システムを構築する場合、DTOは確かにアンチパターンではありません。その意味で誰もが開発するわけではありませんが、(たとえば)Open SocialアプリをすべてJavaScriptで実行している場合。

APIに大量のデータを投稿します。次に、これは何らかの形式のオブジェクト(通常はDTO / Requestオブジェクト)に逆シリアル化されます。次に、これを検証して、入力されたデータが正しいことを確認してから、モデルオブジェクトに変換します。

私の意見では、誤用されているため、アンチパターンと見なされています。分散システムを構築していない場合、おそらく必要ないでしょう。

すべてのドメインオブジェクトに関連オブジェクトをEAGERlyでロードさせると、DTOはアンチパターンではなく必要になります。

DTOを作成しない場合、ビジネスレイヤーからクライアント/ Webレイヤーに不要なオブジェクトが転送されます。

この場合のオーバーヘッドを制限するには、DTOを転送します。

データ転送オブジェクトの目的は、さまざまなソースからデータを保存してから転送することです一度にデータベース(またはリモートファサード)に追加します。

ただし、 DTOパターンは単一責任原則に違反しています。DTOはデータを保存するだけでなく、データベース/ファサードとの間でデータを転送するためです。

データオブジェクトをビジネスオブジェクトから分離する必要は、アンチパターンではありません。おそらく、データベースレイヤーを分離します。

DTOの代わりに、オブジェクトのコレクションを分離する集約パターンとリポジトリパターンを使用する必要があります(集約)およびデータ転送(リポジトリ)。

オブジェクトのグループを転送するには、作業単位パターンを使用できます。リポジトリとトランザクションコンテキストのセット。トランザクション内で集約内の各オブジェクトを個別に転送するため。

質問は" why"ではなく、" when "にする必要があります。

間違いなく、それを使用した結果のみがコストが高い場合のアンチパターン-ランタイムまたはメンテナンス。データベースエンティティクラスと同じ数百のDTOを持つプロジェクトに取り組みました。単一のフィールドを追加するたびに、広告を4回(DTO、エンティティ、DTOからドメインクラスまたはエンティティへの変換、逆変換など)のように追加します...一貫性がありません。

ドメインクラスの異なる表現が本当に必要な場合はアンチパターンではありません-よりフラットで、よりリッチで、より狭い...

個人的には、ドメインクラスから始めて、適切な場所で適切なチェックを行って渡します。注釈を追加したり、「ヘルパー」を追加したりできます。 JSON、XMLなどのシリアル化形式へのマッピング、データベースへのクラス...必要に応じて、クラスをいつでも2つに分割できます。

それはあなたの視点に関するものです-ドメインオブジェクトは、互いに作成された複数のオブジェクトではなく、さまざまな役割を果たしている単一のオブジェクトとして見ることを好みます。オブジェクトが持つ唯一の役割がデータの転送である場合、それはDTOです。

すべてのリモートオブジェクトをDTOとして実装すると、アンチパターンになる可能性があると人々は考えていると思います。 DTOは単なる属性のセットであり、大きなオブジェクトがある場合は、それらを必要としない場合や使用しない場合でも、すべての属性を常に転送します。後者の場合、プロキシパターンを使用することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top