Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure中的写作服务_Clojure - Fatal编程技术网

clojure中的写作服务

clojure中的写作服务,clojure,Clojure,我正在编写一个简单的服务来检索来自不同来源的图像(instagram、flickr、google) 目前,每个服务都在一个单独的.clj文件中提供,该文件包含一系列功能,既有通用的,也有特定的 我正在考虑为此引入协议ImageService,每个特定的服务都将实现该协议。通过这种方式,我们可以在协议级别添加文档并重用常用方法 使用协议解决此类问题的利弊是什么?我们如何为服务创建特定的实现:deftype、defrecord或reify?clojure中的惯用方法是什么?正如您所描述的,我们公司在

我正在编写一个简单的服务来检索来自不同来源的图像(instagram、flickr、google)

目前,每个服务都在一个单独的
.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 ...

您希望如何调用通用服务?也就是说,函数调用是什么样子的?在每种特定情况下,应该根据什么选择服务?