所以,我深入潛入Clojure.Spec。在哪裏投放Clojure.Spec?
我偶然發現的一件事是,在哪裏把我的規格。我看到三個選項:
全球SPEC文件
在大多數例子中,我發現網上,有一個很大的spec.clj
文件時,被在主命名空間要求。它具有所有「數據類型」和功能的所有(s/def)
和(s/fdef)
。
臨:
- 一個文件解決所有問題
魂鬥羅:
- 此文件可以是大
- 單Responsibliy原理侵犯?
規格生產的命名空間
你可以把你的(s/def)
和(s/fdef)
旁邊你的產品代碼。因此,實現和規範共存於相同的名稱空間中。
臨:
- 實施和規範的協同定位
- 一個命名空間 - 一個關注?
魂鬥羅:
- 生產代碼可能會導致混亂
- 一個命名空間 - 兩個問題?
專用規格的命名空間結構
後來我想,也許規格是第三種代碼(旁邊的生產和測試)。所以也許他們應該得到自己的命名空間的結構,像這樣:
├─ src
│ └─ package
│ ├─ a.clj
│ └─ b.clj
├─ test
│ └─ package
│ ├─ a_test.clj
│ └─ b_test.clj
└─ spec
└─ package
├─ a_spec.clj
└─ b_spec.clj
臨:
- 專用(但相關)的命名空間規格
魂鬥羅:
- 您必須提供並要求正確的名稱空間
誰對這些方法有經驗?
還有其他的選擇嗎?
你對不同的選擇有什麼看法?
什麼是你的[使用解構規範時,他們是在一個單獨的命名空間]建議(http://stackoverflow.com/q/38024650/5044950)? –
@levand Sam Estep在他的問題中提出了一個很好的觀點,即你不能依賴一個被加載的規範來使用它進行解析,因爲如果規範已經需要你的ns,你就不需要該規範。所以可能是一個'(加載「my/app/foo_specs」)/(in-ns'my.app.foo)(require'[clojure.spec:as s])'沒有單獨的ns將是一個可取的模式,如果你想在可讀性 –
一個單獨的文件,該文件是一個很好的點...規格有您希望您實現命名空間取決於您的規範命名空間,這意味着你的天賦NS *不能*取決於IMPL NS的情況。 目前,爲解決這個沒有什麼好辦法 - 最好是剛打出來的規格完全合格的命名空間的名稱。 幸運的是,在將允許您還沒有被加載/還需要別名命名空間,這應該整齊地解決這一問題的作品一些變化。 – levand