5

私の Java アプリは小さく、単純なことをしていましたが、プレーンな SQL を使用することに非常に満足しており、Glassfish のようなアプリケーション サーバーによって接続管理が非常に簡単になりました。JPA と EJB について学んだ後、プロジェクトをリファクタリングしてこれらの優れた機能を使用することにしましたが、プログラミングよりも設計に関する問題に直面しました。

エンティティ Bean にビヘイビアを埋め込むのは良い方法ですか、それともデータのみを保持する必要がありますか?

私は多くのマニュアルやチュートリアルを読みましたが、優れた設計要件を満たすためにどのように使用すべきかではなく、どのように使用できるかについての回答がほとんどです。

たとえば、Userとの 2 つのクラスLocationがある場合、それらは両方ともエンティティ Beanです。Aは のuserコレクションを格納できlocation、JPA を使用して簡単に実装できます。しかし、これらのクラスに、別のユーザーまたは場所までの距離を計算するメソッド、パスの交差点を見つけるメソッド、user1 日に走った距離を計算するメソッドなど、いくつかの機能を設定したい場合。そのような機能を Bean 自体に実装する場合、それは「良い設計」でしょうか?それとも、多くの静的メソッドを備えた特別なデコレータとヘルパー クラスを使用して目標を達成する必要がありますか?

4

2 に答える 2

4

ドメイン駆動 (DD) アプローチを実装しようとしています。これは一部のアプリケーションには役立ちますが、SOA アーキテクチャーに反対する傾向があります。SOA の概念は広く普及しており、十分に証明されており、現在でも話題になっています。マイクロサービス(別名 SOA v2.0)も参照してください。

Java EE を使用している場合は、Gateway パターンを使用して SOA 用のDD またはBoundary-Control-Entityを実装できます。

今いくつかのポイント:

  • データ表現としてだけでなく、通常のオブジェクトとして Entity Bean を使用することは良い習慣ですか?. DD の場合は問題ありません。SOAの場合、そうではありません。

  • DD 設計は SOA よりも拡張性に優れていますか? アプリケーションによって異なります (ステートフル Bean のメモリ フットプリントは小さく、管理しやすい)。ストレステストだけが良い洞察を与えてくれます。

  • DD に基づいてプロトタイプを作成し、必要に応じて SOA に渡すことはできますか? ハードなリファクタリング フェーズがあるかもしれませんが、可能です。DD プロトタイプは構築が高速です。

  • 不変オブジェクトに関して言及する価値のあるセキュリティ上の問題はありますか? 不変オブジェクトは、並行性の問題を回避するためのものです (変更するものは何もなく、誰も傷つくことはありません)。ゲートウェイ パターンは、トランザクションと EJB に基づいています (継承されたセキュリティ モデルを使用)。したがって、一般的に、問題はありません。

  • JPA での get/set は必要ですか? いいえ、必須ではありません。

  • JPA で不変オブジェクトを作成できますか? はい、コンストラクターとプライベート属性 (正しく注釈が付けられています) だけで完了です。

  • SOA プロジェクトのエンティティーにいくつかの動作を混在させることはできますか? エンティティ マネージャをエンティティに追加する必要のない特定のメソッドをいくつか追加します。つまり、オブジェクトの巨大なグラフでは機能しない単純な操作です。プロジェクト全体の一貫性は非常に重要です。

  • テストはどうですか?どちらのソリューションも非常にテスト可能です。ただし、SOA とマイクロサービスを使用すると、アプリを小さな断片に分割する必要があり、モノリシック (泥の大きなボール) アプリケーションの作成を回避するのに役立つ場合があります。

風土病モデルの見栄えが悪いのは嫌いですが、少なくとも機能します。

于 2014-08-19T19:22:28.557 に答える
0

このすべてのロジック メソッドをエンティティに配置するのは良い考えではないと思います。ビジネス層から取得するのが最善の方法かもしれません。

エンティティに多くの一時的なフィールドを取得することは決して良いことではないため、おそらく最良の方法は VO (Valued Object) クラスを作成することです。

セッターもゲッターも必要ないため、VO を使用するとカプセル化の問題も解決されます。

于 2014-08-19T18:38:59.347 に答える