Groovy에서 def를 언제 사용해야합니까?


23

나는 Groovy에서 잠시 동안 개발 해 왔으며 동적 캐스팅을 얼마나 자주 사용 해야하는지 궁금합니다 def. 내 동료는 내가 이해하지 못하는 방식으로 Groovy에 도움을주기 때문에 항상 사용해야한다고 생각합니다.

현재 메소드 반환 유형과 인수를 선언 할 때 어떤 객체를 가져 와서 뱉어 낼 것인지 의도적으로 진술하고 싶습니다 (코드 가독성을 위해 Java 배경에서 나옵니다).

String doSomething(String something){
    //code
}
// vs
def doSomething(def somthing){
    //code
}
// vs 
def doSomething(somthing){
    // code
}

그래서 내 질문은 그것이 언제 사용하는 것을 선호 def하는지 또는 항상 그것을 사용하는 것의 진정한 이점이 있습니까? (나는 Groovy에 대한 실용적인 옵션으로 질문에 적합하다고 생각했기 때문에 마지막 예제를 추가했습니다)


3
: 당신의 동료가 믿는 것을 여기를 참조하십시오 stackoverflow.com/questions/184002/... .
Remigijus Pankevičius

나는이 질문을하기 전에 실제로 그 질문을보고 대답했습니다. "대규모 스크립트에서 좋은 습관은 항상"def "키워드를 사용하여 이상한 범위 지정 문제가 발생하거나 원하지 않는 변수를 방해하지 않는 것입니다." 테드 날 레이드 어떤 유형을 생략하거나 스크립트에서 def를 사용할지 결정할 때 어떤 것이 좋을지 모르겠지만 메소드 리턴 유형 및 인수 유형을 선언하는 것은 어떻습니까? 좋은 습관은 무엇입니까?
PJT

1
좋아, 이제 네 요점이 보여 강력한 유형 대 동적 프로그래밍에 대한 질문입니다. 화염 전쟁으로 인해 피하려고하는 토론의 유형 :)
Remigijus Pankevičius

답변:


20

좋은 프로그래밍 (스크립팅조차도) 연습으로서 항상 변수에 대해 명확한 유형을 지정하는 것을 고려하십시오. def변수에 적용 가능한 명확한 유형이없는 경우에만 사용하십시오 .

OP는 Java를 알고 있기 때문에 유형을 지정하는 것과 다르지 않습니다 Object( 사소한 차이 가있는 것처럼 보입니다 ). 이 질문에 대한 대답은 다음과 같은 질문에 대답하는 것과 다르지 않습니다. "항상 ObjectJava 에서 유형을 사용하지 않는 이유 는 무엇입니까?"

유형에 대해 가능한 한 명확하게하면 버그가 발생할 가능성이 줄어들고 자체 문서화 역할을합니다. 반면, 의도적으로 동적 논리를 구현하는 경우 사용하는 def것이 의미가있을 수 있습니다. 그것은 실제로 Groovy의 가장 큰 장점 중 하나입니다. 프로그램은 필요에 따라 동적으로 또는 정적으로 유형을 지정할 수 있습니다! 게으름을 사용해야하는 이유는 아닙니다. def;-)

예를 들어이 메소드는 명확한 인수 유형과 반환 유형으로 의미가 있습니다.

// def val or Object val, opens up the possibility
// of the caller sending a non-numeric value 
Number half(Number val) {  
    val/2
}

이 방법은 유형에 적합하지만 def

// I'd let them pass an argument of any type; 
// type `Object` makes sense too
def getIdProperty(def val) {   
    if(val?.hasProperty('id')) {
        // I don't know the type of this returned 
        // value and I don't really need to care 
        return val.id            
    }
    else {
        throw new IllegalArgumentException("Argument doesn't have an 'id' property")
    }
}

-1

작성하는 코드를 다른 사람이 공용 API로 사용할 때마다 항상 강력한 타이핑을 선호하고 계약을 강화하고 인수 유형의 실수를 피하며 더 나은 문서를 제공하며 도움이됩니다. 코드 완성 기능이있는 IDE 코드가 개인용 메서드처럼 사용하기 만하거나 IDE가 형식을 쉽게 유추 할 수있는 경우에는 언제 입력 할 것인지 더 자유롭게 결정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.