Clojure实践 - 使用复杂数据类型及其元素的功能?

时间:2014-07-01 10:40:59

标签: function clojure lisp composition

在Clojure这样的lisps中使用简单的数据结构和许多功能是惯用的。尽管如此,有很多次我们必须使用由许多更简单的数据结构组成的复杂数据结构。

我的问题是关于良好风格/实践的问题。 一般来说,我们是否应该创建能够获取整个复杂对象的函数,并在该抽取内部创建我们需要的函数,或者它们应该只采用它们所需要的函数吗?

具体来说,我在下面的伪代码中比较了这两个选项

(defrecord Thing
  [a b])

(defn one-option
  [a]
  .. a .. ))

(one-option (:a a-thing))

;; ==============

(defn another-option
  [a-thing]
  .. (:a a-thing) .. ))

one-option-f的优点是功能更简单,责任更少。它也更具成分性 - 它可以在更多地方使用。

缺点是我们最终可能会重复自己。例如,如果我们有许多函数将一个Thing转换为另一个Thing,其中许多函数需要使用one-option,我们将在每个函数中重复提取代码。当然,另一种选择是创建两者,但这也会增加一定的代码开销。

2 个答案:

答案 0 :(得分:1)

我认为答案是"它取决于" "它在Clojure中与在对象系统中一样重要&#34 34; 。 Clojure有许多基本上正交的机制,旨在表达组成模式。函数参数的粒度往往会脱离程序结构的大小。


热空气太多了。有一些细节会影响参数粒度:

  • 由于Clojure数据结构是不可变的,因此数据隐藏和访问 功能/方法几乎没有相关性。所以重复造成的 访问复杂结构的部分是微不足道的。
  • 在对象设计中出现的内容,因为关联是由小的呈现 每个对象中的类型化对象指针的集合。在Clojure, 这些往往成为单一(吨)全球地图。有一个标准 Clojure函数用于访问和操作层次结构 这种结构(例如get-inassoc-in)。
  • 我们正在寻找动态约束的合规性 接口,Clojure协议和数据类型更清晰,更多 比大多数对象系统适应性强。在这种情况下,整个对象是 过去了。

答案 1 :(得分:0)

两者都做。首先,提供转换最简单结构的函数,然后添加便利函数来处理构成处理简单结构的函数的更复杂的结构。