Clojure 使用库的化合物

Clojure 使用库的化合物,clojure,namespaces,libraries,Clojure,Namespaces,Libraries,我经常会发现自己处于一种需要将两个或三个库的功能交织在一起的情况下。这些复合函数的使用方式与库本身类似。对该库组的调用中,约60%转到纯库,约40%转到复合库。所以这里有一个问题-我如何更好地组织代码?下图说明了这一问题: 在OOP语言中,比如Java,我只需要为它创建一个类。但是在Clojure中,一个专用的名称空间看起来像是一个滥杀滥伤,特别是其中可能有很多,而复制粘贴这些复合调用只是一种气味。有人知道如何优雅地处理这种情况吗?通常,您不应该根据调用的代码的位置来考虑函数,而应该考虑它们的

我经常会发现自己处于一种需要将两个或三个库的功能交织在一起的情况下。这些复合函数的使用方式与库本身类似。对该库组的调用中,约60%转到纯库,约40%转到复合库。所以这里有一个问题-我如何更好地组织代码?下图说明了这一问题:


在OOP语言中,比如Java,我只需要为它创建一个类。但是在Clojure中,一个专用的名称空间看起来像是一个滥杀滥伤,特别是其中可能有很多,而复制粘贴这些复合调用只是一种气味。有人知道如何优雅地处理这种情况吗?

通常,您不应该根据调用的代码的位置来考虑函数,而应该考虑它们的用途

当然,当您在名称空间中对用于类似目的的函数进行分组时,您可能会发现它们往往是在lib1、lib2和lib3函数的基础上构建的,但可能不是每个函数都使用所有这些库,有些可能会进一步使用lib4,有些则会通过调用您自己以前编写的函数来构建,而不直接使用libN;不过,只要名称空间保持其焦点,分组是正确的

另一方面,如果您将lib1、lib2和lib3用于两个不相关的目的(可能是因为这些库本身在某种程度上是多用途的),那么将用于这些不相关目的的函数分组在一个位置(无论是否是命名空间)是没有意义的


因此,只需将用于类似目的的函数(宏等)放在一起,就可以在您自己的代码库中保持干净的设计。这是否会导致对特定库的调用被分组在一起并不值得关注。

通常,您不应该考虑函数调用的代码在哪里,而应该考虑它们的用途

当然,当您在名称空间中对用于类似目的的函数进行分组时,您可能会发现它们往往是在lib1、lib2和lib3函数的基础上构建的,但可能不是每个函数都使用所有这些库,有些可能会进一步使用lib4,有些则会通过调用您自己以前编写的函数来构建,而不直接使用libN;不过,只要名称空间保持其焦点,分组是正确的

另一方面,如果您将lib1、lib2和lib3用于两个不相关的目的(可能是因为这些库本身在某种程度上是多用途的),那么将用于这些不相关目的的函数分组在一个位置(无论是否是命名空间)是没有意义的


因此,只需将用于类似目的的函数(宏等)放在一起,就可以在您自己的代码库中保持干净的设计。这是否会导致对特定库的调用被分组在一起并不值得关注。

如果可以根据函数的用途和作用在名称空间中对函数进行分组,为什么会这样做呢?IMHO,在OOP世界中,如果你不想做的只是将一些辅助函数组合在一起,那么类似乎更像是一种杀伤力。@juan.facorro好吧,是的,我也这么认为,但看到几十个这样的“辅助”名称空间,我感到害怕。或者我认为名称空间通常不用于此。。我想我只是不知道如何分组和命名它们。如果系统中可能有100个,你会如何对他们进行分组并给他们命名?这就是你要问的吗?“Clojure中名称空间之间的共享函数:@noahlz有趣的帖子,它确实让我对Clojure有了一些了解,但不,主题不同。在我的例子中,我将各种库中的函数组合成更大的函数,就像原子中的分子一样。虽然原子在分子中保持其身份和重要性,但我想处理的是我设计的化合物分子。比如说,lib-1有
fun-1
fun-2
,lib-2有
fun-a
fun-b
,现在我自己创造了乐趣,这将所有四种乐趣联系在一起,就像
(defn fun-1[x](fun-1(fun-a x(fun-b)(fun-2))x)
。很多,它们也是库性质的。我投票赞成“只为它创建一个名称空间”。你所描述的听起来像许多框架所做的,比如Ring、Compojure等。如果你可以根据函数的用途和作用在名称空间中对函数进行分组,那为什么这会是一种过分的做法?IMHO,在OOP世界中,如果你不想做的只是将一些辅助函数组合在一起,那么类似乎更像是一种杀伤力。@juan.facorro好吧,是的,我也这么认为,但看到几十个这样的“辅助”名称空间,我感到害怕。或者我认为名称空间通常不用于此。。我想我只是不知道如何分组和命名它们。如果系统中可能有100个,你会如何对他们进行分组并给他们命名?这就是你要问的吗?“Clojure中名称空间之间的共享函数:@noahlz有趣的帖子,它确实让我对Clojure有了一些了解,但不,主题不同。在我的例子中,我将各种库中的函数组合成更大的函数,就像原子中的分子一样。虽然原子在分子中保持其身份和重要性,但我想处理的是我设计的化合物分子。比如说,lib-1有
fun-1
fun-2
,lib-2有
fun-a
fun-b
,现在我自己创造了乐趣,这将所有四种乐趣联系在一起,就像
(defn fun-1[x](fun-1(fun-a x(fun-b)(fun-2))x)
。很多,它们也是库性质的。我投票赞成“为它创建一个名称空间”。你所描述的听起来像许多框架所做的,比如Ring、Compojure等等。