1. ホーム
  2. clojure

clojureでdefrecordはどこで使うべきですか?

2023-10-21 19:30:30

質問

私はclojureプログラムの中で多くのマップと構造体を使用しています。これらをdefrecordsに変換することの利点は(パフォーマンスとは別に)何でしょうか?

どのように解決するのですか?

構造体は事実上非推奨と考えるので、全く使っていません。

多くのマップインスタンスで使用されるよく知られたキーの固定セットを持っている場合、私は通常レコードを作成します。大きな利点は

  • パフォーマンス
  • 生成されたクラスは、マルチメソッドやその他の状況で切り替えることができる型を持っています。
  • defrecordの周りにマクロを追加することで、フィールドバリデーションやデフォルト値など、必要なものを取得することができる。
  • レコードは任意のインターフェイスやプロトコルを実装できる(マップはできない)
  • レコードはほとんどの場合、マップとして機能する
  • キーとバルは安定した(作成ごとの)順序で結果を返します。

レコードのいくつかの欠点。

  • レコードは(Clojureマップではなく)Javaクラスインスタンスなので、構造的な共有がなく、同じレコード構造は、おそらく変更された同等のマップ構造よりも多くのメモリを使用することになります。 また、レコードを変更すると、より多くのオブジェクトの作成/破棄がありますが、JVM は、この種の短命のゴミを汗をかかずに食べるように特別に設計されています。
  • 開発中にレコードを変更する場合、それらの変更をピックアップするために、おそらく REPL をより頻繁に再起動する必要があります。 これは、通常、開発の狭いビットの間だけの問題です。
  • 多くの既存のライブラリは、レコードをサポートするように更新されていません (postwalk、zip、matchure などなど)。 私たちは必要に応じてこのサポートを追加しました。