大きなJavaアプリケーションの場合、(Maven/Eclipseを使用して)開始するプロジェクト構造について少し議論します。
オプション1:
entities (i.e. the whole database using Hibernate classes-first)
services (i.e. sets of read/write operations on the entities)
app (perhaps split up more further down the line)
オプション2:
area1-entities
area1-services
area1-app
area2-entities
area2-services
area2-app
...
(where area1, area2 etc. are functional areas of the system)
オプション2を使用すると、Mavenプロジェクト/モジュールが大幅に増え、データベースを生成するクラスが複数のプロジェクトに分散されることになります。誰かが各アプローチの長所/短所をアドバイスできますか?
どちらもしないことをお勧めします。
パッケージ構造でテクニカルレイヤーを適用しようとすると、アプリケーションで多くのエンタングルメントが発生します。言うまでもなく、サービスインターフェイスの背後にあるすべてのものを隠すために一生懸命に取り組んでいることは言うまでもありません。(主にパッケージ化のため)最初に行うことは、すべてをpublic class
にすることです。これは、x.y.z.service
パッケージとx.y.z.repository
パッケージの間に技術的な分離があり、すべてがリポジトリーにアクセスできるようになると、困難になります。ブームがサービスレイヤー内にカプセル化されます。
代わりに、より機能的で玉ねぎベースのアプローチ( クリーンアーキテクチャ 、 六角形アーキテクチャ )に従う必要があります。これは、 単一の責任の原則 (パッケージに適用された場合)にも適切に準拠しており、パッケージングの原則にも適合しています。
Oliver GierkeがJavaでコンポーネントを一緒にパッケージ化することについて いい投稿 を書いています。 Simon Brownはこのテーマについてさらに 一般的な話 を書いています。
アプリケーションのコアを保持するために、次のようなコアパッケージ構造を目指します。
x.y.z.area1
x.y.z.area2
ここで、Webインターフェースがある場合、たとえば、web
サブパッケージを追加します。Webサービスには、それだけを保持するws
またはrest
パッケージを追加します。基本的にコアに接続します。
x.y.z.area1.web
x.y.z.area1.ws
x.y.z.area2.rest
これで、コア内から他のレイヤーにオブジェクトを再利用することを検討できますが、私見では、そのレイヤーに特定のドメインを使用することをお勧めします。同様に、オブジェクトからSQLへのマッピングと同様に、画面に表示したいもの、またはWebサービスでXMLとして使用したいもの、およびビジネスロジックの実装方法に(多くの場合)不一致があります。ビジネスドメインとWebドメインの複雑さに応じて、それらを解決するために接続する必要がある別々の問題ドメインと見なすことができます。基本的には2つの異なる 境界コンテキスト です。
CQRSリソースからの引用を使用するには
単一のモデルを使用してトランザクションを検索、レポート、および処理するための最適なソリューションを作成することはできません。
すべてを単一の(ドメイン)モデルに入れようとせず、責任を分けてください。おそらく、より多くの(より小さな)クラスが作成されますが、アプリケーションのレイヤー間はより明確に分離されます。
最終メモ
アーキテクチャの作成は、あるソリューションと別のソリューションのトレードオフを決定することを覚えておいてください。これはドメインの複雑さに大きく依存し、主にアプリケーションの機能要件によって推進されるべきです。ただし、非機能(パフォーマンス、セキュリティ)および環境の制約(使用する言語、プラットフォーム、経験)の影響を受けます。そして、コーディングのように、アーキテクチャは決して完成していません。新しい要件がアプリケーションの再設計につながる可能性があります(おそらくそうする必要がありますか?)。
免責事項
はい、すべてを1つのモデルにまとめようとしました。また、アプリケーションで技術的な分離を使用しようとしました。ただし、エンタングルドアプリケーションレイヤーの作成に関する2、3年の経験の後(最初は良い考えのように思われ、その後アプリケーションが成長し始めます...)別の方法があるはずだと思いました。