我正在努力实现Clojure架构,就像Bob叔叔那样http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html,就像他在第07集中的干净代码中描述的那样 - 架构,用例和高级设计。
内圈中的任何内容都无法知道任何内容 外圈。
我想用所有业务规则和测试来编写应用程序核心。这个核心必须有对数据库中“对象”的操作定义,如用户,支付,广告等。但是如何实现这一点必须在更高的应用程序上。
所以问题是:你能给我一个github上好的架构应用程序的例子,比如带有圆圈的图像吗?我正在学习Clojure,我想知道它在技术上是如何完成的。我想自己做,但结果不好。简单的代码示例将帮助我很多。 我想知道如何在Clojure中逐步创建图层。
我很高兴有关如何在Clojure中实现高质量的任何信息。可以是代码,视频或文章。可以免费或者可以购买。
答案 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中任何现有的代码库都彻底实现了这一点。实际上,我有兴趣看到以任何语言实现的实际例子,并且更多地了解使用它的好处和缺点或困难。