Clojure 中的循环加载依赖

Cyclic load dependency in Clojure

我的项目结构简单如下:

|- core.clj
|- dialogs.clj
|- dialogs/
   |- name_dialog.clj

name_dialog 依赖于 corecore 应该需要 name_dialog

所以我有这样的依赖关系:

core.clj

(ns ddsl.core
  (:gen-class)
  (:require [clojure.xml :refer :all]
            [ddsl.dialogs :refer :all]))

dialogs.clj

(ns ddsl.dialogs
    (:require [ddsl.core :refer :all]))

(load "dialogs/name_dialog")

name_dialog.clj

(in-ns 'ddsl.dialogs)

当我尝试 运行 程序时出现以下错误 Cyclic load dependency: [ /ddsl/core ]->/ddsl/dialogs->[ /ddsl/core ]

请告诉我如何重组我的项目(我是 Clojure 的新手)。

与 Clojure 无关的经典答案可能是回顾模块及其职责。

(下面的->代表"depends on")

鉴于:

core -> dialogs -> core

dialogs 所需的 core 模块部分提取到单独的共享模块中:

shared (depends on "nothing")
core -> dialogs -> shared
core -> shared (possibly)

对我来说,循环依赖是设计有问题的标志。即使解决了技术问题(加载时序或编译等),循环依赖通常是紧耦合的标志,仍然值得修复。