Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Thay defstruct và defmulti/defmethod bằng defrecord và defprotocol 584

JVM
ngocdaothanh.myopenid.com 172
Updated about 1 year ago

Clojure là ngôn ngữ thuần functional có hỗ trợ OOP. Về mặt khoa học máy tính, có nhiều cách để thực hiện đa hình. Ở phiên bản trước 1.2, đa hình trong Clojure được thực hiện thông qua giải pháp polymorphic dispatch thông qua defmulti/defmethod rất tổng quát. Từ phiên bản 1.2, Clojure thêm defprotocol giúp đơn giản hóa trường hợp đa hình theo kiểu type-based dispatch truyền thống (kiểu của các ngôn ngữ như C++ và Java). Hơn nữa để tăng tốc độ chạy, Clojure 1.2 khuyên nên dùng defrecord thay cho defstruct trong mọi trường hợp.

Dưới đây là đoạn mã ví dụ theo tinh thần của bài tập 4OOP. Theo phong cách của Clojure, số lượng kiểu được giữ ở mức tối thiểu (phong cách Clojure là thà thiết kế 100 hàm để thao tác trên 1 kiểu dữ liệu còn hơn 10 hàm trên 10 kiểu dữ liệu), nên ta chỉ tạo 2 kiểu là Cat và Dog, không tạo kiểu Zoo.

(defprotocol Talkable
  (talk [this]))
; => Talkable

(defrecord Cat [name]
  Talkable
  (talk [this] (println "Meow, my name is" name)))
; => user.Cat

(defrecord Dog [name]
  Talkable
  (talk [this] (println "Wolf, my name is" name)))
; => user.Dog

(Cat. "Kitty")
; => #:user.Cat{:name "Kitty"}

(def k (Cat. "Kitty"))
(def p (Dog. "Pluto"))

(talk k)
; Hiện ra Meow, my name is Kitty

(talk p)
; Hiện ra Wolf, my name is Pluto

(def zoo [k p])  ; Không cần tạo kiểu mới làm gì cho phức tạp
(map talk zoo)

Comments

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content