ソフトウェア エンジニアリングにおいて、循環依存関係とは、適切に機能するために直接的または間接的に相互に依存する 2 つ以上のモジュール間の関係です。このようなモジュールは相互再帰とも呼ばれます。
概要
同じドメインの特定のオブジェクトが互いに依存する多くのドメインモデルでは、循環依存関係は自然です。 [1]しかし、ソフトウェア設計では、大規模なソフトウェアモジュール間の循環依存関係は、その悪影響のためアンチパターンと見なされます。 [1]それにもかかわらず、このような循環(または循環)依存関係は、実際のソフトウェアのソースファイルで広く見られることがわかっています。[2]ただし、相互再帰モジュールは、帰納的および再帰的な定義が推奨されることが多い関数型プログラミングではやや一般的です。
問題
循環依存関係は、ソフトウェア プログラムに多くの望ましくない影響を引き起こす可能性があります。ソフトウェア設計の観点から最も問題となるのは、相互に依存するモジュールの密結合であり、これにより、単一のモジュールを個別に再利用することが減少するか不可能になります。
循環依存関係は、あるモジュールの小さなローカル変更が他のモジュールに広がり、望ましくないグローバル影響 (プログラム エラー、コンパイル エラー) をもたらす場合にドミノ効果を引き起こす可能性があります。循環依存関係は、無限再帰やその他の予期しない障害を引き起こす可能性もあります。
循環依存関係により、特定の自動ガベージ コレクター(参照カウントを使用するもの) が未使用のオブジェクトを解放でき なくなるため、メモリ リークが発生する可能性もあります。
原因と解決策
非常に大規模なソフトウェア設計では、ソフトウェアエンジニアがコンテキストを失い、意図せず循環依存関係を導入してしまう可能性があります。ソフトウェアを分析して不要な循環依存関係を見つけるツールがあります。[3]
コールバック機能を実装すると、循環依存関係が発生する可能性があります。これは、オブザーバー パターンなどの設計パターンを適用することで回避できます。
参照
参考文献
- ^ ab Lakos, John (1996-07-20).大規模 C++ ソフトウェア設計(第 1 版). ボストン: Addison-Wesley. ISBN 9780201633627。
- ^ Melton, Hayden; Tempero, Ewan (2007-01-12). 「Java のクラス間の循環に関する実証的研究」. Empirical Software Engineering . 12 (4): 389–415. CiteSeerX 10.1.1.141.5362 . doi :10.1007/s10664-006-9033-1. ISSN 1382-3256. S2CID 11134940.
- ^ Java用の JDepend
