2013-04-01 38 views

回答

17

除要求^:dynamic元數據外,binding還創建僅在當前線程中可見的綁定,而with-redefs所做的綁定在所有線程中都可見。所以,with-redefs是一個非常鈍的工具,並有可能影響在同一虛擬機上運行的其他代碼。我從來沒有見過在測試代碼之外使用with-redefs,也不應該(至少在我看來)。

我會總結兩成這樣的區別:

  • ^綁定:動態允許引入的動態行爲一點點以可控的方式。這是一種在API中定義擴展點的好方法,它可以讓調用者遠離調用鏈更改代碼的行爲,而無需在調用堆棧中完全傳遞參數(其中一些甚至可能不是他們的代碼)。
  • with-redefs是免費的。它在測試中很有用,例如用於在被測試函數有很多依賴關係時嘲笑整個子系統。

聲明一個var當成^:dynamic,使用耳罩命名動態VAR(如*my-dynamic-var*)的約定一起,有額外的好處,它是廣告的自記錄的方式來調用者,你的那部分代碼可以動態修改。

總結:更喜歡^:動態綁定當寫入API和生產代碼。在測試中使用和-rewfs,並作爲動態改變超出您的控制範圍而未聲明爲^:dynamic(然後謹慎使用)的變量的行爲的最後手段。

+0

很好的答案。我已經看到了耳罩的命名規則,我不明白它的含義。我是否應該在動態的函數上使用該命名約定,或者僅僅使用原始值? –

+0

我從未在公共API中看到'defn'函數的耳罩。對於一個動態綁定的函數,我會沿着這些線做一些事情:https://gist.github.com/alexhall/5286484 – Alex

+0

這很有道理。儘管當我瀏覽clj-http項目時,它並沒有這樣做。它把動態放在了defn上。 –

相關問題