Scala方法参数:集合或默认值的选项

时间:2014-10-09 19:27:31

标签: scala scala-collections scala-option

我的方法是将[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)

  3. 第一个选项看起来很优雅,但它增加了复杂性,必须在Some()中包装Map(如果不是None),并且实现者必须执行getOrElse来解包它。 第一个选项也让api的消费者清楚地知道地图对象可能实际上不存在(无)

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

    此外,参数再次1:选项本身是0或1项的容器,而Map也是容器(集合)。将容器包装在另一个容器中是否很好?

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

2 个答案:

答案 0 :(得分:4)

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

myMethod 的角度来看,也许只有Map一起使用,在这种情况下,调用者的责任不在于如果没有可以使用的地图,请致电myMethod

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

所以没有正确的答案,但正确的论点就是尊重方法的责任。目的是在你的功能和类之间保持高内聚和低耦合。

答案 1 :(得分:3)

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