Pertanyaan Mengapa Clojure memiliki 5 cara untuk mendefinisikan kelas, bukan hanya satu?


Clojure memiliki kelas gen, reify, proxy dan juga deftype dan defrecord untuk mendefinisikan tipe data yang baru. Untuk bahasa yang menghargai kesederhanaan sintaksis dan memalukan kompleksitas yang tidak perlu, tampaknya seperti penyimpangan. Bisakah seseorang menjelaskan mengapa demikian? Bisakah Lisp-style deflass umum sudah cukup?


75
2017-08-22 02:03


asal


Jawaban:


Ini adalah campuran dari tiga faktor yang berbeda:

  1. Sistem tipe khusus dari jvm
  2. Kebutuhan untuk semantik yang sedikit berbeda untuk kasus penggunaan yang berbeda ketika mendefinisikan jenis
  3. Fakta bahwa beberapa di antaranya dikembangkan lebih awal, dan beberapa kemudian, karena bahasa telah berevolusi.

Jadi pertama, mari kita pertimbangkan apa yang mereka lakukan. deftype dan kelas gen serupa karena keduanya mendefinisikan kelas yang dinamai untuk kompilasi di depan waktu. Gen-class muncul lebih dulu, diikuti oleh deftype dalam clojure 1.2. Deftype lebih disukai, dan memiliki karakteristik kinerja yang lebih baik, tetapi lebih restriktif. Kelas deftype dapat menyesuaikan dengan antarmuka, tetapi tidak dapat mewarisi dari kelas lain.

Reify dan proxy keduanya digunakan untuk membuat instance kelas anonim pada waktu proses secara dinamis. Proxy datang lebih dulu, reify datang bersama dengan deftype dan defrecord di clojure 1.2. Reify lebih disukai, sama seperti deftype, di mana semantik tidak terlalu membatasi.

Itu meninggalkan pertanyaan mengapa kedua deftype dan defrecord, karena mereka muncul pada saat yang sama, dan memiliki peran serupa. Untuk sebagian besar tujuan, kami ingin menggunakan defrecord: ia memiliki semua berbagai kebaikan clojure yang kita kenal dan cintai, sekuel dan sebagainya. Deftype dimaksudkan untuk digunakan sebagai blok bangunan tingkat rendah untuk implementasi datastructures lainnya. Ini tidak termasuk antarmuka clojure biasa, tetapi memiliki opsi bidang bisa berubah (meskipun ini bukan default).

Untuk membaca lebih lanjut, lihat:

Halaman datatyp clojure.org

Grup google thread tempat deftype dan reify diperkenalkan


82
2017-08-22 03:20



Jawaban singkatnya adalah bahwa semuanya memiliki tujuan yang berbeda dan bermanfaat. Kerumitannya adalah karena kebutuhan untuk beroperasi secara efektif dengan fitur-fitur berbeda dari JVM yang mendasarinya.

Jika kamu tidak perlu interop Java maka 99% dari waktu Anda sebaiknya bertahan dengan defrecord atau peta Clojure sederhana.

  • Gunakan defrecord jika Anda ingin menggunakan protokol
  • Kalau tidak, peta Clojure biasa mungkin paling sederhana dan paling bisa dimengerti

Jika kebutuhan Anda lebih kompleks, maka bagan berikut ini adalah alat yang hebat untuk menjelaskan mengapa Anda memilih salah satu opsi ini dari yang lain:

http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form/

Flowchart for choosing the right clojure type definition form


44
2017-08-22 09:34