Clojure中的循环负载依赖性

9

我的项目结构如下:

|- 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的新手)。

为什么core需要其他命名空间? - Lee
core 从 Clojure "模板" 生成 XML,并具有 -main 函数,该函数接收模板名称作为参数,例如 "name-dialog" 并从中生成 XML。 - lich
(defn state [s & xs] (hash-map :tag :state :attrs {:name s} :content (if xs (vec xs) nil)))(defn 状态 [s&xs] (哈希-映射 :标签:状态 :属性{:名称S} :内容(如果XS(VEC XS)NIL))) - lich
1
听起来 core 中依赖于其他命名空间的函数应该被移动到那些命名空间中。core 命名空间不应该依赖于其他模块。 - Lee
谢谢,我将尝试将它们移动,这很合理。但在“core”中,我有一个接收对话框名称(例如dialog_name)并生成xml的函数,因此无论如何都应该加载为模块吗? (defn -main [dialog] (emit (eval (symbol dialog)))) - lich
1个回答

8
经典的回答并非特定于Clojure,可能是要审查模块及其职责。
(下方的->代表“依赖于”)
假设有:
core -> dialogs -> core

提取 dialogs 所需的 core 模块部分到一个单独的共享模块中:
shared (depends on "nothing")
core -> dialogs -> shared
core -> shared (possibly)

对我个人而言,循环依赖是设计存在问题的指标。即使通过加载顺序或编译等技术手段解决了技术问题,循环依赖通常也是紧密耦合的标志,并且仍值得修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接