2015-05-01 132 views
0

在我是一个代码审查中,我们注意到,在代码中有很多的过程中有一个朋友有一个友好的交谈:最佳方式

unknownTypeVal match { 
    case asStr: String => //DO SOMETHING FOR STRING 
    case asInt: Integer => //DO SOMETHING FOR Integer 
    case asMyOwnClass: MyOwnClass => //DO SOMETHING FOR MyOwnClass 
} 

问题是最初由返回AnyOption的方法生成,并且无法将其删除,因为我们将库用作XPath和JSONPath,它们为所提供的路径返回AnyOption的实例。

我并不想进入的“偏爱”讨论,这是不是一种意见的问题,我想知道,无论是标准的斯卡拉,或影响任何其他组织最好定义,做这种我们认为这个功能可以简化为一个函数调用,这个函数调用一个包含函数映射的方法,并基于“某事”(类的名字或者其他的东西)我不知道现在)决定如何处理这样的参数:

process(myAnnonimusVal: Any) = myMapOfFunct(myAnnonimusVal.getClass) //and based on the function that this will return execute such function pasing myAnnonimusVal 

什么是鼓励开发者斯卡拉斯卡拉或社区

+0

为什么你认为这不是一个有效的方式来做到这一点,甚至有组织的方式做你在你的文章中提到的?即使在你的myMapOfFunct中,你也不得不在你的case语句中。只有你会做的是避免代码重复。 –

+3

您所希望的权威答案不存在,任何答案都将成为意见。我自己的是:如果你被一个'任何'返回的API卡住了,就把你的鼻子包裹在_something_中,这会给你有意义的类型,然后忘记它曾经发生过。 –

+1

另外'任何'和'选项'都有很少的共同之处 - 那部分问题并不清楚。 –

回答

1

原则上,match是执行代码的最简洁的方式,条件是将Any类型与其他类型匹配。任何if-else,instanceOf等链都必然会变得更麻烦,更不优雅。一个可能的例外情况是,您可以知道知道实际类型是什么,并且可以相应地采取行动,可以允许直接投射。

这就是说,如果你发现自己做相同比赛很多次了,你还不如封装的比赛,以避免重复的代码。 A partial function可能正是您在此想到的。