JavaScript中用于配置的两种流行模式是构建器模式和选项对象模式:
生成器
var importer = new LeadImporter()
.assignLeads(true)
.source("source")
.organization(organization)
.setLeads(leads)
importer.processP().then(function() {
...
})
选项对象
var importer = new LeadImporter({
assignLeads: true,
source: "source",
organization: organization
})
importer.processP(leads).then(function() {
...
})
是否有最佳实践指南决定采用哪种模式?一种模式比另一种更有效吗?在什么情况下应采用一种模式而不是另一种模式?
答案 0 :(得分:2)
关于构建器模式示例的旁注:
您的示例并不真正适合构建器模式:“构建器”应该具有函数
build()
(有时称为get()
或construct()
),它返回目标的新对象类。在您的示例中,实例本身似乎提供了构建器函数(
source("source")
等)。这有许多缺点:对象在执行期间可能处于任意状态,并且每当程序的另一部分调用该实例的函数时,您需要花费大量精力来检查对象的状态。此外,这会通过混合实例和构建器函数来破坏类的公共API。它使调试更难,你的代码可读性更低。如果你有一个班级
LeadImporter
,你可以创建一个LeadImporterBuilder
,它提供了实际构建LeadImporter
实例的功能(这就是为什么我们称之为 build er pattern)。因此应创建LeadImporter
在现代JavaScript中,选项对象更受欢迎。在JAVA中,构建器模式很棒,但JavaScript足够动态,不能强制执行这种冗长。事实上,我记得很少有人在JavaScript中使用构建器模式。
在JAVA中,构建器模式非常常见且很棒。如果需要配置实例的许多属性,则比调用具有大量未命名参数的构造函数要好得多。通过提供在不同构建器方法中使用多个varargs参数的可能性,它也更灵活。此外,值在结果类的实例中仍然是最终的。另一个优点是某些参数可能是可选的,并且更方便的是不调用相应的构建器函数而不是将null
传递给类本身的构造函数或创建多个构造函数,具体取决于您可能想要的参数通过。
让我们看一下JavaScript中的这四个参数和替代选项对象:
.source("abc")
。source: "abc"
files: [ 'a', 'b', 'c' ]
代替files('a', 'b', 'c')
。在我看来,构建器模式比选项对象具有 no 优势 - 至少在JavaScript中是现代的。