根据这篇文章的说法,在面向对象的编程/设计中,依赖注入涉及到
现在让我们考虑函数编程语言中的高阶函数,例如Haskell函数。
filter :: (a -> Bool) -> [a] -> [a]来自Data.List。这个函数将一个列表转换成另一个列表,为了执行它的工作,它使用(使用)一个外部谓词函数,该函数必须由调用者提供,例如表达式
filter (\x -> (mod x 2) == 0) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]从输入列表中选择所有偶数。
但是,这个结构不是非常类似于上面所示的模式吗?
filter函数是依赖的消费者,(a -> Bool)是接口契约,(\x -> (mod x 2) == 0)。一般来说,在函数式编程中,高阶函数及其使用模式能与面向对象语言中的依赖注入模式联系起来吗?
或者在相反的方向上,依赖注入可以与使用某种高阶函数相比较吗?
发布于 2012-10-24 09:48:01
是的,您的示例肯定代表了一种简单的依赖注入形式。
这种形式并不令人印象深刻--在OO语言中,您可以通过拥有将它们的依赖项作为参数(或在构造函数中要求它们的类)的方法来进行同样的操作。当您到处传递依赖项时,这会变得非常困难。因此,依赖注入容器负责构建包含所有依赖项的整个对象图。我不确定什么是FP等价物。
或者在相反的方向上,依赖注入可以与使用某种高阶函数相比较吗?
我会这么说,是的。依赖注入试图解决的问题是,当依赖项被硬编码时缺乏灵活性,如果您有单独的removeOddNumbersFromList、getAdminUsersFromList等函数,就会发生这种情况。
https://softwareengineering.stackexchange.com/questions/171156
复制相似问题