Clojureには、genクラス、reify、proxy、deftypeおよびdefrecordがあり、新しいクラスのようなデータ型を定義します。構文の単純さと不必要な複雑さを嫌う言語の場合、それは収差のように思えます。 誰かがなぜそうなのか説明できますか? Common Lispスタイルのdefclassで十分でしょうか?Clojureは、クラスを1つではなく5つの方法で定義する理由は何ですか?
答えて
これは、3つの異なる要因の組み合わせである:
- これらは早期に開発され、言語の進化に伴って後に開発されました。
まず、これらが何をするかを考えてみましょう。 deftypeおよびgen-classは、両方とも、事前コンパイルのための名前付きクラスを定義している点で類似しています。ジェネラルクラスが最初に来て、clojure 1.2でdeftypeが続きました。 Deftypeが好まれ、パフォーマンス特性は優れていますが、より制限的です。 deftypeクラスはインタフェースに準拠できますが、別のクラスから継承することはできません。
具体化とプロキシは、両方の実行時に動的に匿名クラスのインスタンスを作成するために使用されています。プロキシが最初に来て、refeはdeftypeとdefrecord with clojure 1.2と一緒に来ました。セマンティクスがあまり制限的ではない、デフトタイプと同じように、Reifyが好まれます。
deftypeとdefrecordの両方が同じ時刻に表示され、同様の役割を果たしているため、その理由が問われます。ほとんどの目的のために、私たちはdefrecordを使いたいと思っています。それは、われわれが知っていて愛しているさまざまな善良さ、順序性などすべてを持っています。 Deftypeは、他のデータ構造を実装するための低レベルビルディングブロックとしての使用を意図しています。通常のclojureインターフェイスは含まれていませんが、これはデフォルトではありませんが、変更可能なフィールドのオプションがあります。
さらに読書のためにチェックアウト:
The clojure.org datatypes page
The google group thread where deftype and reify were introduced
短い答えは、彼らがすべて異なると有用な目的を持っているということです。複雑さは、基盤となるJVMのさまざまな機能と効果的に相互運用する必要があるためです。
の場合、Javaの相互運用性は不要です。時間の99%は、defrecordまたは単純なClojureマップを使用することをお勧めします。
- 使用defrecordあなたは、そうでない場合のプロトコル を使用したい場合は、通常のClojureのマップで、おそらく最も簡単で理解しやすい
ニーズがより複雑な場合は、次のフローチャートは、のための素晴らしいツールです。あなたが他の人の上にこれらのオプションのいずれかを選択する理由を説明する:
http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/
フローチャートへのリンクに感謝します。このブログは、O'reilly's - Programming Clojureの共著者によるものです。私はこの意思決定がかなり複雑だと思う。インタフェースと具象クラスの違いや静的メソッドの定義の必要性、または名前付きの型や匿名型は膨大なため、異なる言語構造が必要ですか? – Salil
違いは広大ではありませんが、達成しようとしている点では哲学的に違いがあります。私はClojureの複数のアプローチがこれらの根本的な違いを反映していると考えています。なぜなら、異なる名前を付けなければならない理由があります。 – mikera
+1。前のフローチャートを見ていなかった、それは素晴らしいです。 –
- 1. 1つのtasks.jsonでいくつかのtypescriptコンパイルタスクを定義する方法は?
- 2. Java:このようなキャラクターを定義する理由は何ですか?
- 3. 1つのクラスで2つのクラスのプロパティを継承する方法は?
- 4. ではなく、1つの
- 5. __setattr __()は__slots__を持つクラスで定義できますか?
- 6. anglejsでカスタムディレクティブを定義する方法はいくつありますか?
- 7. 1行で簡単にインスタンス化できるプライベートメンバーを持つクラスを定義する最も良い方法は?
- 8. パフォーマンスは、シングルトンクラスまたは静的クラスを持つ十分な理由ですか?
- 9. Groovyの1..5、[* 1..5]と[1..5]の違いは何ですか? Groovyで
- 10. htaccessに5行のコードを持つ魔法は何ですか?
- 11. angularjsの$タイムアウトは、いくつかのスクリプトでは理由
- 12. Molesがいくつかの関数の代理人を生成しない理由は何ですか?
- 13. 1つのRailsフォームで1つのクラスの多くのオブジェクトを編集する最善の方法は何ですか?
- 14. Clojureでマップをスライスする慣用方法は何ですか?
- 15. 1つのフォームで2つのボタンを処理する方法は?
- 16. 1つのui:repeatで2つの配列を反復処理する方法は?
- 17. GACスコープ:ローカルアセンブリをオーバーライドする理由は何ですか?それについては何かできますか?
- 18. VxWorksはそのように決定的かつ高速になる理由は何ですか?
- 19. HTML 5 doctypeの使用を開始しない理由は何ですか?
- 20. dwr.xmlでは、いくつかのクラスをグローバルフィルタから除外する方法は?
- 21. 2つのフォーム(1つはレイアウト、1つはページ)asp.netで処理する方法mvc3
- 22. 1つではなく2つのプロセスを開始するサブプロセス
- 23. ジェンキンスで少なくとも1つのビルドを見つける方法は?
- 24. スキーマがXML列を遅くする理由は何ですか?
- 25. Global.asaxからasp.net WebFormページをレンダリングするには? 1つの理由か別の理由で
- 26. クラス<<内部でクラス定義は何をしますか?
- 27. いくつかの自動リダイレクトを処理する適切な方法は何ですか?
- 28. 1つの.cppファイルで複数のクラスを定義することは可能ですか?
- 29. Pythonの場合、x == 1またはx == 5またはx == 10の場合、aを書くいくつかの他の方法は何ですか?
- 30. 永続クラスの複数パラメータコンストラクタの理由は何ですか?
Googleグループのスレッドは非常に貴重でした。私の理解は、java-interopプロキシのためであり、gen-classはreifyとdeftypeを主に取り入れています。私は今、タイプを定義するための「推奨される」方法が少なくなったことをうれしく思っています。 – Salil
偉大な答えは、スレッドのリンクに感謝します。 –
申し訳ありませんが、「連続性」とはどういう意味ですか? Googleがサポートしていない... – Trylks