我的样本就像这样简单:
def func(arg1: Long, arg2: Long, arg3: String) {
privateFunc1(arg1);
privateFunc2(arg1, arg2, arg3);
}
这是一个重载函数,也可以使用
def func(arg1: Long, arg2: Long, arg3: File) {
privateFunc1(arg1);
privateFunc2(arg1, arg2, arg3);
}
因为您可能已经猜到privateFunc2已经过载,这就是两个函数都能正常工作的原因。
我可以通过使用函数组合来避免scala中冗余重复的代码吗? 什么是最佳做法?
谢谢!
答案 0 :(得分:2)
我想你可以尝试使用Either[String,File]
作为第3个arg。然后,您必须在privateFunc2
中进行匹配。代码可能如下所示:
def func(arg1: Long, arg2: Long, arg3: Either[String,File]) {
privateFunc1(arg1);
privateFunc2(arg1, arg2, arg3);
}
def privateFunc2(arg1: Long, arg2: Long, arg3: Either[String,File]){
arg3 match{
case Left(str) => //handle string case
case Right(file) => //handle file case
}
}
修改强>
但是,诚实地说,如果String
确实是File
的路径,那么设置私有函数只能使用File
输入,然后将公共函数重载为将String
和File
作为第3个参数,然后在采用String
的文章中,转换为File
并调用私有函数。这样做也可以保持相对简单。
答案 1 :(得分:2)
我认为重载让人感到困惑。重复使用相同的名称使得它看起来像代码类似,但func
在每种情况下都调用不同的方法,所以你也可以调用私有方法不同的东西。
如果privateFunc2
的两个版本确实相似,则可以进行转换/预处理,例如从File
到String
,反之亦然,或转换两者收藏?然后,您只有privateFunc2
的1个版本,func
的其中一个版本应用转换并将其转发到另一个版本,并且您已经消除了有两个版本的冗余。
我会远离Either
和隐式转换,因为如果你想要正确地执行它,你需要使用包装器类型(强烈建议不要在常见类型之间进行隐式转换,因为它可能会导致代码中的其他地方出现问题)无论如何,你只是推迟了不可避免的分支来处理每一个可能性,以及引入一堆样板。
tl; dr:拆分privateFunc2
所以它只需要1种输入类型。或保持原样。