2009-09-03 27 views
10

Tôi muốn cung cấp nhiều triển khai của trình đọc/ghi thư. Đâu là cách tiếp cận lí tưởng nhất?thiết kế giao diện thư viện clojure nào là tốt nhất?

Dưới đây là một số mã giả về những gì tôi đang suy nghĩ:

  • chỉ có một tập hợp các chức năng mà tất cả các triển khai phải cung cấp và để nó lên đến người gọi để giữ được quyền suối

    (ns x-format) 
    (read-message [stream] ...) 
    (write-message [stream message] ...) 
    
  • trở lại bản đồ với hai chức năng đóng nắm giữ dòng

    (ns x-format) 
    (defn make-formatter [socket] 
        {:read (fn [] (.read (.getInputStream socket)))) 
        :write (fn [message] (.write (.getOutputStream socket) message)))}) 
    
  • cái gì khác?

Trả lời

8

Tôi nghĩ tùy chọn đầu tiên sẽ tốt hơn. Nó có thể mở rộng hơn, tùy thuộc vào cách các vật thể này sẽ được sử dụng. Việc thêm hoặc thay đổi một hàm mới hoạt động trên một đối tượng hiện có dễ dàng hơn nếu các hàm và đối tượng là riêng biệt. Trong Clojure thường không có nhiều lý do để bó các hàm cùng với các đối tượng mà chúng hoạt động, trừ khi bạn thực sự muốn ẩn các chi tiết triển khai từ người dùng mã của bạn.

Nếu bạn đang viết một giao diện mà bạn mong đợi nhiều triển khai, hãy cân nhắc sử dụng multimethods. Bạn có thể có mặc định ném một ngoại lệ "không được triển khai", để buộc người triển khai triển khai giao diện của bạn.

Khi Gutzofter cho biết, nếu lý do duy nhất bạn xem xét tùy chọn thứ hai là cho phép mọi người không phải nhập tham số vào mọi cuộc gọi hàm, bạn có thể xem xét việc sử dụng một số var làm socket mặc định đối tượng và viết một macro with-socket sử dụng binding để đặt giá trị của biến đó. Xem các phương thức in sẵn có mặc định sử dụng giá trị *out* làm luồng đầu ra và with-out-str liên kết *out* với một trình tạo chuỗi, như một ví dụ về Clojure.

This article có thể bạn quan tâm; nó so sánh và tương phản một số thành ngữ OOP với Clojure tương đương.

3

Tôi nghĩ rằng thông báo đọc và tin nhắn là các chức năng tiện ích. Những gì bạn cần làm là gói gọn các chức năng của bạn trong một (các) macro. Xem 'with-output-to-string' trong lisp thông thường để xem ý tôi là gì.

Chỉnh sửa: Khi bạn sử dụng macro, bạn có thể xử lý lỗi và phân bổ tài nguyên trong việc mở rộng macro.

2

Tôi muốn sử dụng tùy chọn đầu tiên và thực hiện tất cả các chức năng đa phương thức đó.

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