在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
,我们将在每个函数中重复提取代码。当然,另一种选择是创建两者,但这也会增加一定的代码开销。
答案 0 :(得分:1)
我认为答案是"它取决于" 和"它在Clojure中与在对象系统中一样重要&#34 34; 。 Clojure有许多基本上正交的机制,旨在表达组成模式。函数参数的粒度往往会脱离程序结构的大小。
热空气太多了。有一些细节会影响参数粒度:
get-in
和assoc-in
)。答案 1 :(得分:0)
两者都做。首先,提供转换最简单结构的函数,然后添加便利函数来处理构成处理简单结构的函数的更复杂的结构。