Clojure如何实现关注点分离?

Bel*_*lun 20 clojure separation-of-concerns

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

并且,因为有这样的原则"更好的1000个函数可以在1个数据结构上工作,而不是100个函数在100个数据结构上"(或类似的东西).

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

通过Aspects(面向方面​​编程)和注释,在Java中实现了Separation of Concerns的概念.这是我对这个概念的看法,可能有些限制,所以不要把它视为理所当然.

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

drc*_*ode 61

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

每个"关注点"都是"管道"中的一个功能,有助于使转换成为可能.通过这种方式,每个功能与其他步骤完全分离.

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

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

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

这种"管道"方法可以满足您分离问题的90%的需求.对于剩下的10%,您可以使用Clojure宏,这在高层次上可以被认为是面向方面编程的一个非常强大的工具.

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