Clojure如何实现关注点分离?

Clojure如何实现关注点分离?,clojure,separation-of-concerns,Clojure,Separation Of Concerns,Clojure如何实现关注点分离?因为代码是数据,所以函数可以作为参数传递并用作返回 而且,因为有这样一个原则,“1000个函数在1个数据结构上工作,比100个函数在100个数据结构上工作要好”(或者类似的东西) 我的意思是,把所有东西都打包成地图,给它一个关键字作为键,就这样?函数,标量,集合,一切 关注点分离的思想在Java中通过方面(面向方面编程)和注释实现。这是我对这个概念的看法,可能有点局限,所以不要想当然 在Clojure中,正确的方法(惯用方法)是什么?为了避免函数式语言中程序员同

Clojure如何实现关注点分离?因为代码是数据,所以函数可以作为参数传递并用作返回

而且,因为有这样一个原则,“1000个函数在1个数据结构上工作,比100个函数在100个数据结构上工作要好”(或者类似的东西)

我的意思是,把所有东西都打包成地图,给它一个关键字作为键,就这样?函数,标量,集合,一切

关注点分离的思想在Java中通过方面(面向方面编程)和注释实现。这是我对这个概念的看法,可能有点局限,所以不要想当然


在Clojure中,正确的方法(惯用方法)是什么?为了避免函数式语言中程序员同伴的WTF,处理关注点分离的最佳方法是将任何编程问题转换为数据结构上的一组转换。例如,如果您编写一个web应用程序,总体目标是接受一个请求并将其转换为响应,这可以被认为是简单地将请求数据转换为响应数据。(在一个非平凡的web应用程序中,启动数据可能不仅包括请求,还包括会话和数据库信息)大多数编程任务都可以这样考虑

每个“关注点”都是“管道”中的一个函数,有助于实现转换。通过这种方式,每个功能与其他步骤完全解耦

请注意,这意味着您的数据在经历这些转换时需要具有丰富的结构。本质上,我们希望将程序的所有“智能”都放在数据中,而不是代码中。在一个复杂的函数程序中,不同级别的数据可能足够复杂,以至于In本身需要看起来像一种编程语言——这就是“领域特定语言”的概念发挥作用的地方

Clojure对操作复杂的异构数据结构有很好的支持,这使得它看起来不那么麻烦(也就是说,如果做得好,它一点也不麻烦)

此外,Clojure对惰性数据结构的支持允许这些中间数据结构实际上(概念上)无限大,这使得这种解耦在大多数场景中成为可能。有关在这种情况下为什么拥有无限数据结构如此有价值的信息,请参阅以下文章:

这种“管道”方法可以处理90%的分离关注点的需求。对于剩下的10%,您可以使用Clojure宏,在较高的层次上,它可以被认为是面向方面编程的非常强大的工具


这就是我认为在Clojure中可以最好地解耦关注点的方式——请注意,“对象”或“方面”在这种方法中并不是真正必要的概念。

您可以更具体地说明您的要求吗。关注点分离是一个术语,用于表示100种不同的事物。方面是一种在不访问源代码的情况下修改现有代码行为的方法。Clojure和其他Lisp通过动态变量提供类似的功能,这些变量本质上是具有自己堆栈的全局变量。顶级函数(使用defn创建的函数)是动态变量,可以使用
绑定
进行绑定。
binding
的语法看起来就像
let
,但是绑定是在绑定表单内的调用中使用的。说得好!另外,如果您的大多数函数都是纯函数,那么您可以轻松地独立测试它们。因此,您可以获得结构(函数语言),而不是对象(在OO语言中)。这是对应的封装“概念”(实现高内聚、低耦合、黑盒、模块化)?它有名字吗?这是一本关于类似管道方法(尽管是Python)的好书: