2015-11-17 22 views
9

Trong documentation of Clojure's type mechanisms, nó được tuyên bố rằngTại sao thư viện lõi Clojure sử dụng dẫn xuất bê tông?

  • nguồn gốc bê tông là xấu
    • bạn không thể lấy được kiểu dữ liệu từ các lớp bê tông, chỉ có giao diện

Tuy nhiên, một số số core Clojure classes sử dụng dẫn xuất bê tông (t đây là những ví dụ khác, nhưng đây là những trường hợp duy nhất mà cha là một phần của clojure.lang):

  • ARef kéo dài AReference
  • Agent kéo dài ARef
  • Atom kéo dài ARef
  • Namespace kéo dài AReference
  • Ref kéo dài ARef
  • Var kéo dài ARef

Bên cạnh đó, có rất nhiều lớp trừu tượng. Tuy nhiên, không có cách nào để tạo ra tương đương với một lớp trừu tượng trong Clojure, và với tôi, phần mở rộng của một lớp trừu tượng dường như có tất cả các nhược điểm giống như dẫn xuất bê tông thông thường.

Tại sao dẫn xuất bê tông được sử dụng ở đây?

+0

Cùng một trang cũng cảnh báo chống lại sự biến đổi và đóng gói, nhưng các lớp trong 'clojure.lang' chứa nhiều trường riêng tư có thể thay đổi. Đừng nhầm lẫn giữa các chi tiết triển khai nội bộ của ngôn ngữ với cách sử dụng ngôn ngữ đó. – Alex

+1

@Alex Lý do duy nhất tôi quan tâm là phần mở rộng của giao diện trong 'clojure.lang' là cách * duy nhất * để triển khai cấu trúc dữ liệu mới trong Clojure tương thích với các hàm trong' clojure.core'. Nếu mọi thứ trong gói đó thực sự chỉ là các chi tiết thực hiện, thì kiến ​​thức về các hoạt động của nó không nên được yêu cầu cho phần mở rộng đó. –

Trả lời

2

Tôi không cảm thấy mình đủ thẩm quyền khi nói về công cụ triết học, nhưng đây là hai xu của tôi.

Lý do văn bản được trích dẫn của bạn xuất hiện ở đó, là cảnh báo lạm dụng defrecorddeftype. Clojure không khuyến khích hiển thị hồ sơ/loại dưới dạng API. Thay vào đó, người ta nên phơi bày giao diện bất cứ khi nào có thể. Sau khi tất cả, ngôn ngữ OO phơi bày các lớp và ngôn ngữ FP cho thấy các hàm/phương thức/giao diện.

Mặt khác, bạn đã đề cập đến việc triển khai clojure tự sử dụng các lớp trừu tượng và kế thừa chúng. Tôi thà coi đó là "những công việc bẩn thỉu mà một số người phải làm". JVM được thiết kế sao cho nó hiệu quả nhất trên các nguyên thủy trong thế giới OO. Khoảng cách giữa máy ảo thế giới OO và ngôn ngữ FP-world phải được điền bởi ai đó.

+0

Điều đó có ý nghĩa, nhưng tôi cần xem thêm hỗ trợ cho lập luận của bạn để tin rằng việc sử dụng các lớp trừu tượng ở đây chỉ đơn giản là "điều ác cần thiết" và, không có đặc tính hiệu năng của JVM, sẽ kém hơn việc sử dụng giao diện thuần túy. Dường như Rich Hickey có một lý do rất thận trọng ở đây. –

Các vấn đề liên quan