web-dev-qa-db-ja.com

このプロジェクト設計における循環依存

2つのモジュール(複数のクラスを含む)があります。それらをModule AおよびModule Bと呼びましょう。モジュールBはモジュールAに依存しています:Module B -> Module A。ここで、AとBが使用することになっているユーティリティクラスCを作成しましたが、ユーティリティ自体はAとBにある機能に依存しているため、AとBもCに依存しています。 C <-> B -> A <-> C

残念ながら、AとBから依存関係を抽出して別の場所に配置することは許可されていないため、そのままにしておく必要があります(ユーティリティを使用するコードを除く)。ユーティリティをInterfaceにして、AとBに実装することも機能しません。これは、実装もそれぞれAとBに依存し、循環依存を引き起こすためです。

これは私のプロジェクトがどのように設計されているかという一般的な設計上の問題であり、解決できませんか?

編集:もう少し詳細を追加します。

依存関係は、モジュールAおよびB内にあるクラスへのメソッド呼び出しの形式です。抽出は可能ですが、初期設計が壊れ、それらをそのままにしておくのが理にかなっているため、奇妙に見えます。

1
sceiler

コードについて詳しく知らずに判断するのは難しいですが、コードを説明する方法では、Cが依存するAとBからパーツを抽出し、これらのパーツをCに移動することが唯一の解決策になります。 Cに依存し、Cはどちらにも依存しません。

それがオプションではない場合(なぜ?)、私が見ることができる唯一のオプションは、AまたはBに依存しないようにCを変更することです。私の経験では、これは通常可能ですが、より具体的には、コードに関する詳細が必要です。

0
sleske

保持したい機能を組み込んだラッパーのみを作成する方法でモジュールAとBを変更するのは好きではありませんが、実際にはモジュールDの機能を使用します。そうすれば、モジュールAとBをまったく同じ方法で使用し続けることができます。あなたはそうしましたが、共通の機能は実際にはモジュールDにあります。

このようにして、AとBから機能を取り出さないようにします。

ラッパーは次のようになります。

function a(){
  dosomething()
}

になります:

function d(){
  dosomething()
}

function a(){
  d()
}

ロジックがどこかにあるのと同じように、関数を使い続けることができます。

0
Pieter B