2013-08-04 2 views
3

스칼라 - 스타일 가이드는 Unit를 사용할 때 항상 명시 적으로 반환 형식이 기대 정의하는 것이 좋습니다 :스칼라 메서드 def가 명시 적으로 정의 된 반환 유형을 사용해야하는시기는 언제입니까?

방법은 다음 패턴에 따라 선언해야

:

def foo(bar: Baz): Bin = expr 

이 규칙의 유일한 예외

는 방법이 있습니다 어떤 단위를 반환합니다. 이러한 방법은 실수로 혼란 반환 형식을 피하기 위해 스칼라의 문법 설탕을 사용한다 : 해설자는 지적

def foo(bar: Baz) { // return type is Unit 
    expr 
} 
+2

엄마 Odersky는 절차 구문을 피할 것을 권장합니다. [Keynote-Scala with Style chapter 45] (http://www.parleys.com/play/51c1994ae4b0d38b54f4621b/chapter45/about)를 참조하십시오. 또한 [이 답변] (http://stackoverflow.com/a/17502581/406435)의 주석에있는 토론을 참조하십시오. – senia

+1

@senia ok, 프로 시저 구문이 나쁘다면 무엇이 더 나은가? 반환 단위로 'Unit'을 명시 적으로 선언하거나 생략합니다 (컴파일러는 유형 자체를 유추 할 것입니까?). 다른 유형과 마찬가지로 – MyTitle

+0

입니다. 일부 가이드에서는 public 메서드에서 형식을 명시 적으로 지정하는 것이 좋습니다. 나는 그것이 주로 의견에 근거한 질문이라고 생각한다. – senia

답변

1

으로, 마틴 오더 스키가 연결 기조이에 대해 설명합니다. 물론, "해야 할 때 ..."가 말하듯이, 이것은 궁극적으로 문체적인 질문이므로, 단지 의견을 낼 수 있습니다.

두 가지 : (1) 유형 예/아니오 및 (2) 프로 시저 구문 예/아니오.


(1) 물론 구현되지 않은 순수 API의 경우 반환 유형을 지정해야합니다. 나는 이것을 동시에 구현하는 어떤 메소드 구현으로 확장 할 것이다. API. 즉, 메서드가 특성을 구현하지 않는 경우 컴파일러에서 반환 형식이 다를 때 오류가 발생하는 경우 메서드에 주석을 추가해야합니다. private 및 local 메서드는 첫 번째 눈금에서 유형을 알아내는 것이 어렵거나 (예 : 재귀 메서드 호출에서) 강요된 경우가 아니면 반환 유형을 유추하는 것이 좋습니다. 명시 적 리턴 유형을 제공 할 경우 컴파일은 입니다.

"쉬운" 반환 형식의 짧은 메서드가있는 경우에는 추측이 좋다고 생각합니다. 전의.

trait Foo { 
    def sqrt(d: Double) = math.sqrt(d) 

    def toString = "Foo" 

    def bar = new Bar(123) 
} 

(그러나 이미 누군가는 math.sqrtDouble 반환 분명하지 않을 수 있음을 주장 할 수 있습니다).

더 자세한 있지만, 당신은 코드를 더 읽기 쉽게 그리고 당신은 피 (A) 가 구현 또는 하위 유형에 대한 정보를 유출 곳 슈퍼 형 sufficies :

trait Before { 
    def bar = new BarImpl 

    def seq = Vector(1, 2, 3) 
} 

trait After { 
    def bar: Bar = new BarImpl 

    def seq: IndexedSeq[Int] = Vector(1, 2, 3) 
} 

와 (B)를 잘못된 수집 유형의 구조 유형에서 당신이 의도하지 않은 실수 돌려 무언가를 피하기 등


(2) 최근에 나는 프로 시저 구문을 선호 때까지, 그러나 새로운 토론과 많은 사람들이 불만을 표명 한 후에 나는 명시적인 : Unit = 주석을 사용해 보았습니다. 지금은 더 좋아합니다. 프로 시저 구문을 보면 메서드에 부작용이 있다는 것을 분명히 알 수 있지만 실제로는 : Unit =이 그 표시를 분명히 나타냅니다.

trait Before { 
    private var _x = 0 
    def x: Int = _x 
    def x_=(value: Int) { _x = value } 
} 

I 신체가 if 시작 대부분의 경우, 패턴 match, synchronized 블록 또는 future 발생하는 결과

trait After { 
    private var _x = 0 
    def x: Int = _x 
    def x_=(value: Int): Unit = _x = value // if double = confuses you, use new line? 
} 

대 렉션 map : 또한 종종 중괄호 양은 제거 표현 등, 이러한 경우 중괄호를 제거 좋은 :

trait Before { 
    def connect()(implicit tx: Tx) { 
    values.foreach { case (x, _) => 
     x.changed += this 
    } 
    } 
} 

trait After { 
    def connect()(implicit tx: Tx): Unit = 
    values.foreach { case (x, _) => 
     x.changed += this 
    } 
} 
관련 문제