web-dev-qa-db-ja.com

再利用可能なJava DB接続を使用するモジュールの設計

いくつかの手続き型Javaコードをオブジェクト指向の再利用可能なモジュールに変更する必要があります。これはXML生成に速度を使用するXMLジェネレータユーティリティです。ビジネスルールの強化もあり、そのすべてがデータベーステーブルで構成可能。ルールの巨大なif-elseステートメントを削除し、他のアプリケーションが拡張および実装できる抽象クラスとインターフェイスを備えたルールオブジェクトにしました。ただし、クラス全体を再設計するのは困難です--XMLGeneratorUtil 、JDBC接続、ロガー、プロパティをコンストラクターで受け取り、データベースからさまざまなデータ構造(静的データを含む)を構築するなど、コンストラクターで非常に多くのことを行います。

さて、コンストラクターからデータベースに接続するのは良くないことはわかっていますが、以下のようなものに変更すると、次のようになります。

XMlGeneratorUtil xmlUtil = new XMLGeneratorUtil();
xmlUtil.initialize(Conenriches conn, Properties prop , Logger logger) // Do DB Connections and all initializations here
xmlUtil.generateXML(data); // Data is a HashMap containing busines data that goes into the XML
  1. ユーティリティ呼び出しのユーザーがgenerateXMLを呼び出す前に初期化することをどのように確認できますか?内部で軽量オブジェクトを作成し、ユーザーが気付かないうちに初期化するラッパーを作成する必要がありますか?

  2. また、再利用可能なライブラリが接続をパラメータとして受け入れるのは良いことですか?私のユーティリティの呼び出し元のアプリケーションが独自の接続を管理することを選択する可能性があるため、APIに渡すだけです。

  3. SRP(単一責任の原則)に対して、XMLGeneratorUtilはビジネスデータ(最終的にはXMLデータになります)を操作し、XMLを生成します。データエンリッチメントを別のAPIとして公開する必要がありますか? (そして、ユーザーはXMLGeneratorUtilを呼び出します)

2
Plaiska

あなたのポイントへの答え:

ユーティリティ呼び出しのユーザーがgenerateXMLを呼び出す前に初期化することをどのように確認できますか?内部で軽量オブジェクトを作成し、ユーザーが気付かないうちに初期化するラッパーを作成する必要がありますか?

いいえ。基本的には、コンストラクターからデータベースを呼び出すのと同じです。代わりに、オブジェクトが間違った状態にある場合(たとえば、generateXMLが呼び出されていない場合)、initializeに例外をスローさせます。

また、再利用可能なライブラリが接続をパラメータとして受け入れるのは良いことですか?私のユーティリティの呼び出し元のアプリケーションが独自の接続を管理することを選択する可能性があるため、APIに渡すだけです。

おそらくそうではありません。少し低レベルのものを注入することを検討してください。確かに、Rules Objectの依存関係はデータベース全体ではなく、単にそのデータのサブセットです。そのサブセットをリポジトリとして表すことはできますか?つまり、Rulesオブジェクトでデータベースからルールをプルする必要がある場合は、dbConnectionを渡さずに、RulesRepositoryを渡してください。

「ビジネスデータを充実させる」とはどういう意味かわからないので、3番目の質問には答えられません。


しかし、大まかに言えば、この質問に対する答えは次のとおりです。

オブジェクトの依存関係を再考してください。データベース接続の挿入は非常に広範であり、Rulesオブジェクトがデータに対して実行できるはずのことをはるかに多く実行できるようにします。

データベースから必要なものだけを公開するクラスを挿入することを検討してください。リポジトリを使用すると、これを行うのに役立ち、データ永続性メディアから切り離されます。したがって、万が一データベースを破棄して別のストレージメディアに移動した場合は、リポジトリを更新するだけで、すべてのコンシューマを更新する必要はありません。

1
MetaFight

コンストラクター全体をクラスに構築し、そのクラスのみをコンストラクターに渡してみませんか?次に、それをインターフェイスとして抽象化することもできるため、XML生成はDBに依存せず、任意のデータを受け入れることができます。

0
Euphoric