gpt4 book ai didi

lisp - 哪个 clojure 库界面设计最好?

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:15 24 4
gpt4 key购买 nike

我想提供消息读取器/写入器的多种实现。什么是最好的方法?

这是我目前正在思考的一些伪代码:

  • 只需要一组所有实现都必须提供的函数,并将其留给调用者以保留正确的流

    (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 中,通常没有太多理由将函数与其处理的对象捆绑在一起,除非您真的想对代码的用户隐藏实现细节。

如果您正在编写一个您期望有很多实现的接口(interface),请考虑同时使用 multimethods。您可以让默认值抛出“未实现”异常,以强制实现者实现您的接口(interface)。

正如 Gutzofter 所说,如果您考虑第二个选项的唯一原因是让人们不必在每次函数调用时键入参数,您可以考虑让所有函数都使用一些 var 作为默认套接字对象并编写一个 with-socket 宏,它使用 binding 来设置该 var 的值。请参阅默认使用 *out* 的值作为输出流的内置打印方法,以及将 with-out-str 绑定(bind)到字符串编写器的 *out*,作为 Clojure 示例。

This article 你可能会感兴趣;它将一些 OOP 习语与 Clojure 等价物进行了比较和对比。

关于lisp - 哪个 clojure 库界面设计最好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1371243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com