【问题标题】:Scala Method Argument: Option of Collection or Default ValueScala 方法参数:集合或默认值的选项
【发布时间】:2014-12-04 20:33:26
【问题描述】:

我有一个将 [Int, MyClass] 的 Map 作为参数的方法。像这样的:

myMethod(someMap : Map[Int, MyClass])

但是,someMap 可能并不总是存在(Java 世界中为 null,Scala 中为 None)。 从 API 的角度来看,以下哪项是该方法的更好设计:

  1. 将其包装在一个选项中: myMethod(someMap : Option[Map[Int, MyClass]] = None)

  2. 定义默认空地图: myMethod(someMap : Map[Int, MyClass] = Maps.empty)

第一个选项看起来很优雅,但是它具有额外的复杂性,即必须在 Some() 中包装 Map(如果不是 None)并且在实现者中必须执行 getOrElse 来解包它。 第一个选项也让 api 的使用者清楚,地图对象可能实际上并不存在(无)

在第二个选项中,不必进行包装(在 Some 中)或展开,但每次没有现有 Map 对象时都必须实例化一个空容器。

另外,反对 1 的参数:Option 本身是一个包含 0 或 1 个项目的容器,而 Map 也是一个容器(集合)。将一个容器包裹在另一个容器中是不是很好的设计?

从 API 设计的角度来看,哪种方法更好?

【问题讨论】:

    标签: scala scala-collections scala-option


    【解决方案1】:

    正确的问题是:myMethodOption 一起工作有意义吗?

    myMethod的角度来看,也许它Map一起工作,在这种情况下,调用者有责任不调用@987654325 @如果没有地图可以使用。

    另一方面,如果没有Map 或者它是空的,那么myMethod 可能会做一些特别的事情,这是处理这种情况的方法的责任。

    所以没有正确的答案,但正确的论点是尊重方法的责任。目的是在函数和类之间实现高内聚和低耦合。

    【讨论】:

    • 感谢琼。因此,要放入 Map 中的任何对象的存在与否都是数据驱动的,并且是在运行时确定的。因此,如果我们使用 Option,那么 API 的使用者就会清楚地知道 Maps 可能是 None。顺便说一句,如果不存在 Map,该方法应该会有所不同。 Option.foreach /maps 会解决这个问题?
    【解决方案2】:

    Map.emptycheap operation,因为它是不可变的。因此,使用它几乎没有开销。因此,请保持简单,要求Map 不带任何包装。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2012-05-26
      • 2011-08-04
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多