コマンドラインツールに渡されるedn-configファイルの検証プロセスを説明する非常にネストされたclojureコードを考えてみましょう。cli-tool用のconfig-fileの検証プロセス:ネストされた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"))
注:呼び出される関数は、以下のネストされた&少ない不可欠な方法がそうするためにこの呼び出しダミー
です。ここで改善の提案はありますか?
上記の関数は、実際には、チェーン内で呼び出される4つの検証関数で煮詰めることができます:(1)引数チェック、(2)ファイル読み込み、(3)パーズ-EDN、データ。彼らは "エラー"を扱う方法が異なります:1と4については、私はclojure.specを使用しているので、clojure.spec/invalidが失敗で返されます。他の人(2人と3人)は、何かが間違っているときに例外をスローします。 これは、ここで抽象化することを特に困難にする。
彼らは検証に対処し、(この場合は例外で)エラー報告の一貫性のある手段を使用することができますので、私はロジックの部分ごとに別々の機能を書いて検討する
これはきれいなもののように見えます。2つの質問:あなたのコードには、エラー文字列で何をすべきか(例えば、それらを印刷すること)は何も言及されていません。同様に:なぜ猫ですか? clojure.algo.monadsでもできますか?努力をいただきありがとうございます!私たちはかなりしばらくの間、生産にそれを使用しているので、 –
@AntonHarald私は、一例では猫を使用しました。私はエラー文字列に関してあなたの質問を得られませんでした。パイプライン中にエラーが発生した場合、通常はエラーオブジェクト(この実装ではエラーを記述する文字列)を含む 'left'値が返されます。この機能は 'algo.monads'を使って実装することができますが、' algo.monads'ライブラリには 'Either'モナドの実装がないので、あなた自身で実装する必要があります。 – OlegTheCat