【问题标题】:Clojure Architecture like Uncle Bob did像 Bob 大叔一样的 Clojure 架构
【发布时间】:2015-07-04 05:58:50
【问题描述】:

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

内部圈子中的任何人都无法完全了解 一个外圈。

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

所以问题是:你能给我一个关于 github 上的优秀架构应用程序的例子吗,比如在带有圆圈的图像上?我正在学习 Clojure,我想看看它在技术上是如何做到的。我正在尝试自己做,但结果很糟糕。简单的代码示例将对我有很大帮助。 我想知道如何在 Clojure 中像在图像上一样一步一步地创建图层。

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

【问题讨论】:

  • Uncle Bob 干净架构的关键元素是依赖倒置。 Clojure 有多种实现方式:使用高阶函数和协议可能是最相关的两种(无耻插件:blog.find-method.de/index.php?/archives/…)。但是,您还需要实现不同的圈子:这基本上是使用命名空间并确保您放置例如协议定义到正确的内圈/层,实现到正确的外层。
  • 谢谢。这篇文章正是关于我要解决的问题,这个人离我还有几步之遥,然后是我:)
  • @schaueho 您的评论和指向详细且有价值的帖子的链接超过了平均答案,您可以将其转换为答案。我猜卡布拉可能会接受它
  • @JamesSharp:感谢您的鼓舞人心的评论,就这样做了。

标签: architecture clojure


【解决方案1】:

Uncle 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 ...])))

您可能想看看 Stuart Sierra 的出色 component library,而不是手工制作的 make-mydata-db-dao。

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

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

不幸的是,我不知道 Clojure 中有任何现有的代码库可以彻底实现这一点。实际上,我很想看到一个以任何语言实现的真实示例,并了解更多关于使用它的好处和缺点或困难的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 2012-04-21
    • 1970-01-01
    • 2020-08-24
    • 2018-04-03
    • 2023-03-05
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多