我想提供消息读取器/写入器的多个实现.什么是最好的方法?
这是我目前正在思考的一些伪代码:
只需拥有一组所有实现必须提供的功能,并将其留给调用者以保持正确的流
(ns x-format)
(read-message [stream] ...)
(write-message [stream message] ...)
返回一个带有两个闭合函数的映射,这些函数保持在流
(ns x-format)
(defn make-formatter [socket]
  {:read (fn [] (.read (.getInputStream socket))))
   :write (fn [message] (.write (.getOutputStream socket) message)))})
别的什么?
我认为第一种选择更好.它更具可扩展性,具体取决于这些对象的使用方式.如果函数和对象是分开的,则更容易添加或更改适用于现有对象的新函数.在Clojure中,通常没有太多理由将函数与它们所处理的对象捆绑在一起,除非您真的想要隐藏代码用户的实现细节.
如果您正在编写一个您希望实现许多实现的接口,请考虑使用多方法.您可以让默认设置抛出"未实现"异常,以强制实现者实现您的接口.
正如Gutzofter所说,如果您考虑第二个选项的唯一原因是允许人们不必在每个函数调用上键入参数,您可以考虑让所有函数使用一些var作为默认套接字对象并编写一个用于设置var值的with-socket宏binding.请参阅内置打印方法,默认使用值*out*作为输出流,并with-out-str绑定*out*到字符串writer,作为Clojure示例.
这篇文章可能会让你感兴趣 它将一些OOP习语与Clojure等价物进行比较和对比.