Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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:高阶函数vs协议vs多方法_Clojure_Protocols_Abstraction_Higher Order Functions_Multimethod - Fatal编程技术网

CLojure:高阶函数vs协议vs多方法

CLojure:高阶函数vs协议vs多方法,clojure,protocols,abstraction,higher-order-functions,multimethod,Clojure,Protocols,Abstraction,Higher Order Functions,Multimethod,有很多协议与多方法的比较,但为什么不使用高阶函数呢? 让我们举个例子: 我们有一些数据(例如记录)。我们有方法序列化和反序列化。 假设我们希望将其保存到文件、json和数据库中。 我们是否应该创建名为序列化方法的协议和名为数据库、json、文件的记录来实现它们?创建记录只是为了使用协议,这看起来有点像黑客。第二个解决方案—multimethod—可以使用序列化输出获取字符串参数,并决定如何执行此操作。但我不确定这是正确的方式去。。。 第三种方法是编写函数序列化,然后传递数据并序列化函数。但现在我

有很多协议与多方法的比较,但为什么不使用高阶函数呢? 让我们举个例子: 我们有一些数据(例如记录)。我们有方法序列化反序列化。 假设我们希望将其保存到文件、json和数据库中。 我们是否应该创建名为序列化方法的协议和名为数据库json文件的记录来实现它们?创建记录只是为了使用协议,这看起来有点像黑客。第二个解决方案—multimethod—可以使用序列化输出获取字符串参数,并决定如何执行此操作。但我不确定这是正确的方式去。。。 第三种方法是编写函数序列化,然后传递数据并序列化函数。但现在我不能用相同的名称命名序列化和反序列化方法(json fo示例):

问题是我如何(或应该如何)做到这一点。高阶函数是否有更通用的方法?或者我不太明白什么?
这是我使用clojure的第一步,所以请宽容。

转换为JSON与写入数据库或文件不同,因为后者是IO操作,第一步是纯粹的数据转换。考虑到这一点,我不建议在同一接口下实现它们

现在假设您有各种序列化实现,比如json和fressian,在您想要(反/)序列化的每个数据结构上实现它们肯定不是一个好主意。你认为那是一次黑客攻击是正确的。更简单地说,这将限制一个记录只能通过一个实现(反/)序列化

相反,使用不同的序列化程序更有效,每个序列化程序实现相同的接口:

(defrecord JSONSerializer []
  SerializationMethod
  (serialize [this data] ...)
  (deserialize [this data] ...))

(defrecord FressianSerializer []
  SerializationMethod
  ...)
这样,我们就有了几个序列化程序对象,这些对象可以传递给需要一个序列化程序的函数。这些功能不需要与实现相关

是否可以传递更高阶的函数

(defn do-something 
  [params serialize deserialize]
  ...)

这也行。然而,请注意,这种风格很快就会失控。例如。考虑一个场景,其中应该编写一个函数,将数据从一个格式反序列化,并将其序列化到另一个格式。p> 至于区分json和写入数据库/文件,我完全同意。但对于记录的解决方案——它是创建没有字段的记录——这对我来说很难。每次我们想要(反)序列化数据时,我们都必须创建记录的实例(.serialize->JSONSerializer data)。至于HOF,我的意思是:(序列化JsonSerialization数据)。和反序列化的序列化:(序列化FressianSerialization(反序列化JsonDeserialization数据))或使用arrow makro。出于示例目的,我省略了字段。有很好的理由让字段包含e。G配置参数。您不必每次调用SerializationMethod协议的方法时都创建JSONSerializer。如果实现正确,一条记录的方法可以被多次调用——如果实现线程安全,甚至可以从不同的线程调用。注释中的HOF示例不涉及传递的函数(???)——JsonSerialization是函数也是FressianSerialization。但现在我明白了这个解决方案是多么愚蠢——甚至不值得称之为解决方案。
(defn do-something 
  [params serialize deserialize]
  ...)