2012-10-17 18 views
5

私はサードパーティのライブラリ(clj-msgpack)を使用しており、ライブラリがハンドラを提供するタイプのプロトコルを拡張したいと考えています。他のユーザーに影響を与えずにライブラリ提供プロトコルを拡張する

それだけで十分ですが、これを行う方法はありますが、同じJVM内で実行されているこのライブラリの他のユーザーには影響しません。動的なvarバインディング(スタック上の特定のポイントの下でのみ有効)と同様のものが理想的です。

現在のところ、私は無条件オーバーライドを行っていますが、動的なvarを使用して変更された動作を有効にしています。しかし、これは私の快適さのために猿のパッチを当てるようにはるかに多く感じます。好奇心、(入院醜態)については

Iが所定の位置に入れているが、以下:

(in-ns 'clj-msgpack.core) 

(def ^:dynamic *keywordize-strings* 
    "Assume that any string starting with a colon should be unpacked to a keyword" 
    false) 

(extend-protocol Unwrapable 
    RawValue 
    (unwrap [o] 
    (let [v (.getString o)] 
     (if (and *keywordize-strings* (.startsWith v ":")) 
     (keyword (.substring v 1)) 
     v)))) 
+0

フォークは、あなたが必要とする機能を追加し、 ^) – noahlz

+0

@noahz私はコード付きのチケットを提出しました。アップストリームがこの機能を_desirable_と考えるかどうかは非常に疑わしいことですが、私がそれを受け入れるかどうかはわかりません。 –

+0

私はそのコメントを(あなたが言及した理由で)しましたが、一方で... APIは「拡張のために開かれ、修正のために閉じられる」必要があります。 – noahlz

答えて

1

いくつかの考えた後、私は(私はあなたから取得するそのうちの一つ)は、2つの基本的なapprochesを参照してくださいダイナミックバインディング(今のように):

ダイナミックバインディングは、ほとんどの賛成の元本を保持すると不平を言う人もいます。 "そこから呼び出されたときだけ、何がこのように振る舞うのですか?"私は個人的にはこれが悪いこと(tm)であるとは考えていませんが、何人かはそうしています。この場合、それはexaclyあなたの欲望と一致し、あなたがキーワード化された文字列をしたい場合は、これが動作する必要があるかどうかを決定する一点を持っている限り。それらを元に戻す2つ目のポイントと2つのウェルを横切るコードパスを追加すると...あなた自身があなたのものです。しかし、ちょっと、作業コードにはメリットがあります。

継承:

good'olのJavaスタイルやClojureのの追加ホックheirarchiesを使用して、あなたがwidgewhatzitとがための新しいハンドラを追加する拡張keywordized文字列-widgewhatzitであることを周囲に渡しているオブジェクトの種類を拡張することができあなたの特定のサブクラス。これは場合によってのみ機能し、残りのデザインでは異なるオブジェクトスタイルを強制します。いくつかのスマートな人々はまた、オブジェクトのタイプが別のコードパス経由で呼び出されたときに異なるため、それが依然として最も驚くべき原則に従うと主張します。


あなたは(もちろん私の最初の(潜在的に物議を)選択であると思われる)キーワードの代わりに文字列を使用するようにプログラム全体を変更することができない限り、個人的に私はあなたの既存のソリューションとなるだろう

+0

私は、サブクラスベースのプロトコル実装アプローチを行うことはできません。なぜなら、処理されるオブジェクトはライブラリ自体によって生成されるからです(実際にはライブラリ_it_useによって)。そうでなければ、私の好みであるはずです。それは他のユーザーとの関係で完全に手をつけているからです。 –

+0

...ところで、私が現在のアプローチを嫌う主な理由は、ライブラリコードを変更することです。はい、新しい動作は動的バインディングによって切り替えられるはずですが、アップストリームで元のコードパスを調整して、その機能をオーバーライドしたバージョンに採用しないと、指定されたClojure環境内のライブラリの_all_ユーザーがアップストリームを失います私自身のコードだけでなく、変更してください。私はRubyとPythonの世界でサルパッチすることで十分に燃えてきました。 –

+0

さて、誰かがあなたの例に従うように公開しました;-)あなたは別の図書館に通っていて、ちょっと変わっていますので、きれいになります.-/ –

関連する問題