【问题标题】:named parameters vs type-safe builder pattern命名参数与类型安全的构建器模式
【发布时间】:2014-03-20 14:54:41
【问题描述】:

我是一个 scala 新手,我想知道构建器模式是否像 http://blog.rafaelferreira.net/2008/07/type-safe-builder-pattern-in-scala.html 中描述的那样 在scala >= 2.8 中有一些用法。

使用命名参数和默认参数,我可以声明哪些参数是强制性的(不给它们默认值),我可以按我想要的任何顺序传递构造函数参数(通过使用命名参数)。

那么拥有builder有什么好处吗?

【问题讨论】:

  • 我相信还是有用的。如果您通读整个教程,您会看到该模式的高级特性,例如基数约束。此外,编写一个在一次调用中提供所有参数的怪物表达式有时会很不方便。最后,一旦您将默认形式参数放入方法中,一些限制就会生效(例如,不允许重载该方法)。
  • (我错过了五分钟的编辑截止日期,所以...)如果您有多个相同类型的默认参数,那么遗漏任何一个都可能会模棱两可(原语–尤其是boolean–和无处不在的类型,如String 似乎是最常重复的)。
  • @RandallSchulz 显然,一个人获得了一定的声誉和地位,不再觉得有必要发布赞成的答案。 SO 应该为增加的 cmets 提供小数点,就像银行账户跟踪小数便士的方式一样。
  • @RandallSchulz 是的,但如果我总是通过传递命名参数来使用构造函数,我认为你提到的问题不存在。

标签: scala


【解决方案1】:

构建器模式允许部分构造的对象(根据一些任意标准)。

例如,您可能有一个对象在启动时已部分初始化,但在使用前需要进一步参数化。

不可能在单个参数列表(或其列表)中表达这一点,除非其中一个 args 捕获了部分配置(哪种方式会破坏实用程序)。

【讨论】:

    【解决方案2】:

    我想要构建器模式的原因:

    1. consistency ,因为构造函数是方法并且方法可以与函数转换。

      • 严格函数 -> 部分应用函数或柯里化函数
      • 严格方法 -> N/A(在 Scala 中不允许,您需要将其转换为函数但会丢失参数信息。)
      • strict class -> 同上,或者使用builder模式部分应用构造函数。
      • 和部分应用类型,例如类型 State[S, A] = StateT[Eval, S, A]
    2. 1234563一个价值。
      给定 1,方法和类应该是一样的。
    3. 将建筑分离到不同的地方。 (类似于 2。)
    4. 缓存计算。检查这个答案https://stackoverflow.com/a/4916606/2130573

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多