У меня постоянно одна и та же проблема. Столько, сколько многие разработчики не хотят признать это, это - серьезный недостаток дизайна в языке. Круговые зависимости являются нормальным состоянием реальных объектов. Тело не может выжить без сердца, и сердце не может выжить без тела.
Возможно разрешение во время вызова, но оно не будет оптимальным. Возьмите случай, когда у вас есть API, так как часть этого API - это методы сообщения об ошибках, но API создает объект, который имеет свои собственные методы, эти объекты будут нуждаться в сообщении об ошибках, и у вас будет круговая зависимость. Функции проверки ошибок и составления отчетов будут вызываться часто, поэтому устранение их во время вызова не является вариантом.
Решение в этом случае, и в большинстве случаев, заключается в перемещении кода, который не имеет зависимостей, в отдельные (утилитарные) пространства имен, где они могут свободно использоваться совместно. Я еще не сталкивался со случаем, когда проблема не может быть решена с помощью этой техники. Это делает почти невозможным ведение целостных, функциональных бизнес-объектов, но, похоже, это единственный вариант. Clojure еще предстоит пройти долгий путь, прежде чем он станет зрелым языком, способным точно моделировать реальный мир, и тогда разделение кода нелогичными способами - единственный способ устранить эти зависимости.
Если Aa () зависит от Ba (), а Bb () полагается на Ab (), единственное решение - переместить Ba () в Ca () и / или Ab () в Cb (), хотя C технически не ' не существует в реальном мире.