問題タブ [multimethod]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
clojure - Clojure の他のデータ型の算術関数をどのように慣用的に拡張しますか?
だから私java.awt.Colorは何かに使いたいです、そして私はこのようなコードを書くことができるようにしたいです:
のコア実装を見ると、-具体的には について語らclojure.lang.Numbersれています。これは、コア実装に「フック」して拡張するために私がすることは何もないことを意味します。
インターネットで調べてみると、人々が行っていることは 2 つあります。
関心のあるデータ型についてのみ知っている独自の
defn -関数を作成します。これを使用するには、おそらく名前空間のプレフィックスを付けることになるため、次のようになります。(= Color/BLUE (scdf.color/- Color/WHITE Color/RED Color/GREEN))または、代わり
useに名前空間を使用clojure.core/-して、数値計算が必要な場合に使用します。実装に が渡されるときに に渡される特別なケースを
-実装にコーディングします。clojure.core/-Number
残念ながら、私はどちらも好きではありません。1 つ目はおそらく最もクリーンです。2 つ目は、計算対象は新しいデータ型と数値だけであると想定しているためです。
私はClojureを初めて使用しますが、ここでプロトコルまたはマルチメソッドを使用できるようにすべきではないので、人々がカスタムタイプを作成/使用するときに、これらの関数を「拡張」してシームレスに機能させることができますか? +などがこれを-サポートしていない理由はありますか? (または、そうですか?コードを読んだだけではないようですが、間違って読んでいる可能性があります)。
他のデータ型など、一般的な既存の関数に独自の拡張機能を書きたい場合+、既存の関数や潜在的に他のデータ型とうまく連携するにはどうすればよいですか?
design-patterns - Clojure では、ポリモーフィックである必要があるこのコードをより適切に設計するにはどうすればよいでしょうか?
オンライン フォーラムの Web クローラーのようなプログラムを書いています。クロールするフォーラムごとに、同じことを行う必要があります。
- ログインする
- ボードを見つける
- 投稿を見つける
- 投稿へのパーマリンクを見つける
- 投稿者のユーザー名を見つける
- 等
これと同じロジックが各フォーラムで発生する必要がありますが、各フォーラムの実装は異なります。たとえば、各ログイン フォームの入力はフォーラムごとに異なります。1 つのフォーラムには「username」という名前のフィールドがあり、もう 1 つのフォーラムには「user」という名前のフィールドがある場合があります。これらのステップの一部には、デフォルトの実装がある場合があります。たとえば、 のデフォルトの実装でloginは何もしません (クロールするために一部のフォーラムにログインする必要がないため)。
私が行ったことは、これらすべてのステップに名前を付けた関数を作成しましたcrawl-forumが、実装は抽象的であり、別の場所に実装されています。私の質問は、これらの実装を使用するための最良の方法は何ですか?crawl-forum
私が試したこと
1) コンフィグマップ
これが私がこれまでに試したことです。crawl-forumという関数に新しい引数を追加しましたconfigs。これは、次のようなマップ データ構造です。
呼び出すコードcrawl-forumは、そのマップの作成を担当します。これについて私が気に入らないのは、コードconfigs全体に渡す必要があることです。crawl-forumどこにでも新しいパラメーターを追加します。また、デフォルトの実装を処理するための不完全でアドホックなコードもあります。
2) マルチメソッド
私はこれについて irc で話しましたが、実際にはポリモーフィックな動作であるため、代わりにマルチメソッドを使用する必要があるという考えを誰かが教えてくれました。それらは次のようになります。
次に、クライアント コードは外部で独自のマルチメソッドを定義する必要があります。
これについて私が気に入らないのは、 と同じように、を関数configに渡す必要があり、それを内部のあらゆる場所に渡さなければならないことです。また、everyはパラメーターとして独自に戻す必要がありますが、いずれもそれを使用することはありません。これは単にディスパッチを行うために必要な引数です。ただし、完全なマルチメソッドのチュートリアルを見つけるのは非常に難しいので、これを行うよりスマートな方法があれば教えてください.site-keycrawl-forumsite-keydefmethodsite-key
さらに優れた3番目のオプションはありますか?マルチメソッドを使用するより良い方法はありますか? 教えてください、ありがとう。
oop - マルチメソッド vs インターフェース
慣用的に両方の概念を同時に使用する言語はありますか? それが必要になるのはいつですか?各アプローチの長所と短所は何ですか?
質問の背景:
私は(Pythonの知識がある)初心者で、マルチメソッドとインターフェースが(一般的に)どのように使用されることを意図しているかをよりよく理解しようとしています。
私はそれらが混在することを意図していないと仮定します.1つはインターフェースに関して利用可能なロジックを宣言する(そしてそれをクラスのメソッドとして実装する)か、1つはマルチメソッドに関してそれを行います. これは正しいです?
次のような OOP 概念のスペクトルについて話すことは理にかなっていますか?
- 1つは単純なサブクラス化から始まります(データとロジック(メソッド)およびロジック実装(メソッド)は密結合されています)
- 次にインターフェースを通過します(ロジックはインターフェースにあり、データとロジックの実装はクラスにあります)
- マルチメソッドで終了します(ロジックはマルチメソッドのシグネチャにあり、ロジックの実装は散らばっており、データはクラスにあります(これは適切なハンドルを持つデータ構造のみです))?
python - isinstance を使用した Python マルチメソッド
この記事でGuido van Rossum は、この種の Python でのマルチメソッドの実装について次のように述べています。
「退屈」で「あまりOOではない」。彼は次に、デコレータを使用してマルチメソッドを実装する方法について説明します。これは、Python のかなり深い知識がなければアクセスできないと思います。
私の質問: マルチメソッドを記述する必要があります。上記のコードで実際に「オブジェクト指向ではない」とは何ですか?
更新: Thomas Orozco の回答に照らして、マルチメソッドを実際に記述する必要がないことに気付きました。
java - メソッドからメソッドへと変数が順番どおりに表示されないのはなぜですか?
バブル ソート法を使用して、入力数値を順番に (最小から最大へ) 並べ替えます。次に、次の方法(番号を順番に並べる必要がある場合)では、前の方法で番号を並べ替えたことを無視しているようです。メソッドを正しく呼び出していませんか?ありがとう!
}
c# - .Net 4.0 既存の「if」条件と「is」演算子をリファクタリングするために最適化されたコード
次のC#コードがあります。正常に動作します。しかし、メソッドはis 演算子を使用することで複数の条件GetDestination()で雑然としています。if
.Net 4.0 (またはそれ以降) では、これらの「if」条件を回避する最善の方法は何ですか?
編集: ロールはビジネス モデルの一部であり、宛先は純粋にそのビジネス モデルを使用する特定のアプリケーションの成果物です。
コード
参考文献
haskell - Clojure のプロトコルとマルチメソッドが Haskell の型クラスよりもポリモーフィズムに弱い理由は何ですか?
より広義には、この質問は表現の問題に対するさまざまなアプローチに関するものです。アイデアは、プログラムがデータ型とそれに対する操作の組み合わせであるということです。古いクラスを再コンパイルせずに新しいケースを追加できるようにしたいと考えています。
現在、HaskellはTypeClass に関する式の問題に対する本当に素晴らしい解決策をいくつか持っています。特に、次のことができます。
現在、Clojure にはマルチメソッドがあります。つまり、次のことができます。
また、Clojureにはプロトコルがあります-これを使用して次のことができます:
今、この個人は次のように主張しています。
ただし、プロトコルとマルチメソッドがあります。これらは非常に強力ですが、Haskell の型クラスほど強力ではありません。プロトコルでコントラクトを指定することで、型クラスのようなものを導入できます。これは最初の引数でのみディスパッチされますが、Haskell は戻り値を含むシグネチャ全体でディスパッチできます。マルチメソッドはプロトコルより強力ですが、Haskell のディスパッチほど強力ではありません。
私の質問は、Clojure のプロトコルとマルチメソッドが Haskell の型クラスよりもポリモーフィズムに対して強力でない理由は何ですか?