Model view controller Clojure中的MVC模型

Model view controller Clojure中的MVC模型,model-view-controller,orm,clojure,Model View Controller,Orm,Clojure,作为一名RubyonRails开发人员,在设计/实现web应用程序时,我从问题域中获取基本概念/实体,并将它们作为模型实现。通常,这些类是从基本ORM类派生的(例如,ActiveRecord::base),它们映射数据库表中的记录,并添加包含实现与模型相关的业务逻辑的额外方法 这种方法的优点是,您可以从问题域快速找到与对象相关的所有业务逻辑,这样,如果模型类不大,您就可以有效地理解应用程序的这一部分是如何工作的。它还与所有表示逻辑分离。此外,由于ORM,业务逻辑方法只包含少量特定于DB的代码,因

作为一名RubyonRails开发人员,在设计/实现web应用程序时,我从问题域中获取基本概念/实体,并将它们作为模型实现。通常,这些类是从基本ORM类派生的(例如,
ActiveRecord::base
),它们映射数据库表中的记录,并添加包含实现与模型相关的业务逻辑的额外方法

这种方法的优点是,您可以从问题域快速找到与对象相关的所有业务逻辑,这样,如果模型类不大,您就可以有效地理解应用程序的这一部分是如何工作的。它还与所有表示逻辑分离。此外,由于ORM,业务逻辑方法只包含少量特定于DB的代码,因此非常干净且易于阅读

缺点是这样的类通常会增长到一个巨大的规模,因此很难作为一个整体来理解

因此,我的问题是:

  • Clojure生态系统是否提供了一些实现与OOP的ORMs类似功能的库
  • 组织此类代码的“Clojure方式”是什么
  • 这种方法的优点和缺点是什么
  • 一些文章/书籍/谈话解释并证明了该方法的合理性
  • 是否有一些开源(示例)应用程序展示了这种方法

Clojure开发背后的一个驱动理念是尽可能合理地将数据视为数据,从而避免将数据合并和分离

  • Clojure生态系统是否提供了一些实现与OOP的ORMs类似功能的库? 希望使用将一种数据结构转换为另一种数据结构的纯函数来处理数据,这导致一些clojure程序员回避使用ORM,尽管如果您真的愿意,没有理由不在clojure中使用Hibernate

  • 组织此类代码的“Clojure方式”是什么? 我喜欢

  • 这种方法的优点和缺点是什么? Rich Hickey在本文中对这些想法进行了出色的讨论
  • 一些文章/书籍/谈话解释并证明了该方法的合理性? 我个人推荐

简单地说,您不需要将内容封装在对象中,而是直接使用列表、集合和地图等数据结构进行编程。因此,ORMs所做的工作简化为将一种数据结构转换为另一种:例如,
user row->user record
函数可能会将从SQL数据库弹出的值列表转换为表示应用程序业务逻辑中用户的映射。保存用户时,必须调用反向函数

我不得不说,对于一个有经验的OOP程序员来说,很难“理解”这样一个事实,那就是关于东西的仪式要少得多。我们的大脑似乎在与这个想法作斗争——IMHO,因为对于一个有经验的开发人员/软件架构师来说,这个想法太简单和不成熟了。:-)我希望我能写出更复杂的、充满怪异术语的回答,听起来像一个真正的专家,但实际上我做不到,因为没有更多的补充了。:-)

顺便说一句,有一点很小但很有趣——数据结构的普遍使用在OOP世界中被认为是错误的。例如,您不应该将货币存储在一个简单的元组
[10,“USD”]
中,而应该编写完整的
公共类货币
,它将封装所有货币、比较、取整等。但编写元组正是我们在FP中所做的。我记得我在OOP世界里对这件事有一些奇怪的感觉

在组织代码时,在名称空间方面,与OOP中的规则大致相同。您可以像在java包中一样基于主题组织代码,除了所有函数(您用来调用方法)现在都是无状态的,并且通常将上面提到的用户记录作为参数。因此,如果纯函数
bar
将返回新的数据结构
foo2
,而不是修改
foo
的状态,那么您将使用
(bar-foo)

也就是说,OOP的好处之一是,不仅有许多应用程序使用这种范式编写,更重要的是,已经尝试了多代方法(这就是我们如何实现DI容器的流行等)。函数式编程还没有这个功能。基本上,并没有人有一本关于如何在FP中实现应用程序架构的经验证的最终手册。顺便说一句,这就是为什么人们通常不愿意编写大型框架,而鼓励他们继续使用数据转换功能。通过这种方式,您可以始终按照您想要的方式连接它,并避免架构陷阱