我可以避免使用scala重新输入两个非常相似的函数吗?

时间:2013-07-02 13:05:43

标签: scala functional-programming

我的样本就像这样简单:

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中冗余重复的代码吗? 什么是最佳做法?

谢谢!

2 个答案:

答案 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输入,然后将公共函数重载为将StringFile作为第3个参数,然后在采用String的文章中,转换为File并调用私有函数。这样做也可以保持相对简单。

答案 1 :(得分:2)

我认为重载让人感到困惑。重复使用相同的名称使得它看起来像代码类似,但func在每种情况下都调用不同的方法,所以你也可以调用私有方法不同的东西。

如果privateFunc2的两个版本确实相似,则可以进行转换/预处理,例如从FileString,反之亦然,或转换两者收藏?然后,您只有privateFunc2的1个版本,func的其中一个版本应用转换并将其转发到另一个版本,并且您已经消除了有两个版本的冗余。

我会远离Either和隐式转换,因为如果你想要正确地执行它,你需要使用包装器类型(强烈建议不要在常见类型之间进行隐式转换,因为它可能会导致代码中的其他地方出现问题)无论如何,你只是推迟了不可避免的分支来处理每一个可能性,以及引入一堆样板。

tl; dr:拆分privateFunc2所以它只需要1种输入类型。或保持原样。