像叔叔鲍勃那样的Clojure架构

时间:2015-04-25 16:17:10

标签: architecture clojure

我正在努力实现Clojure架构,就像Bob叔叔那样http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html,就像他在第07集中的干净代码中描述的那样 - 架构,用例和高级设计。

  

内圈中的任何内容都无法知道任何内容   外圈。

enter image description here enter image description here

我想用所有业务规则和测试来编写应用程序核心。这个核心必须有对数据库中“对象”的操作定义,如用户,支付,广告等。但是如何实现这一点必须在更高的应用程序上。

所以问题是:你能给我一个github上好的架构应用程序的例子,比如带有圆圈的图像吗?我正在学习Clojure,我想知道它在技术上是如何完成的。我想自己做,但结果不好。简单的代码示例将帮助我很多。 我想知道如何在Clojure中逐步创建图层。

我很高兴有关如何在Clojure中实现高质量的任何信息。可以是代码,视频或文章。可以免费或者可以购买。

1 个答案:

答案 0 :(得分:7)

Bob叔叔干净架构的关键元素是依赖倒置。使用Clojure有多种方法可以实现这一点:使用高阶函数和协议可能是两个最相关的(blog post of mine on dependency inversion in Clojure的无耻插件)。例如,您可以为数据定义持久性协议,这完全不了解特定的实现:

 (defprotocol MyDataDao
    (load-data [])
    (save-data []))

然后,您可以使用所述协议的实现,该协议可以使用数据库或普通文件系统(注意:使用reify只是一个选项):

 (defn make-mydata-db-dao []
    [... db-setup-code ... ]
    (reify MyDataDao
         (load-data []
            [... data-query-code ...])
         (save-data []
            [... data-save-code ...])))

而不是手工制作的make-mydata-db-dao你可能想看看Stuart Sierra的优秀component library

但是,您还需要实现不同的圈子:这基本上是使用命名空间并确保您放置名称空间的问题。协议定义到右内圈/层和实现到正确的外层。

假设您的网关代码通常位于命名空间app.gateway.*中。然后协议MydataDao可能最终在命名空间app.gateway.dao中。虽然实现属于不同的外圈。假设您的所有数据库代码都在命名空间app.db.*中,那么您可以将make-mydata-db-dao放入app.db.dao

不幸的是,我不知道Clojure中任何现有的代码库都彻底实现了这一点。实际上,我有兴趣看到以任何语言实现的实际例子,并且更多地了解使用它的好处和缺点或困难。