1

こんにちは: Java では、IDE を使用して複雑なデータ型の深さを「トラバース」した経験があります。

dog.getCollar().getCollarTag().getName(); 

ただし、Clojure では、静的型付けがないため、これは自明ではなくなります。ネストされたデータ構造から発生する可能性のある複合体に対して、どのように「防御」または Clojure を行うのでしょうか?

1) clojure データ構造の深さに対する推奨される「制限」は?

2) 非常に深くネストされたデータ構造を処理するための一般的なイディオム。これにより、リストをマップと間違えたり、変数名の大文字/小文字を正しく区別できないなどのエラーが防止されます。

ここで少しパラダイムから外れているように聞こえたら許してください... REPLで継続的にテストすることで、そのようなエラーが効率的に抑制される場合があります..しかし、確認するための他の方法があるかどうか疑問に思っていました.コンパイル時、そのコードは可能な限り正確です (つまり、単体テスト、IDE / emacs プラグインなど...)

4

5 に答える 5

6

キーワードはここであなたの友達です

(def my-animals  { :dog {:collar {:tag {:name "fido"}}}})

マップは本質的に自己記述的であるため、マップに固執するようにしてください。
次に、最初にスレッドと..マクロで遊んでください

(-> my-animals :dog :collar :tag :name)

また、キーワードはマップ内で自分自身を検索する関数でもあるという事実を利用します。

コード補完を使用してIDEで作業する場合、コードを解析してからそのコードに関するデータを構築し、そのデータを解析して提案を生成します。データが自己宣言型である場合(「読み取り」可能)、IDEがなくてもこれを取得できます。

ps:これは、「コードはデータである」という標準的な怒りにつながり、私よりもはるかに賢い人々によって何度も表現されてきました:)

于 2012-01-13T23:57:37.603 に答える
3

REPL で関数の正確性をテストすることは、良い出発点です。それを改善する良い方法は、単体テストと、おそらく事前条件と事後条件の使用です (http://objectcommando.com/blog/2010/03/07/design-by-contract-with-clojure/)。

キーワードを使用すると、例を に変えることができます(get-in dog [:collar :tag :name])assoc-inまたはを使用した「変更」update-in

于 2012-01-14T11:58:43.217 に答える
2

この点で非常に役立つ素晴らしいライブラリがあります。Prismatic の開発者によるスキーマ ライブラリです。質問で参照しているものなど、ネストされたデータ構造にオプションの入力を追加する方法を提供します。これは、関数への入力を検証するために、実行時 (またはテスト時) に適用できます。さらに、関数がその入力に対して持つ仮定を説明する優れたドキュメントとしても機能します (これは小さなことではありません)。

于 2013-09-29T18:29:51.887 に答える
1

Chained getters are often a violation of the Law of Demeter. In doing so you are coupling your code to the whole data structure and this can be tricky and complex. In functional languages as clojure feels more natural to use recursion and sequence processing to keep it simple and idiomatic. So:

  1. Tell, don't ask. Instead of asking for "the name of the tag of collar of the dog..." try to ask the dog object or a high-level function to do what you want.
  2. As ponzao says, test, test and test. Test on the repl to explore your options and write small unit tests as a
于 2012-01-14T15:58:33.590 に答える
1

How do we "defend" or Clojure against complexites that might arrive from nested data structures?

できません。これは、この言語の欠点の 1 つです。静的型付けが必要な場合は、clojure は必要ありません。多くの人がネストされたマップの使用を推奨しますが、これは遅く、安全性がまったくなく、データ型ではありません。マップはデータ型ですが、ネストされたマップはそうではなく、ふりをするオブジェクトです。Clojure のデータは、データ構造自体ではなく、5 つの異なるデータ構造の複合体であるため、javascript と同様に、clojure ではプログラマーがさまざまなデータの内容が実際にどのようなものであるかを追跡する必要があります。

于 2012-01-15T21:21:46.127 に答える