Кажется, все здесь говорят, что циклические зависимости плохие. В некотором смысле это правильно, и я стараюсь избегать статических циклических зависимостей практически любой ценой. Вы можете сделать это с инверсией управления, как показано в этом блоге: http://blog.schauderhaft.de/2011/07/17/breaking-dependency-cylces/
Но то, что вы описываете, необязательно - статическая циклическая зависимость, а одна во время выполнения. Я не совсем уверен, но я думаю, что более или менее невозможно избежать циклических зависимостей во время выполнения. Но, конечно, это не должно приводить к бесконечным циклам. Чтобы исправить это я вижу два с половиной варианта
Первый взлом
Убедитесь, что каждое событие, вызванное другим событием, имеет ссылку на исходное событие (или важную информацию о нем, например, идентификатор). Когда вы обрабатываете событие, убедитесь, что оно не исходит от вас самих.
Pro: простота реализации; предотвращает рекурсию абсолютно
Другая половина взлома
Если вы работаете синхронно, вы можете установить флаг firingEvent
до и сбросить его после. Игнорировать поступающие события, пока установлено firingEvent
.
Pro: еще проще реализовать; абсолютно исключает рекурсию при работе в одном потоке
Семантическое богатое решение
Я убежден, что событие, в котором A срабатывает по какому-то внешнему триггеру, и событие, которое A запускает из-за того, что C запускает, - это на самом деле два разных события, или все три события на самом деле просто одно, которое может исходить из еще не идентифицированного источника. D. Или что-то в этом роде. Невозможно без информации сказать, что такое А, В и С и какие события они запускают. Если вы найдете правильные события, цикл исчезнет.
Pro: дизайн будет чище и будет содержать больше информации.