3

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

(defn serialize [method data]
  (method data))

(defn json[data]
  (...))

问题是我该如何(或应该如何)做到这一点。有没有更高阶函数的更通用的方法?或者,也许我不太了解某些东西?这是我使用clojure的第一步,所以请宽容。

4

1 回答 1

2

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

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

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

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

(defrecord FressianSerializer []
  SerializationMethod
  ...)

通过这种方式,我们最终拥有了几个序列化器对象,这些对象可以传递给需要一个序列化器的函数。这些功能不需要关心实现。

可以改为传递高阶函数吗?

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

它也会起作用。但是请注意,这种风格可能很快就会失控。例如。考虑一个场景,应该编写一个函数,将数据从一种格式反序列化并将其序列化为另一种格式。

于 2014-10-26T11:18:14.693 回答