2

私は現在、clojureでの最初の主要なプロジェクトに取り組んでおり、コーディングスタイルと何かを行うための最も「clojure風の」方法に関する質問に遭遇しました。基本的に、私が書いている関数には、データ構造と、その関数がデータ構造をマッサージしようとするテンプレートを取り込んでいます。テンプレート構造は次のようになります。

{
:key1 (:string (:opt :param))
:key2 (:int (:opt :param))
:key3 (:obj (:tpl :template-structure))
:key4 (:list (:tpl :template-structure))
}

各キーは、指定されたデータ構造で検索されるアトムであり、その値は、テンプレート構造で指定されたタイプと一致するように試行されます。たとえば、文字列であることを検索し:key1て確認します。戻り値は:key1、指定されたデータ構造からの値を指すマップになります(関数は、指定されたオプションに応じて値を変更する可能性があります)。

その場合:obj、別のテンプレート構造を取り込んで、その値とテンプレート構造を再帰的に呼び出し、その結果を戻り値に配置します。ただし、エラーが発生した場合は、そのエラーを直接返したいと思います。

同様に、リストの場合、直接返されるエラーの場合を除いて、基本的に関数のマップを再度実行する必要があります。

私の質問は、これらのエラーを処理するための最良の方法は何ですか?いくつかの単純な例外処理が最も簡単な方法ですが、それは最も機能的な方法ではないと思います。たくさんのifステートメントを使って、チェーンのずっと上でエラーをベビーシッターすることができましたが、それもあまりスポーティーではないようです。私が見逃している単純なものはありますか、それともこれは単に醜い問題ですか?

4

1 に答える 1

4

あなたは回路図に興味があるかもしれません、それはかなり似たようなことをします。テスト実装でどのように使用されているかを確認できます。

基本的にerror、正しくフォーマットされたデータに対してnilを返す関数、またはエラーを説明する文字列を定義しました。代わりに例外を除いて実行すると、配管が簡単になりますが、のような詳細なエラーメッセージを取得するのが難しくなります"[person: [first_name: expected string, got integer]]"

于 2012-11-09T04:19:48.947 に答える