Article:
Thay defstruct và defmulti/defmethod bằng defrecord và defprotocol
584
ngocdaothanh.myopenid.com 172Updated 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)
172
