Javascript 传递依赖项的函数式编程
我想知道在函数式编程中进行依赖项注入的常用方法是什么 例如,如果我有两个模块(DB和User) 用户模块接受Db模块 但是我应该发送用户模块中的每个Db函数还是整个Db对象 我的意思是(在JS中): 或者这个: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)
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)