2016-02-27 70 views
0

隨着封裝大小的增長,代碼的可讀性下降。最好的做法是根據其功能將軟件包分成不同的文件。有時,這些文件需要彼此的變量和功能。相互依賴.el文件的設計模式

實施例:

foo.el

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

FOO-log.el從foo-log-write

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

作爲foo.el使用功能,我在foo.el(require 'foo-log)

foo-log.el,它使用foo-data-pathfoo.el,我也應該把(require 'foo)在裏面嗎? 如果我不添加(require 'foo),則語法檢查程序始終會投訴reference to free variable

+0

不需要分解一個或兩個需要什麼,並且不需要其他任何東西,並且需要將其作爲第三個庫。或者重構這2個,這樣只有其中一個定義了兩者需要什麼,另一個需要提供那些需要的定義。你不能讓每一個都需要另一個。如果你嘗試,然後加載一將嘗試加載另一個將嘗試加載第一個將嘗試加載第二個... – Drew

+0

我認爲'需要'應該是安全的多次調用。正如在[GNU Emacs Lisp](https://www.gnu。org/software/emacs/manual/html_node/elisp/Named-Features.html),此功能使用'(featurep feature)'檢查當前Emacs會話中是否存在功能。參數特徵必須是符號。 如果該功能不存在,則需要加載具有加載的文件名。 – tom

回答

0

有兩種技術可以處理你描述的情況。應該指出,你可以進入循環依賴問題是你不小心。雖然你可以多次要求在一個文件中,但如果它們相互依賴,並且如果你的'提供線路在最後,你可以很容易地結束循環。

我已經成功地使用這兩種解決方案是

  1. (首選)。將相互依賴的代碼分解成第三個文件,並讓其他兩個需要該文件。

  2. 當所有其他的都失敗了,你不能避免相互依賴,並確保至少有一個文件在開頭有提供語句。這通常不是一個好主意,因爲如果你的文件在加載完成之前出錯,你會看起來滿足要求,但不是你期望加載的所有東西都會。

第二種技術有助於打破無限循環,因爲您已滿足提供的要求之一。在文件末尾提供(通常應該是的地方)的問題是,在文件完全加載之前,您不滿足require請求。但是,如果文件對另一個文件有要求,則它將首先加載該文件,然後繼續加載第一個文件。如果第二個文件也有一個要求,並且要求第一個文件,emacs將再次開始加載第一個文件,直到它達到第二個文件的要求並且圍繞我們去的循環。

通過將提供放在文件的開始處,下一次遇到該文件的require時,它不會嘗試加載它,因爲它會認爲它已被加載。循環被打破。