Javascript Builder Pattern与联系人导入器的选项对象

时间:2015-09-09 18:30:38

标签: javascript design-patterns options builder idioms

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() {
    ...
})

是否有最佳实践指南决定采用哪种模式?一种模式比另一种更有效吗?在什么情况下应采用一种模式而不是另一种模式?

1 个答案:

答案 0 :(得分:2)

关于构建器模式示例的旁注:

  

您的示例并不真正适合构建器模式:“构建器”应该具有函数build()(有时称为get()construct()),它返回目标的新对象类。

     

在您的示例中,实例本身似乎提供了构建器函数(source("source")等)。这有许多缺点:对象在执行期间可能处于任意状态,并且每当程序的另一部分调用该实例的函数时,您需要花费大量精力来检查对象的状态。此外,这会通过混合实例和构建器函数来破坏类的公共API。它使调试更难,你的代码可读性更低。

     

如果你有一个班级LeadImporter,你可以创建一个LeadImporterBuilder,它提供了实际构建LeadImporter实例的功能(这就是为什么我们称之为 build er pattern)。因此应创建LeadImporter

在现代JavaScript中,选项对象更受欢迎。在JAVA中,构建器模式很棒,但JavaScript足够动态,不能强制执行这种冗长。事实上,我记得很少有人在JavaScript中使用构建器模式。

在JAVA中,构建器模式非常常见且很棒。如果需要配置实例的许多属性,则比调用具有大量未命名参数的构造函数要好得多。通过提供在不同构建器方法中使用多个varargs参数的可能性,它也更灵活。此外,值在结果类的实例中仍然是最终的。另一个优点是某些参数可能是可选的,并且更方便的是不调用相应的构建器函数而不是将null传递给类本身的构造函数或创建多个构造函数,具体取决于您可能想要的参数通过。

让我们看一下JavaScript中的这四个参数和替代选项对象:

  1. 没有未命名的参数。在options对象中,每个参数都有一个名称。您只需使用.source("abc")
  2. ,而不是source: "abc"
  3. JavaScript中的Varargs非常简单。但是对于options对象来说它们是不必要的,因为你可以在options对象中传递一个数组。使用files: [ 'a', 'b', 'c' ]代替files('a', 'b', 'c')
  4. 您仍然可以使用options对象使属性为“final”,只是将它们配置为不可写。但是,JavaScript中不存在“最终字段”的概念。无关紧要,即使使用选项对象,仍然可以创建不可变对象。
  5. 简单:不要通过选项对象传递选项,而不是不调用函数。
  6. 在我看来,构建器模式比选项对象具有 no 优势 - 至少在JavaScript中是现代的。