2011-08-11 3 views
5

쉐도우 변수가 너무 위험하기 때문에 사용하는 것이 좋습니다. 스칼라가 왜이 언어 구조를 지원합니까? 거기에 대한 몇 가지 강력한 이유가 있어야하지만, 나는 그것을 찾을 수 없습니다.스칼라가 왜 그림자 변수를 지원합니까?

+1

나는 똑같은 것에 대해 궁금해했습니다. 오데 스키 (Odersky) 외 다수는 자바를 거치지 않고 간단히이 문제를 다루었 다. – laher

+0

오스터스키 (Odersky) 씨는 특정 언어 구성에 대한 결정을 내리는 동기가 있다고 생각합니다. :) –

+0

:) 충분히 공평합니다. 그는 컴파일러 경고만으로도 충분하다고 생각했다. 나는 scalac이 컴파일러 옵션을 취한다는 것을 알 수있다. – laher

답변

20

변수, 메서드 또는 형식이 그림자 다른 변수, 메서드 또는 내부 범위에서 선언 될 때 같은 이름의 형식이라고되어 ​​있기 때문에 외부를 참조 할 수 없습니다 -scope 엔티티를 정규화되지 않은 방식으로 (때로는 전혀) 사용하지 마십시오. Java와 마찬가지로 Scala는 섀도 잉을 허용합니다.

내가 볼 수있는 한 가지 가능한 이유는 스칼라에서 중첩 된 스코프가 많고 (Java 또는 C++과 비교하여) 상대적으로 짧기 때문입니다. 실제로 블럭은 표현이 예상되는 곳 어디에서도 시작할 수 있으므로 새로운 범위를 시작합니다. 따라서 내부 범위에서 섀도 잉 이름을 사용하면 평균적으로 선언에 가까워지고 모호하지 않게됩니다.

또한 인라인 클로저는 프로그래머가 이미 혼잡 한 범위에서 새로운 변수 이름을 필요로하는 경우가 있습니다. 섀도 잉을 허용하면 다른 이상한 이름을 발명하는 대신에 이미 사용 된 이름과 동일하더라도 충분히 유용한 설명이 포함 된 이름을 계속 사용할 수 있습니다 (예 : my, local, 또는 더 나쁜 경우 _ 또는 단일 - 레터 이름 ...

섀도 잉은 좋은 IDE의 경우 문제가되지 않으며 소스 코드에서 커서 아래의 변수 선언 및 참조를 강조 표시하십시오.

여기 그냥 내 두 센트 ...

+1

자세한 응답을 보내 주셔서 감사 드리며 제공하지 않은 알림을 보내 주셔서 감사합니다. 클로저 컨텍스트에서 가변 섀도 잉을 생각했습니다. 일부 개발자는 새로운 이름을 부여하는 대신 클로저의 범위에서 동일한 이름을 사용할 수 있습니다. 나는이 개발자들이 사용법을 좀더 편안하게 느낄 것이라고 생각한다. 그러나 숨겨진 위협이 아닌가? 짧은 범위 변수의 접두사가 완벽하지 않다고 나는 동의한다. 하지만 대부분의 경우 (특히 스칼라 초보자에게는) 코드를 더 쉽게 이해할 수 있습니다. 틀 렸으면 고쳐줘. –

18

나는 그림자 변수를 사용하기에 너무 위험하다고 생각합니다.

귀하는 원하는 것을 생각할 권리가 있습니다. 그러나 데이터, 연구 또는 이유를 제공하지 않았으므로 그 의견은 가치가 없습니다.

왜 스칼라가이 언어 구조를 지원합니까?

유용하기 때문에. 프로그래머는 범위 내의 일부 식별자가 이미 그것을 사용하고 있기 때문에 임의의 식별자 이름을 만들 필요가 없습니다.

와일드 카드 가져 오기가 더 유용합니다. 이는 제 3자가 사용중인 식별자를 추가했기 때문에 컴파일이 중단 될 가능성을 제거하기 때문입니다.

그럴만한 이유가 있지만 그럴 수는 없습니다.

왜 그럴만한 이유가 있습니까? 거기에 장점이 있으며, 단점이 없다면 (아무도 제시하지 않았습니다.) 충분합니다. 단점에 대한 답변에서

편집

내가 그 그림자의 특별한 경우라고해야 설명했다. 그림자는 또한 import 문 또는 중첩 된 package 문을 통해 가져 오는 모든 항목과 동일한 패키지에있는 모든 항목에 영향을줍니다.

는 이제 몇 가지 예를 보자 : 매우 성가신 언어로 만들 것

// Not allowed, because it shadows List 
import java.util._ 

class A { 
    // Not allowed, because it shadows this, hashCode, equals, toString 
    class B 
} 

합니다.

+1

쉐도우 변수의 위험은 초기 질문에서 너무 분명합니다. BTW ** 나는 진 필립 (Jean-Philippe)의 대답에 대한 논평에서 ** 그것에 대해 썼다. 그러나 특별히 당신을 위해 나는 반복 할 것이다. –

+4

누군가가 일부 범위에서 변수를 선언하고이 변수의 이름이 바깥 범위의 다른 변수와 동일한 경우 코드를 더 복잡하게 만듭니다. 이 변수들 각각의 의미를 추적하는 것이 훨씬 어렵습니다. 'Programming in Scala'의 훌륭한 인용문은 다음과 같습니다. "변수 이름이 중첩 된 범위에서 새로운 의미를 채택하기 때문에 이러한 코드는 독자에게 혼란을 줄 수 있습니다. 일반적으로 새롭고 의미있는 변수 이름을 선택하는 것이 좋습니다 바깥 쪽 변수를 쉐이드 (shadowing)합니다. " –

+0

@keykeeper 좋아, 나는 그 논점에 답을했다. –