2014-10-09 91 views
1

我有一個方法,將[Int,MyClass]的Map作爲參數。事情是這樣的:斯卡拉方法參數:選項的集合或默認值

myMethod的(someMap:地圖[詮釋,MyClass的])

然而,someMap可能並不總是存在(在Java世界中,並沒有在斯卡拉空)。 下列哪是從一個角度API點此方法的一個更好的設計:

  1. 在一個選項結束語: myMethod的(someMap:選項[地圖[中等,MyClass的] =無)

  2. 定義一個默認空映射: myMethod的(someMap:地圖[中等,MyClass的] = Maps.empty)

第一個選項看起來雅緻,但是它有一個具有增加的複雜性來包裝一張地圖(如果在Some()中和實現者中必須執行getOrElse來打開它。 第一個選項也使api的消費者清楚,地圖對象可能實際上不存在(無)

在第二個選項中,不需要進行環繞(在Some中)或解包,但每當沒有現有的Map對象時,必須實例化一個空容器。

此外,參數agains 1:Option本身是0或1項目的容器,Map也是一個容器(集合)。將容器包裝在另一個容器中設計好嗎?

從API設計的角度來看,哪一個更好?

回答

4

正確的問題是:myMethod能與Option一起使用嗎?

從視圖myMethod點,也許它只是作品Map在這種情況下,它是調用者的責任不叫myMethod如果沒有地圖的工作。

另一方面,也許myMethod做一些特殊的事情,如果沒有Map或者它是空的,那是該方法處理這種情況的責任。

所以沒有正確的答案,但正確的論點是,這樣的方法的責任是尊重。目標是在你的職能和職業之間有很高的凝聚力和較低的耦合度。

+0

感謝讓。所以任何放置在Map中的對象的存在或不存在都是數據驅動的,並且是確定的運行時間。因此,如果我們使用Option,它會向API的使用者明確說明Maps可能是None。 btw的方法應該在不存在Map的情況下起作用。 Option.foreach/maps會處理這個問題嗎? – exifguy 2014-10-09 19:48:56

3

Map.empty是一個cheap operation,它的結果是不可變的。所以使用它幾乎沒有開銷。因此,保持簡單,請求Map沒有任何包裝。