Я работаю над некоторым кодом Clojure, который имеет некоторые круговые зависимости между различными пространствами имен, и я пытаюсь разработать лучший способ разрешить их.
Какие-либо мысли? Что лучший способ состоит в том, чтобы обработать этот вид круговой зависимости в Clojure?
Я помню ряд обсуждений пространств имен в Clojure - в списке рассылки и в других местах - и я должен вам сказать, что консенсус (и, AFAICT, текущая ориентация дизайна Clojure) заключается в том, что круговые зависимости - это призыв дизайна к рефакторингу. Временами могут быть возможны обходные пути, но они уродливы, возможно, проблематичны для производительности (если вы делаете вещи излишне «динамическими»), не гарантированно работают вечно и т. Д.
Теперь вы говорите, что круговая структура проекта хороша и модульна. Но почему вы это называете так, если все зависит от всего ...? Кроме того, «каждый раз, когда у вас есть зависимость, которую нужно разрешить» не должно происходить очень часто, если вы заранее планируете древовидную структуру зависимостей. И чтобы обратиться к вашей идее размещения некоторых базовых протоколов и тому подобного в их собственном пространстве имен, я должен сказать, что много раз мне хотелось, чтобы проекты делали именно это. Я считаю, что это чрезвычайно полезно для моей способности бегло просмотреть кодовую базу и быстро понять, с какими абстракциями она работает.
Подводя итог, я голосую за рефакторинг.
У меня была аналогичная проблема с некоторым графическим кодом, в итоге я сделал следующее:
(defn- frame [args]
((resolve 'project.gui/frame) args))
Это позволило мне разрешить вызов во время выполнения, он вызывается из пункта меню во фрейме, поэтому Я был на 100% уверен, что кадр был определен, потому что он был вызван из самого кадра, имейте в виду, что разрешение может вернуть nil.