像叔叔鲍勃那样的Clojure建筑

kab*_*bra 10 architecture clojure

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

内圈中的任何东西都不能知道外圈中的某些东西.

在此输入图像描述 在此输入图像描述

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

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

我很高兴有关如何在Clojure中以高质量做到这一点的任何信息.可以是代码,视频或文章.可以免费或者可以购买.

sch*_*eho 8

Bob叔叔干净架构的关键要素是依赖倒置.使用Clojure有多种方法可以实现这一点:使用更高阶的函数和协议可能是最相关的两个(在Clojure中关于依赖倒置博客文章的无耻插件).例如,您可以为数据定义持久性协议,这完全不了解特定的实现:

 (defprotocol MyDataDao
    (load-data [])
    (save-data []))
Run Code Online (Sandbox Code Playgroud)

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

 (defn make-mydata-db-dao []
    [... db-setup-code ... ]
    (reify MyDataDao
         (load-data []
            [... data-query-code ...])
         (save-data []
            [... data-save-code ...])))
Run Code Online (Sandbox Code Playgroud)

而不是手工制作,make-mydata-db-dao你可能想看看Stuart Sierra的优秀组件库.

但是,您还需要实现不同的圈子:这基本上是使用命名空间的问题,并确保将例如协议定义放入正确的内圈/层,将实现放入正确的外层.

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

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