clojure中的写作服务
我正在编写一个简单的服务来检索来自不同来源的图像(instagram、flickr、google) 目前,每个服务都在一个单独的clojure中的写作服务,clojure,Clojure,我正在编写一个简单的服务来检索来自不同来源的图像(instagram、flickr、google) 目前,每个服务都在一个单独的.clj文件中提供,该文件包含一系列功能,既有通用的,也有特定的 我正在考虑为此引入协议ImageService,每个特定的服务都将实现该协议。通过这种方式,我们可以在协议级别添加文档并重用常用方法 使用协议解决此类问题的利弊是什么?我们如何为服务创建特定的实现:deftype、defrecord或reify?clojure中的惯用方法是什么?正如您所描述的,我们公司在
.clj
文件中提供,该文件包含一系列功能,既有通用的,也有特定的
我正在考虑为此引入协议ImageService
,每个特定的服务都将实现该协议。通过这种方式,我们可以在协议级别添加文档并重用常用方法
使用协议解决此类问题的利弊是什么?我们如何为服务创建特定的实现:
deftype
、defrecord
或reify
?clojure中的惯用方法是什么?正如您所描述的,我们公司在使用外部服务协议方面取得了巨大成功。协议很好,因为它们允许您以一种不可知的方式编写调用代码,并且还可以进行依赖项注入以方便测试(使用协议的模拟实现)。我遇到的协议的主要缺点是不能有(共享的)默认实现,否则我对它们非常满意
deftype
和defrecord
不同,在实践中,最显著的区别是使用defrecord生成的类型也可以表现为映射:
(defrecord Foo [bar])
(->Foo 1) ; or (Foo. 1)
; => #user.Foo{:bar 1}
(assoc (Foo. 1) :norf 2)
; => #user.Foo{:bar 1, :norf 2}
您是否需要此行为取决于您。reify
只是创建协议的“匿名”实现,我们倾向于不经常使用它,而是使用类似
(deftype MyService [args...])
; Our own public constructor
(defn ->my-service [config]
(->MyService (parse-config config)))
; etc ...
您希望如何调用通用服务?也就是说,函数调用是什么样子的?在每种特定情况下,应该根据什么选择服务?