2016-06-14 3 views
1

최근에 GHC의 -Wall 옵션이 켜졌습니다. 여기에는 -fwarn-name-shadowing이 포함됩니다. 제공되는 이론적 근거는 다음과 같습니다.화이버 이름 섀도 잉을 사용하는 가독성 균형

이 옵션을 사용하면 내부 범위 값이 외부 범위 값과 동일한 이름, 즉 내부 값이 외부 값을 음영 처리 할 때마다 경고가 표시됩니다. 이렇게하면 인쇄상의 오류를 발견하여 찾기 힘든 버그가 될 수 있습니다.

그러나 실제로 내가 아직 어떤 버그를 잡았하지 않은,하지만 난이 훨씬 더 어색 그것을 해결하기 위해 내 기능에서 변수 이름을 만들었습니다 . 약식 예 :

-- General method for parsing a paragraph. 
paragraph :: Parser Node 
paragraph = undefined -- omitted for brevity 

blockquote :: Parser Node 
blockquote = lookAhead (char '>') 
      >> Blockquote 
      <$> paragraph' `sepBy1` blankLine 
    where 
    -- Avoid shadowing a `paragraph` method defined above. 
    -- This one is more specialized and relevant only in 
    -- this context. 
    paragraph' = Paragraph <$> body 

이 나에게 조금 냄새 나는 것 같다,하지만 훨씬 더 다른 경우가 - 예를 들어 내가 remainder'sections'를 사용하여 remaindersections을 그림자 피 결국 하나 개의 기능을 가지고 있고, 중첩 된 where 절에서 나는 더 그림자를 피하기 위해 rs으로 곧장 간다. 그리고 나는 -fwarn-name-shadowing이 밸런스 네트 포지티브에 있는지 궁금해하고있다. 이러한 어색한 이름의 간접적 인 지시없이 일부 섀도 잉을 피하기 위해 할 수있는 리팩토링이 있다고 생각합니다.하지만 항상 가능한 것은 아닙니다.

나는 약간의 그림자를 허용하는 것이 더 낫지 만, 대신 냄새를 없애기 위해 리팩터링하는 예를 찾고 있어야합니까? 나는 후자를 의심하지만, 나는 확실하지 않다.

+0

나도 때로는 괴롭다. 내가 정말로 원하는 것은 실수로 * 그림자가있는 이름에 대해 컴파일러가 마 법적으로 경고하도록하는 것입니다. 그러나 의도적으로 이름을 재사용 할 때가 아닙니다. 마법없이 작동 할 수있는 유일한 방법은 내가 그림자를 고의적으로 마킹하는 경우입니다. 나는 아마 두뇌가 죽지 않고 동일한 범위에서 같은 이름을 가진 두 가지 다른 것을 참조하려고하지 않도록 그림자 이름의 * uses *를 표시해야합니다. 그러나 사물에 붙이는 것보다 통어론 적 오버 헤드가 적은 허용 된 그림자를 표시하는 방법을 생각하는 것이 어렵습니다! – Ben

+1

나는 바인딩의 이름을 변경하여 경고를 항상 고집하지만, 개인적인 취향의 문제라고 생각합니다. 나는 코드의 중간에 식별자를보고 최상위 바인딩이 있다면 정말로 그 코드를 인식합니다. 게다가, 보조 함수를 정의 할 때'xs'와 같은 몇몇 인자 이름을 재사용하기 쉽고 두 바인딩을 혼동합니다. 경우에 따라 실수로 재귀 바인딩을 작성할 수도 있습니다. 그래도 가끔은 경고가 약간 짜증나는 것을 알 수 있습니다. – chi

+2

@ben, 나는 접두사가'_'으로 시작한다고 경고하지 않을 것이므로 그 역시 옵션이 될 수 있다고 생각합니다. 그런 식으로'foo'를 두 번 다시 쓰고 싶다면'foo','foo','foo' 대신'_foo','_foo','_foo'를 할 수 있습니다. – wincent

답변

1

충분히 공정하게, 나는 단지 두 개의 다른 이름을 찾는 것이 어려운 곳에서 비슷한 문제를 추가합니다. 나는 여전히 우리에게 코드 냄새를 맡기고 다른 의미있는 이름을 찾으려는 시도가 먼저 고려되어야한다고 생각합니다.