相互依赖的.el文件的设计模式

时间:2016-02-27 04:28:15

标签: emacs elisp

随着包大小的增加,代码的可读性降低。最佳做法是根据功能将包分成不同的文件。有时,文件需要彼此的变量和函数。

示例:

foo.el

(defvar foo-data-path "~/foo/data/")
(foo-log-write 'somedata)

FOO-log.el

(defvar foo-logfile (concat foo-data-path "foo.log"))
(defun foo-log-write (data)
  ;; Write to log file
  )

foo.el使用foo-log-write中的函数时,我将(require 'foo-log)放入foo.el

foo-log.el中,它使用foo-data-path中的foo.el,我是否还要将(require 'foo)放入其中? 如果我不添加reference to free variable,语法检查程序会始终抱怨(require 'foo)

1 个答案:

答案 0 :(得分:0)

我已经看到有两种技术可以处理您描述的情况。应该注意的是,你可以进入循环依赖问题是你不小心。虽然您可以在文件中多次要求,但如果它们是相互依赖的,并且如果您的提供行在最后,则可以轻松地结束循环。

我成功使用的两个解决方案是

  1. (首选)。将相互依赖的代码分解为第3个文件,并使另外两个代码需要该文件。

  2. 当所有其他方法都失败并且您无法解决问题并且无法避免相互依赖时,请确保至少有一个文件在开头具有提供语句。这通常不是一个好主意,因为如果您的文件在加载完成之前出错,您似乎已经满足了要求,但并不是您希望加载的所有内容都是。

  3. 第二种技术有助于打破无限循环,因为您已满足其中一项提供要求。在文件末尾提供(通常应该是)的问题是,在文件完全加载之前,您不满足require请求。但是,如果文件对另一个文件有要求,它将首先加载该文件,然后再继续加载第一个文件。如果第二个文件也有一个require并且要求是第一个文件,emacs将再次开始加载第一个文件,直到它达到第二个文件的需求并且在我们循环的周围。

    通过将提供放在文件的开头,下次遇到该文件的require时,它将不会尝试加载它,因为它会认为它已经被加载。循环被打破了。