为什么Jorge Ortiz advise to avoid method overloading?
m0rkklqb1#
重载使得将一个方法提升为一个函数变得有点困难:
object A { def foo(a: Int) = 0 def foo(b: Boolean) = 0 def foo(a: Int, b: Int) = 0 val function = foo _ // fails, must use = foo(_, _) or (a: Int) => foo(a) }
字符串不能有选择地导入一组重载方法中的一个。在尝试应用隐式视图以使参数适应参数类型时,出现歧义的可能性更大:
scala> implicit def S2B(s: String) = !s.isEmpty S2B: (s: String)Boolean scala> implicit def S2I(s: String) = s.length S2I: (s: String)Int scala> object test { def foo(a: Int) = 0; def foo(b: Boolean) = 1; foo("") } <console>:15: error: ambiguous reference to overloaded definition, both method foo in object test of type (b: Boolean)Int and method foo in object test of type (a: Int)Int match argument types (java.lang.String) object test { def foo(a: Int) = 0; def foo(b: Boolean) = 1; foo("") }
型它可以悄悄地使默认参数不可用:
object test { def foo(a: Int) = 0; def foo(a: Int, b: Int = 0) = 1 }
型就个人而言,这些原因并不能迫使您完全避免过载。我觉得我错过了一些更大的问题。
最新
证据越来越多。
scala> object O { def apply[T](ts: T*) = (); def apply(f: (String => Int)) = () } defined object O scala> O((i: String) => f(i)) // oops, I meant to call the second overload but someone changed the return type of `f` when I wasn't looking...
型
nimxete22#
Gilad和Jason(retronym)给予的理由都是尽可能避免过载的非常好的理由。Gilad的理由集中在为什么重载在一般情况下是有问题的,而Jason的理由集中在为什么它在其他Scala特性的上下文中是有问题的。对于Jason的列表,我想补充一点,重载与类型推断的交互很差。请考虑:
val x = ... foo(x)
字符串x的推断类型的更改可能会改变调用的foo方法。x的 * 值 * 不需要改变,只需要改变x的推断类型,这可能会因为各种原因而发生。基于以上给出的所有原因(还有一些我肯定忘记了),我认为应该尽可能少地使用方法重载。
x
foo
pengsaosao3#
我认为这个建议并不是特别针对scala的,而是针对一般的OO(到目前为止,我知道scala应该是OO和函数式之间的最佳品种)。
覆盖很好,它是多态性的核心,也是OO设计的核心。
下面是an article,它很好地解释了我所说的“重载是混乱之源”,我认为这是不鼓励使用它的主要原因。这是针对java的,但我认为它也适用于scala。
ux6nzvsh4#
我最近写了一篇关于这个问题的博客:The Hidden Dangers of Method Overloading .我相信方法重载可能会对代码质量产生负面影响,因为在同一个名称下维护两个或更多的实现会产生隐藏的语义,这不可避免地导致误解和功能缺陷。
4条答案
按热度按时间m0rkklqb1#
重载使得将一个方法提升为一个函数变得有点困难:
字符串
不能有选择地导入一组重载方法中的一个。
在尝试应用隐式视图以使参数适应参数类型时,出现歧义的可能性更大:
型
它可以悄悄地使默认参数不可用:
型
就个人而言,这些原因并不能迫使您完全避免过载。我觉得我错过了一些更大的问题。
最新
证据越来越多。
更新2
更新3
型
nimxete22#
Gilad和Jason(retronym)给予的理由都是尽可能避免过载的非常好的理由。Gilad的理由集中在为什么重载在一般情况下是有问题的,而Jason的理由集中在为什么它在其他Scala特性的上下文中是有问题的。
对于Jason的列表,我想补充一点,重载与类型推断的交互很差。请考虑:
字符串
x
的推断类型的更改可能会改变调用的foo
方法。x
的 * 值 * 不需要改变,只需要改变x
的推断类型,这可能会因为各种原因而发生。基于以上给出的所有原因(还有一些我肯定忘记了),我认为应该尽可能少地使用方法重载。
pengsaosao3#
我认为这个建议并不是特别针对scala的,而是针对一般的OO(到目前为止,我知道scala应该是OO和函数式之间的最佳品种)。
覆盖很好,它是多态性的核心,也是OO设计的核心。
下面是an article,它很好地解释了我所说的“重载是混乱之源”,我认为这是不鼓励使用它的主要原因。这是针对java的,但我认为它也适用于scala。
ux6nzvsh4#
我最近写了一篇关于这个问题的博客:The Hidden Dangers of Method Overloading .我相信方法重载可能会对代码质量产生负面影响,因为在同一个名称下维护两个或更多的实现会产生隐藏的语义,这不可避免地导致误解和功能缺陷。