ここの誰もが循環依存が悪いと言っているようです。これはある意味で正しいので、ほとんどすべてのコストで静的な循環依存を避けようとしています。このブログでスケッチされているように、制御の反転を使用してこれを行うことができます:http: //blog.schauderhaft.de/2011/07/17/breaking-dependency-cylces/
しかし、あなたが説明することは、静的な循環依存ではなく、実行時に必要です。完全にはわかりませんが、実行時に循環依存を回避することは多かれ少なかれ不可能だと思います。しかしもちろん、これによって無限ループが発生することはありません。それらを修正するには、2つ半のオプションが表示されます
最初にハック
別のイベントによってトリガーされた各イベントに、元のイベント(またはIDなどの重要な情報)への参照があることを確認してください。イベントを処理するときは常に、それが自分自身から発生したものではないことを確認してください。
プロ:実装が簡単。再帰を完全に防ぎます
ハックの残りの半分
同期を実行している場合は、firingEvent
前にフラグを設定し、後でリセットすることができます。が設定されている間に発生するイベントを無視しますfiringEvent
。
プロ:実装がさらに簡単です。シングルスレッドで実行しているときに再帰を完全に防止します
セマンティックリッチソリューション
Aが外部トリガーで発生するイベントと、Cが発生するためにAが発生するイベントは、実際には2つの異なるイベントであるか、3つのイベントすべてが、まだ特定されていないソースDから発生する可能性があるイベントであると確信しています。そんな感じ。A、B、Cが何であるか、そしてそれらがどのようなイベントを発生させているかを情報なしで知る方法はありません。適切なイベントを見つけると、サイクルは消えます。
長所:デザインはよりクリーンになり、より多くの情報が含まれます。