【问题标题】:Functional dependency injection函数依赖注入
【发布时间】:2013-12-08 21:37:55
【问题描述】:

在编写面向对象的软件时,我经常使用依赖注入:

  • 将高级功能与低级功能组合在一起:我的帐户管理服务使用存储库和验证服务,而不是自己实现它们。

  • 将组件与其依赖项隔离:我的帐户管理服务通过接口使用它的依赖项,以便我可以交换实现、模拟单元测试等。

函数式编程语言中存在哪些模式来实现这些目标?

编辑:一位评论者正确地问:“只传递循环函数怎么样?”。我认为以下关于函数分组的评论一针见血——服务是具有一组共享依赖关系的函数集合,我可以将其作为原子组处理。

在 Clojure 中,协议似乎很好地解决了这个问题,但我真的很想知道如何更普遍地解决这个问题......

【问题讨论】:

  • 你的意思不是传递函数?为什么不能满足您的需求?
  • @marcin 服务不仅仅是功能。实际上,它们通常由具有协调(在某种意义上)行为的许多功能组成。
  • @CheatEx 它们函数(这些函数又可能由其他更小的函数组成)
  • @Mauricio 这对我来说并不那么明显。例如,让我们看看 twitter API。有很多方法,希望以某种常见的方式使用(比如已经提供的身份验证)。问题:如何将所有不同的方法表示为一个函数?是的,可以传递一个符号,识别一个方法并获取一个代表该方法的函数,但这就是我们拥有的 OO 方法(动态类型 BTW),不是吗?

标签: dependency-injection functional-programming


【解决方案1】:

前段时间我读过一篇post,描述了依赖注入在函数式编程中如何被视为柯里化。我认为这很有趣,并且对这个主题提供了很好的视角。

【讨论】:

    【解决方案2】:

    在小范围内,柯里化和函数作为参数之类的东西减少了对模块依赖的需求。在更大的范围内,标准 ML 仿函数之类的东西对此非常有用。 Racket 有一个名为units 的系统在这方面也做得很好。

    【讨论】:

    • jacobm,我对仿函数如何用于管理更大规模的依赖关系很感兴趣。您能给我们举一个例子来说明它是如何工作的吗?
    【解决方案3】:

    我开发了一个小库,我发现它对函数式 (JavaScript) 环境中的 DI 很有帮助,它没有什么特别之处,只是我喜欢的一种方法。

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 2020-03-09
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2021-12-27
      • 2018-06-17
      相关资源
      最近更新 更多