복붙노트

[SCALA] 왜 "메소드 오버로딩을 피하기?"

SCALA

왜 "메소드 오버로딩을 피하기?"

왜 호르헤 오티즈는 메소드 오버로딩을 피하기 위해 조언을합니까?

해결법

  1. ==============================

    1.오버로드는 함수에 방법을 들어 올려 그것을 좀 더 열심히합니다 :

    오버로드는 함수에 방법을 들어 올려 그것을 좀 더 열심히합니다 :

    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 
    }
    

    개별적으로, 이러한 이유는 완전히 과부하를 피하는 당신을 강요하지 않습니다. 나는 몇 가지 큰 문제가없는 것 같은 느낌.

    최신 정보

    증거는 최대 적재된다.

    업데이트 2

    UPDATE 3

    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...
    
  2. ==============================

    2.길 라드와 제이슨 (retronym)를 제공하는 이유는 가능하면 과부하를 방지하기위한 모든 아주 좋은 이유가 있습니다. 제이슨의 이유는 다른 스칼라 기능의 맥락에서 문제가 이유에 초점 반면 길 라드의 ​​이유는, 일반적으로 문제가 왜 오버로드에 초점을 맞 춥니 다.

    길 라드와 제이슨 (retronym)를 제공하는 이유는 가능하면 과부하를 방지하기위한 모든 아주 좋은 이유가 있습니다. 제이슨의 이유는 다른 스칼라 기능의 맥락에서 문제가 이유에 초점 반면 길 라드의 ​​이유는, 일반적으로 문제가 왜 오버로드에 초점을 맞 춥니 다.

    제이슨의 목록에, 나는 형식 유추와 가난이 과부하 상호 작용을 추가합니다. 치다:

    val x = ...
    foo(x)
    

    x의 추론 유형의 변화는 호출되는 어떤 foo는 방법을 변경할 수 있습니다. x의 값은 모든 종류의 이유에 대해 일어날 수있는 X의 단지 추론 유형을 변경할 필요가 없다.

    주어진 이유 (그리고 내가 잊고 확신 몇 가지 이상), 내가 생각하는 모든 메서드 오버로드는 가능한 한 아껴서 사용해야합니다.

  3. ==============================

    3.나는 조언이 특히 스칼라을 위해 의미되지 않는다 생각하지만, 일반적으로 OO을 위해 (지금까지 내가 스칼라는 최상의 OO와 기능 사이에 있어야하는데 알고있다).

    나는 조언이 특히 스칼라을 위해 의미되지 않는다 생각하지만, 일반적으로 OO을 위해 (지금까지 내가 스칼라는 최상의 OO와 기능 사이에 있어야하는데 알고있다).

    재정은 다형성의 핵심이고 OO 디자인의 핵심입니다, 괜찮습니다.

    반면에 오버로드 더 문제입니다. 방법은 과부하로 정말 호출되는 방법을 분별하기 어렵다 그것은 참으로 혼란의 자주 소스입니다. 오버로드가 정말 필요한 이유 정당화는 거의도 없다. 문제는 대부분의 시간은 다른 방법으로 해결 될 수와 내가 오버로드가 냄새 동의합니다.

    여기에 잘 내가 함께 무엇을 의미하는지 설명하는 글이다 내가 낙담 왜 주요 이유라고 생각합니다, "오버로드 혼란의 근원이다". 그것은 자바위한거야하지만 난 그것뿐만 아니라 스칼라에 적용 생각합니다.

  4. from https://stackoverflow.com/questions/2510108/why-avoid-method-overloading by cc-by-sa and MIT license