clojure - Clojure如何处理关注点分离?

标签 clojure separation-of-concerns

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

并且,由于有这样的原则:“在1个数据结构上使用1000个更好的功能,而在100个数据结构上使用100个更好的功能”(或类似的东西)。

我的意思是,打包所有 map ,给它一个关键字作为键,就是这样吗?函数,标量,集合,一切...

“关注点分离”的想法是通过Java中的方面(面向方面​​的编程)和注释来实现的。这是我对概念的看法,可能会有所限制,因此请不要将其视为理所当然。

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

最佳答案

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

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

请注意,这意味着您的数据在经历这些转换后,必须具有丰富的结构。本质上,我们希望将程序的所有“智能”都放入数据中,而不是代码中。在复杂的功能程序中,不同级别的数据可能足够复杂,以至于需要看起来像本身就是一种编程语言-这就是“ Realm 特定语言”的思想在这里发挥作用的。

Clojure对操作复杂的异构数据结构提供了出色的支持,这使它比听起来听起来不那么麻烦(即,如果做对的话一点也不麻烦)

此外,Clojure对惰性数据结构的支持使这些中间数据结构实际上(在概念上)具有无限的大小,这使得在大多数情况下实现这种解耦成为可能。有关为何在这种情况下具有无限数据结构如此重要的信息,请参见以下论文:http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

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

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

关于clojure - Clojure如何处理关注点分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4442118/

相关文章:

ruby-on-rails-3 - 范围是在 Rails 类还是实例方法中?

clojure - 从数字创建关键字

clojure - 为什么 ClojureScript 原子没有实现完整的协议(protocol)?

sqlite - 如何使用 clojure.java.jdbc 插入包含时间戳值的行?

java - 如何将整数列表从 Clojure 传递给 Frege 函数?

clojure - 协议(protocol)、实现和调用者,位于三个命名空间中

web - Dart 是如何实现横切关注点的?

java - 为什么 Avalon-Framework 被关闭了?

asp.net-mvc - 如何在 POST 操作中将 View 模型映射回域模型?

design-patterns - 什么时候设计模式会让你的软件变得更糟?