1

我有将 [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 设计的角度来看,哪种方法更好?

4

2 回答 2

4

myMethod正确的问题是:使用 a是否有意义Option

从 的角度来看myMethod,也许它只适用于这种情况,如果没有地图可以使用,Map则调用者有责任不调用。myMethod

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

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

于 2014-10-09T19:37:41.700 回答
3

Map.empty是一种廉价的操作,因为它是不可变的。因此,使用它几乎没有开销。因此,保持简单,要求一个Map没有任何包装的。

于 2014-10-09T19:38:09.250 回答