依存性注入フレームワーク (春のアノテーション) への最新の追加により、DI 管理コンポーネントを作成するための限界コストは、いくつかの重要な新しいしきい値に達したようです。以前は、Spring に関連するオーバーヘッド (大量の XML と追加の間接参照) がありましたが、依存性注入は、多くのパターンが進むところに行き始めたようです。彼らはボンネットの下に入り、「消えます」。
この結果、多数のコンポーネントに関連する概念的なオーバーヘッドが許容できるようになります。ほとんどのクラスが単一の public メソッドのみを公開するシステムを作成し、これらの断片を狂ったように集約するだけでシステム全体を構築できることは議論の余地があります。私たちの場合、いくつかのことが与えられています。アプリケーションのユーザー インターフェイスには、最上位のサービスを形成するいくつかの機能要件があります。そして、バックエンドシステムが下部を制御します。しかし、これら2つの間では、すべてが手に入る.
私たちの絶え間ない議論は、実際にはなぜ物事をクラスにグループ化するのか、そして原則はどうあるべきかということです。いくつかのことは確かです。ファサードのパターンは死んで埋もれています。複数の無関係な機能を含むサービスも、分割される傾向があります。「無関係な機能」は、私がこれまで行ってきたよりもはるかに厳密な意味で解釈されます。
私たちのチームでは、ここで 2 つの一般的な考え方があります。実装の依存関係によってグループ化が制限されます。単一のクラスの機能は、注入されたすべての依存関係のクライアントであることが望ましいです。私たちはDDDプロジェクトであり、他の部分はドメインがグループ化を制限していると考えています(CustomerServiceまたはより細かいCustomerProductService、CustomerOrderService)-注入された依存関係の正規化された使用は重要ではありません.
では、疎結合の DI ユニバースでは、なぜロジックをクラスにグループ化するのでしょうか?
編集: duffymo は、これがプログラミングの関数型スタイルに移行している可能性があると指摘しています。これは状態の問題を引き起こします。関連するアプリケーションの状態の (小さな) 部分を表す "状態" オブジェクトがかなりあります。この状態を正当に必要とするサービスにこれらを挿入します。(通常のドメイン オブジェクトの代わりに「状態」オブジェクトを使用する理由は、Spring が不特定の時間にこれらを構築するためです。これは、Spring がドメイン オブジェクトの実際の作成を管理できるようにするためのわずかな回避策または代替ソリューションであると考えています。より良い解決策があるかもしれません。ここ)。
したがって、たとえば、OrderSystemAccessControlState を必要とするサービスはすべてこれを注入することができ、このデータの範囲はコンシューマーにはすぐにはわかりません。セキュリティ関連の状態の一部は、通常、さまざまなレベルで使用されますが、その間のレベルではまったく見えません。これは機能原則に根本的に違反していると本当に思います。オブジェクト指向の観点からこの概念に適応するのにも苦労しましたが、注入された状態が正確で強く型付けされている限り、その必要性は正当であり、ユースケースは適切です。