2012-03-11 27 views
16

Tôi đã dành một chút thời gian, cố gắng hiểu về đa phương tiện Clojure. Đối số multimethod "pro" chính, theo như tôi hiểu, là tính linh hoạt của chúng, tuy nhiên, tôi bị lẫn lộn với sự tranh luận về lý do tại sao multimethods tốt hơn một câu lệnh if hoặc case đơn giản. Có thể ai đó, xin vui lòng, giải thích, đó là đường giữa đa hình và một tuyên bố trường hợp overglorified rút ra?Tại sao đa phương tiện của Clojure tốt hơn câu lệnh 'if' hoặc 'case'

CHỈNH SỬA: Tôi phải rõ ràng hơn trong câu hỏi, rằng tôi quan tâm nhiều hơn so với câu lệnh 'if'. Cảm ơn rất nhiều câu trả lời!

+0

Đường kẻ được vẽ giữa một câu lệnh if và goto bị quá tải ở đâu? – Kevin

+1

Bạn có thể quan tâm http://stackoverflow.com/q/5986120/625403, không chính xác là trùng lặp nhưng có liên quan chặt chẽ. – amalloy

Trả lời

16

Sự khác biệt giữa đa phương thức và câu lệnh if lớn là bạn cần phải sửa đổi hàm chứa câu lệnh trường hợp để thêm các trường hợp vào câu lệnh if. Bạn có thể thêm một phương thức mới mà không cần chạm vào các phương thức đã tồn tại trước đó.

Vì vậy, nếu bạn định nghĩa đa phương thức bên trong thư viện của mình và bạn muốn người dùng của bạn có thể mở rộng nó cho các kiểu dữ liệu riêng của họ, thì không có vấn đề gì. Nếu bạn đã sử dụng một tuyên bố nếu thay vào đó, nó sẽ là một vấn đề lớn.

+0

Ahh, đó thực sự là điều tôi không hiểu rõ, cảm ơn! Vì vậy, các multimethods không bị giới hạn trong không gian tên nơi defmulti được khai báo? – Iger

+0

@Iger Đúng vậy. – sepp2k

23

Giả sử chúng ta có các loại A, B, C, D và E và các phương pháp m1, m2, m3 lấy một đối số duy nhất của các loại trước đó. Bạn có thể đặt chúng trong một bảng như sau:

| A | B | C | D | E | 
m1 | | | | | | 
m2 | | | | | | 
m3 | | | | | | 

Chiến lược tuyên bố "chuyển đổi" đang thực hiện một hàng của bảng này cùng một lúc. Giả sử bạn thêm một kiểu mới F. Bạn sẽ phải sửa đổi tất cả các triển khai để hỗ trợ nó.

Tính đa hình dựa trên lớp (C++, Java, v.v.) cho phép bạn triển khai toàn bộ cột thay thế. Việc thêm một kiểu mới rất dễ dàng, vì bạn không phải thay đổi các lớp đã được định nghĩa. Nhưng thêm một phương pháp mới là khó, vì bạn sẽ phải thêm nó vào tất cả các loại khác.

Đa phương tiện cho phép bạn triển khai các ô đơn lẻ của bảng độc lập với nhau.

Tính linh hoạt này thậm chí còn lớn hơn nếu bạn phải gửi nhiều đối số. Mỗi đối số mới thêm một thứ nguyên khác vào bảng này, và cả các công văn dựa trên ngôn ngữ và dựa trên swich trở nên rất phức tạp khá nhanh (mẫu khách truy cập c.f.).

Lưu ý rằng đa phương tiện thực sự thậm chí còn chung chung hơn so với mô tả, vì bạn có thể gửi đi khá nhiều thứ, không chỉ trên các loại đối số.

1

Câu trả lời của ivant ở trên có thể được mở rộng bằng cách xem this article. Nó làm tốt công việc giải thích sức mạnh của các giao thức. Hãy suy nghĩ của multimethods như là giao thức với nhiều kích thước.

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