Clojure中的循环加载依赖性

时间:2015-10-07 11:45:00

标签: clojure cyclic-dependency

我的项目结构简单如下:

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

name_dialog具有core的依赖关系,而core应该需要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的新手)。

1 个答案:

答案 0 :(得分:5)

经典答案,不是与Clojure有关,可能是审查模块及其职责。

(下面的->代表“依赖于”)

假设:

core -> dialogs -> core

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

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

就我而言,循环依赖关系是设计错误的指标。即使技术问题得到解决(使用加载时序或编译等),循环依赖通常也是紧耦合的标志,仍然值得修复。