私の意見では、それは絶対に意味ではありません。そして、それはDRYの違反です。
アイデアは、真ん中のエンティティ/ドメインオブジェクトが、ドメインを可能な限り適切かつ便利に表すようにモデル化されるということです。ドメイン自体はほとんど変更されないため、すべての中心にあり、すべてがそれに依存する可能性があります。
外部のデータベースがこれらのオブジェクトを直接保存できる場合、レイヤーを分離するために別の形式にマッピングすることは無意味であるだけでなく、モデルの複製を作成することも意図していません。
まず、クリーンなアーキテクチャは、異なる典型的な環境/シナリオを念頭に置いて作成されました。独自の種類の特別なオブジェクトを必要とする巨大な外部層を持つビジネスサーバーアプリケーション。たとえば、SQLRow
オブジェクトを生成しSQLTransactions
、その代わりにアイテムを更新する必要があるデータベース。センターでそれらを使用する場合、コアがデータベースに依存するため、依存関係の方向に違反することになります。
エンティティオブジェクトを読み込んで格納する軽量のORMでは、そうではありません。彼らは、内部SQLRow
とドメインの間のマッピングを行います。@Entitiy
ドメインオブジェクトにORMの注釈を挿入する必要がある場合でも、これは外部層の「言及」を確立しないと主張します。注釈は単なるメタデータであるため、特に注釈を探していないコードには注釈が表示されません。さらに重要なことは、それらを削除したり、別のデータベースの注釈に置き換えたりしても、変更する必要はありません。
対照的に、ドメインを変更し、それらすべてのマッパーを作成した場合、多くの変更を行う必要があります。
修正:上記は少し単純化しすぎており、間違っている可能性さえあります。クリーンアーキテクチャには、レイヤーごとにリプレゼンテーションを作成することを望む部分があるためです。しかし、それはアプリケーションのコンテキストで見なければなりません。
すなわち、次のhttps://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
重要なことは、分離された単純なデータ構造が境界を越えて渡されることです。エンティティまたはデータベース行をごまかして渡したくありません。データ構造に、依存関係ルールに違反する種類の依存関係を持たせたくありません。
エンティティを中心から外側の層に渡すことは、依存関係の規則に違反しませんが、言及されています。しかし、これには、想定されるアプリケーションのコンテキストで理由があります。エンティティを渡すと、アプリケーションロジックが外側に移動します。外側のレイヤーは、内側のオブジェクトを解釈する方法を知る必要があり、「ユースケース」レイヤーのような内側のレイヤーが行うべきことを効果的に実行する必要があります。
それに加えて、コアへの変更が必ずしも外側のレイヤーの変更を必要としないように、レイヤーを分離します(SteveCallenderのコメントを参照)。そのコンテキストでは、オブジェクトが使用目的を具体的に表す方法を簡単に確認できます。また、この通信の目的のために特別に作成されたオブジェクトの観点から、その層は互いに対話する必要があります。これは、3つの表現(各レイヤーに1つ、レイヤー間のトランスポートに1つ)があることを意味する場合もあります。
そして、上記に対処するhttps://blog.8thlight.com/uncle-bob/2011/11/22/Clean-Architecture.htmlがあります。
他の人々は、私のアドバイスの最終的な結果が、コードの重複と、システムのレイヤー全体であるデータ構造から別のデータ構造へのデータの大量のコピーになることを心配しています。確かに私はこれも望まない。そして、私が示唆したことは、データ構造の繰り返しとフィールドコピーの異常を必然的にもたらすものではありません。
IMOは、オブジェクトの単純な1:1コピーは、実際には適切なレイヤーおよび/または抽象化を使用していないため、アーキテクチャの臭いであることを意味します。
彼は後で彼がすべての「コピー」をどのように想像するかを説明します
2つの間で単純なデータ構造を渡すことにより、UIをビジネスルールから分離します。コントローラーにビジネスルールについては何も知らせません。代わりに、コントローラーはHttpRequestオブジェクトを単純なバニラデータ構造にアンパックし、ビジネスオブジェクトを呼び出すことでユースケースを実装するインタラクターオブジェクトにそのデータ構造を渡します。次に、インタラクターは応答データを別のバニラデータ構造に収集し、UIに返します。ビューはビジネスオブジェクトについて知りません。彼らは単にそのデータ構造を見て、応答を提示します。
このアプリケーションでは、表現に大きな違いがあります。流れるデータは、エンティティだけではありません。そして、これは異なるクラスを保証し要求します。
ただし、Photo
エンティティに約0のビジネスルールがあり、それらを扱う「ユースケース」がほとんど存在せず、実際にはキャッシングとダウンロードに関心がある写真ビューアーなどの単純なAndroidアプリケーションに適用されます(そのプロセスはIMOより明確に表されます)、写真の別々の表現をするポイントは消え始めます。写真そのものがデータ転送オブジェクトであり、実際のビジネスロジックコアレイヤーが欠落しているという感覚さえ感じます。
「2つの間で単純なデータ構造を渡すことにより、ビジネスルールからUIを分離する」と「途中で写真の名前を3回変更して表示する場合」には違いがあります。
それに加えて、これらのデモアプリケーションがクリーンアーキテクチャを表すのに失敗するのは、レイヤーを分離するためにレイヤーを分離することを非常に重視しているが、アプリケーションの動作を事実上隠すことです。これはhttps://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.htmlで言われていることとは対照的です-つまり
ソフトウェアアプリケーションのアーキテクチャは、アプリケーションのユースケースについて叫びます
クリーンアーキテクチャでは、レイヤーを分離することに重点が置かれていません。これは、依存関係の方向性と、アプリケーションのコア(エンティティとユースケース)を、外部への依存関係のない理想的なプレーンJavaで表すことに焦点を当てています。そのコアに対する依存関係についてはそれほどではありません。
そのため、アプリケーションにビジネスルールとユースケースを表すコアが実際にある場合、および/または異なる人々が異なるレイヤーで作業する場合は、意図した方法でそれらを分離してください。一方、単純なアプリをすべて自分で作成する場合は、無理をしないでください。流な境界を持つ2層で十分かもしれません。また、レイヤーは後で追加することもできます。
BankAccount
が、アプリケーション固有のルールを使用すると、そのアカウントで何ができるかを確認できます。