1

我的示例很简单:

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

谢谢!

4

2 回答 2

2

我想你可以尝试使用Either[String,File]第三个参数。然后,您必须在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
  }
}

编辑

老实说,如果Stringa 真的是一条通往 a 的路径File,那么将私有函数设置为仅与File输入一起工作,然后重载公共函数以将StringFile作为第三个参数,然后在接受 a 的那个中String,转换为aFile并调用私有函数。这也很有效,并且使事情变得相对简单。

于 2013-07-02T13:11:46.360 回答
2

我认为重载有点让人困惑。重复使用相同的名称使代码看起来很相似,但func在每种情况下都调用了不同的方法,因此您不妨将私有方法称为不同的东西。

如果这两个版本privateFunc2真的很相似,是否可以进行转换/预处理,例如从FileString或反之亦然,或者将两者都转换为集合?然后,您只有 1 个版本privateFunc2,其中一个版本func应用转换并将其转发给另一个版本,并且您消除了拥有 2 个版本的冗余。

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

tl; dr:拆分,privateFunc2因此只需要 1 种输入类型。或者保持原样。

于 2013-07-02T15:13:09.913 回答