Clojure如何处理关注点分离?

时间:2010-12-14 17:26:01

标签: clojure separation-of-concerns

Clojure如何处理问题分离?由于代码是数据,因此函数可以作为参数传递并用作返回...

并且,因为有这样的原则“更好的1000个函数适用于1个数据结构,而不是100个函数在100个数据结构上”(或类似的东西)。

我的意思是,将地图打包,给它一个关键字作为关键字,就是这样吗?功能,标量,集合,一切......

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

在Clojure中采用什么是正确的方法(惯用方式),以避免其他程序员的WTF _

1 个答案:

答案 0 :(得分:61)

在函数式语言中,处理关注点分离的最佳方法是将任何编程问题转换为数据结构上的一组转换。例如,如果您编写Web应用程序,则总体目标是接受请求并将其转换为响应,这可以被视为简单地将请求数据转换为响应数据。 (在一个非平凡的Web应用程序中,起始数据可能不仅包括请求,还包括会话和数据库信息)大多数编程任务都可以这样考虑。

每个“关注点”都是“管道”中的一个功能,有助于使转换成为可能。这样,每个函数都完全与其他步骤分离。

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

Clojure对操纵复杂的异构数据结构提供了极好的支持,这使得它听起来不那么麻烦(即如果做得好,它根本不麻烦)

此外,Clojure对延迟数据结构的支持允许这些中间数据结构实际上(概念上)无限大,这使得在大多数情况下这种解耦成为可能。有关在这种情况下无限数据结构如此有价值的原因,请参阅以下文章:http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

这种“管道”方法可以满足您分离问题的90%需求。对于剩下的10%,你可以使用Clojure宏,它可以被认为是面向方面编程的一个非常强大的工具。

我认为你可以最好地解决Clojure中的问题 - 请注意,“对象”或“方面”在这种方法中并不是真正必要的概念。