6

ソフトウェアの特定の部分をどのように構築するかという問題に直面しています。make-temp-dir現在のOSに応じて、いくつかの暗い魔法を行う関数(および他の多くの関数)があるとしましょう。OS ごとにこれらのメソッドの実装を個別の名前空間に配置できるようにしたいと考えています。

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

第二に、これにプロトコルを使用する場合、次のようなメソッドを呼び出す必要があります

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

どういうわけか、最初の引数として常に os を渡すのは、私にはあまり良くないように見えます。make-temp-dirセマンティックのために、OSに応じて賢明な決定を下したいと思います。確かに、いくつかのマクロを使用して、次のようなことができます

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

しかし、それは間違っていると感じます。

これはどのように行うべきですか?それとも私は間違った方向に進んでいますか?どんな助けでも感謝します。

編集:さて、@kotarakに感謝します。何とか機能させることができました。これにつまずいた人は、https://gist.github.com/2477120。うまくいっているので、それでいいと思います。みんな、ありがとう。

4

2 に答える 2

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]
  (...))

スタートアップ コードでは、ユーティリティ関数を使用する前current-osに初期化する必要があります。alter-var-root

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

これで始められることを願っています。

于 2012-04-23T15:53:29.060 に答える
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 環境の変数を構成するために使用できない理由はわかりません。

于 2012-04-23T21:41:50.050 に答える