Clojure架构像Bob大叔一样做了什么?

13

我正在尝试实现Clojure架构,就像Uncle Bob在这里http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html中所描述的那样,以及在《Clean Code》第07集 - 架构、用例和高级设计中所描述的那样。

内圈中的任何内容都不能知道外圈中的任何内容。

enter image description here enter image description here

我想用所有业务规则和测试来编写应用程序的核心。这个核心必须具有关于数据库中“对象”(如用户、付款、广告等)的操作的定义,但是如何实现这些操作必须在应用程序的更高层次上进行。

因此问题是:你能给我一个在GitHub上的好架构应用程序示例吗?就像图片中的圆圈? 我正在学习Clojure,并想看看技术上如何实现。我正在尝试自己做,但效果不佳。一个简单的代码示例将对我很有帮助。 我想逐步了解如何在Clojure中创建像图像中的层。

我将很高兴获取任何有关如何以高质量在Clojure中实现它的信息。可以是代码、视频或文章。可以免费或付款。


3
Uncle Bob的清晰架构的关键要素是依赖反转。在Clojure中,有多种实现方式:使用高阶函数和协议可能是最相关的两种方法(无耻地插入一条广告链接:http://blog.find-method.de/index.php?/archives/209-Dependency-inversion-in-Clojure.html)。但是,您还需要实现不同的圆圈:这基本上是一个使用命名空间并确保将协议定义放入正确的内部圆圈/层以及将实现放入正确的外部层的问题。 - schaueho
谢谢。这篇文章正好解决了我正在尝试解决的问题,而这个人比我多了几步 :) - kabra
@schaueho,您的评论和链接到详细而有价值的帖子已经超出了普通回答的范畴,您可以将其转化为一个答案。我猜kabra可能会接受它。 - Jaime Agudo
@JamesSharp:感谢您的激励性评论,我已经这样做了。 - schaueho
1个回答

12

叔叔鲍勃的干净架构的关键元素是依赖反转。在Clojure中,有多种实现方式:使用高阶函数和协议可能是最相关的两种(我在我的博客文章中介绍了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 ...])))

你可以考虑使用 Stuart Sierra 出色的组件库,而不是手工制作的 make-mydata-db-dao

但是你还需要实现不同的圆圈:这基本上是使用命名空间并确保将协议定义放入正确的内部圆/层和实现放入正确的外部层的问题。

假设你的网关代码通常在命名空间app.gateway.*中。那么,协议MydataDao可能会出现在命名空间app.gateway.dao中。然而,实现应该属于另一个外圈。假设你的所有数据库代码都在命名空间app.db.*中,那么你可以将make-mydata-db-dao放在app.db.dao中。

不幸的是,我不知道 Clojure 中是否有任何现有的代码库彻底实现了这一点。实际上,我很想看到任何语言中实现这一点的实际例子,并了解使用它的好处、缺点或困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接