考慮這個相當嵌套的clojure代碼,它描述了傳遞給命令行工具的edn-config文件的驗證過程。cli-tool的配置文件的驗證過程:避免嵌套的if
(defn -main [& [config-path]]
(if config-path
(if-let [content (read-file config-path)]
(if-let [raw-data (read-edn content)]
(if-let [parsed (parse raw-data)]
(start-processing parsed)
(error "parsing-error"))
(error "invalid-edn-format"))
(error "file-not-found"))
(error "no argument"))
注:調用的函數是虛設
這需要較少的嵌套&少勢在必行的方式來做到這一點。你有什麼改進建議嗎? (1)Argument-Check,(2)File-Read,(3)Parse-EDN,(4)Parse-EDN,(4)Parse-EDN,(4)Parse-EDN,數據。他們在處理「錯誤」的方式上有所不同:對於1和4,我使用clojure.spec,因此:clojure.spec/invalid在失敗時返回。其他人(2和3)會在出現問題時拋出異常。 這使得在這裏抽象特別困難。
這看起來像一個乾淨的東西。兩個問題:你的代碼在任何時候都沒有聲明,應該怎樣處理錯誤字符串(例如打印它們)。以及:爲什麼貓?它可以用clojure.algo.monads完成嗎?感謝您的努力! –
@AntonHarald我在示例中使用過貓,因爲我們在生產中已經使用了很長一段時間。我沒有完全明白錯誤字符串的問題:如果在管道中發生錯誤,將返回「left」值,通常包含錯誤對象(在此實現中它是描述錯誤的字符串)。這個功能可以使用'algo.monads'來實現,但'algo.monads'庫沒有'Either' monad的實現,所以你需要自己實現它。 – OlegTheCat