Разрешение круговых зависимостей Clojure

Я работаю над некоторым кодом Clojure, который имеет некоторые круговые зависимости между различными пространствами имен, и я пытаюсь разработать лучший способ разрешить их.

  • Важный вопрос - то, что я не получаю "Такой var: namespace/functionname" ошибка в одном из файлов
  • Я пытался "объявить" функцию, но затем она жалуется с: "Не может относиться к квалифицированному var, который не существует"
  • Я мог, конечно, осуществить рефакторинг всю кодовую базу, но это кажется невозможным сделать каждый раз, когда Вы имеете зависимость для разрешения..... и могли бы стать очень уродливыми для определенных сетей круговых зависимостей
  • Я мог выделить набор интерфейсов / протоколы / объявления в отдельный файл и иметь все, относятся к этому...., но это кажется, что он закончил бы тем, что стал грязным и испортил бы текущую хорошую модульную структуру, что я группировался со связанной функциональностью

Какие-либо мысли? Что лучший способ состоит в том, чтобы обработать этот вид круговой зависимости в Clojure?

15
задан gunr2171 21 July 2015 в 15:13
поделиться

2 ответа

Я помню ряд обсуждений пространств имен в Clojure - в списке рассылки и в других местах - и я должен вам сказать, что консенсус (и, AFAICT, текущая ориентация дизайна Clojure) заключается в том, что круговые зависимости - это призыв дизайна к рефакторингу. Временами могут быть возможны обходные пути, но они уродливы, возможно, проблематичны для производительности (если вы делаете вещи излишне «динамическими»), не гарантированно работают вечно и т. Д.

Теперь вы говорите, что круговая структура проекта хороша и модульна. Но почему вы это называете так, если все зависит от всего ...? Кроме того, «каждый раз, когда у вас есть зависимость, которую нужно разрешить» не должно происходить очень часто, если вы заранее планируете древовидную структуру зависимостей. И чтобы обратиться к вашей идее размещения некоторых базовых протоколов и тому подобного в их собственном пространстве имен, я должен сказать, что много раз мне хотелось, чтобы проекты делали именно это. Я считаю, что это чрезвычайно полезно для моей способности бегло просмотреть кодовую базу и быстро понять, с какими абстракциями она работает.

Подводя итог, я голосую за рефакторинг.

24
ответ дан 1 December 2019 в 00:26
поделиться

У меня была аналогичная проблема с некоторым графическим кодом, в итоге я сделал следующее:

(defn- frame [args]
  ((resolve 'project.gui/frame) args))

Это позволило мне разрешить вызов во время выполнения, он вызывается из пункта меню во фрейме, поэтому Я был на 100% уверен, что кадр был определен, потому что он был вызван из самого кадра, имейте в виду, что разрешение может вернуть nil.

14
ответ дан 1 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: