Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 传递依赖项的函数式编程_Javascript_Dependency Injection_Functional Programming - Fatal编程技术网

Javascript 传递依赖项的函数式编程

Javascript 传递依赖项的函数式编程,javascript,dependency-injection,functional-programming,Javascript,Dependency Injection,Functional Programming,我想知道在函数式编程中进行依赖项注入的常用方法是什么 例如,如果我有两个模块(DB和User) 用户模块接受Db模块 但是我应该发送用户模块中的每个Db函数还是整个Db对象 我的意思是(在JS中): 或者这个: function User(db) { return { insert(userData){..} delete(userId){..} } let usrs = User(Db) usrs.insert({username..}). usrs.delete(123)

我想知道在函数式编程中进行依赖项注入的常用方法是什么

例如,如果我有两个模块(DB和User)

用户模块接受Db模块

但是我应该发送用户模块中的每个Db函数还是整个Db对象

我的意思是(在JS中):

或者这个:

function User(db) {
  return {
    insert(userData){..}
    delete(userId){..}
}
let usrs = User(Db)
usrs.insert({username..}).
usrs.delete(123)
如您所见,第二个示例代码较少,但仍然是面向对象的

在第一个示例中,每次从用户模块调用方法时,我都必须传递Db函数。也许随着时间的推移,事情会变得一团糟

你能建议一下有没有更好的办法吗。 所以,如果将来我更改Db对象(例如来自sqlite的mysql),我只能在一个地方更改它


谢谢

不要编写自己的依赖注入引擎-使用Exusing引擎,例如。好的方法是创建
User
类,并将
DB
对象注入
User
构造函数(并将其保存为
User
类的字段)。更好的方法是创建
UserService
,它注入了
DB
,并允许对
用户的模型进行操作(例如读/写)。

我想看看Mark Seeman的这一主题。马克经常在网上发帖,所以他可能会随大流

要过度简化,有几种方法取决于您的复杂性和您对功能纯度的渴望

最简单的方法就是将依赖项作为函数的参数。因此,您可以在代码的“外部”定义依赖项,并通过参数将它们“注入”到核心。对于更复杂的场景,您可能不喜欢这可能导致的许多额外参数

更复杂的项目可以利用部分应用和Mark讨论的“不纯/纯/不纯三明治”。然而,一些FP纯粹主义者坚持只在代码的核心使用纯函数

对于FP纯粹主义者,还有其他技术,但这些技术通常只在纯函数式语言中有用。马克可能不同意这一点

其中一些技术的使用将受到您选择的语言对FP的支持的限制。例如,我不知道JS有函数curry,但我对JS的经验非常有限。
您可能还想尝试一种转换编译为JS的FP语言,如F#/Fable或Purescript。

我想知道DI,这是一个真正的OOP概念,在函数式编程中是否有意义。。。倾向于暗示“某种”:。。。如果您关注DI的目标而不是实现。我想这可能值一个鼻子。这两个都很难“发挥作用”。尽管您也可以考虑使用对象只是收集类似的函数(更像是命名空间)而不是使用方法。尽管如此,功能性更强的方法是第一种与curry结合的方法——每个函数都必须有数据库才能插入。它不会进入一个全球性的国家。但是如果你使用curry,你可以使用
insert::db->user
,这样你就不必一直通过数据库。考虑到这一点,第二个代码块更接近于函数式方法。
用户
类对我来说听起来不太FP。我想了解如何在FP语言中管理依赖项。即使JS不是真实的FP,这个例子也可以用JS来完成,这样我就可以理解这个范例。
function User(db) {
  return {
    insert(userData){..}
    delete(userId){..}
}
let usrs = User(Db)
usrs.insert({username..}).
usrs.delete(123)