2012-04-23 11 views
6

私のソフトウェアの特定の部分をどのようにアーキテクチャするかという問題に直面しています。 私は、現在のOSによっては ダークマジックを行うmake-temp-dir(と多くの他のもの)という関数があります。私は別々の名前空間に各OSのためのこれらのメソッドの の実装を置くことができるようにしたいです。環境に依存するプロトコル/マルチメソッドのクローズアップ

まず、プロトコル(可能な場合)またはマルチメソッドが の解決策であると私は信じています。しかし、複数の名前空間にまたがって実装する でこれらを使用する例は見たことがありません。そして、私はこれがどのように動作するのか理解できません 。私はこのためのプロトコルを使用する場合

第二には、私はすべての時間があまりにも良い を見ていない最初の引数としてのOSを渡し、どういうわけか

(make-temp-dir current-os arg-1 arg-2) 

のようなもの メソッドを呼び出す必要があります私に。意味のために、make-temp-dirは、OSに応じてインテリジェントな の決定を取ることをお勧めします。確かに私はいくつかのマクロを使用して何かをすることができます

(doto current-os 
    (make-temp-dir arg-1 arg2)) 

しかし、それは間違って感じる。

これはどのように行う必要がありますか?または私は間違った方法を行っていますか?どんな助けもありがたい。

を編集してください。ありがとうございます。@kotarakに感謝して、私は何か作業をすることができました。これにつまずいた人のために、https://gist.github.com/2477120。そのうまく動作して、私はそれと一緒に行くだろうと思う。みんな、ありがとう。あなたはユーティリティ機能のいずれかを使用する前に、alter-var-rootcurrent-osを初期化する必要があり、あなたの起動コードで

答えて

7
(ns your.utils) 

(def current-os) 

(defmulti make-temp-dir 
    (fn [& _] current-os)) 

(ns your.utils.mac) 

(defmethod make-temp-dir :mac-os-x 
    [a b] 
    (...)) 

(ns your.utils.win) 

(defmethod make-temp-dir :windows 
    [a b] 
    (...)) 

(let [os (find-os)] 
    (alter-var-root #'current-os (constantly os)) 
    (require (case os 
      :mac-os-x 'your.utils.mac 
      :windows 'your.utils.win))) 

ご希望の方にお任せください。

+0

したがって、2番目のコードは 'your.utils'名前空間の下に置く必要がありますか?また、 '# ''読者マクロは何ですか?申し訳ありませんが、どちらにするかはわかりません;) –

+0

'#''は* var quote *と呼ばれます。 var quotesの説明は、https://groups.google.com/forum/?fromgroups#!topic/clojure/jDBAJD4nWqsでご覧いただけます。 – user100464

+0

@kotarak、大丈夫、素晴らしい解決策。それを消化するのに私にこれほど長い時間がかかりましたが、何が起こっているのか理解していると思います。私はまだ最初のコメントにいくつかの入力が欲しいと思います。 –

1

私は確かに言うことはできませんが、あなたはJavaが提供するホイールを再発明するかもしれないように思えます。 clojure.java.io(http://clojuredocs.org/clojure_core/clojure.java.io)の基本的なツールを超えてJavaが提供するもののいくつかの便利なラッパーについては、https://github.com/Raynes/fsを試してみてください。

質問がOS固有の分岐を越えて環境固有の構成値に及ぶ場合は、https://github.com/drakerlabs/milieuも役立ちます。私はこのコードをDrakerの独自のプロジェクトの一部として書いています。私たちは最近、フリーソフトウェアとしてリリースしました。我々はまだ公式にコミュニティに発表していないが、それはClojarsにあり、使用の準備が整っている。フィードバックは高く評価されています!その作成を推進したコンセプトは、開発/テスト/ステージング/プロダクションなどの意味での環境でしたが、別のOS環境でも変数を設定することができない理由はありません。

+1

リンクありがとうございました。私はfsパッケージが私のために便利だろうと思う:) –

関連する問題