하나의 밑줄로 사용하지 않는 변수의 이름을 지정하는 것은 나쁜 습관입니까?


44

언어의 구문에서 사용되지 않는 변수의 이름을 지정해야하는 경우가 종종 있습니다 _.

내 생각에 이것은 혼란을 줄이고 코드의 의미있는 변수에 집중할 수있게합니다. 나는 그것이 "눈에 보이지 않고, 마음에 들지 않는"효과를 낼 수 있도록 눈에 거슬리지 않는 것을 발견했다.

이 작업을 수행하는 일반적인 예는 SQL에서 하위 쿼리의 이름을 지정하는 것입니다.

SELECT *
FROM
(
    SELECT *
    FROM TableA
    JOIN TableB
        ON TableA.ColumnB = TableB.ColumnB
    WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC

또 다른 예는 사용되지 않는 루프 변수입니다.

array = [[] for _ in range(n)] # Defines a list of n empty lists in Python

설명적인 이름이 코드에 아무 것도 추가하지 않는다는 느낌이들 때만이 기법을 매우 아예 사용하지 않으며, 어떤 의미에서는 기억할 이름을 더 추가하여 코드를 제거합니다. 어떤면에서는 varC # 의 키워드 와 비슷하게 보이며 드물게 사용합니다.

동료들이 동의하지 않습니다. 그들은 하나의 (알파벳) 문자 이름을 갖는 것보다 낫다고 말합니다 _.

내가 잘못? 이것을하는 것은 나쁜 습관입니까?


4
변수 이름은 정보 이론을 따라야한다고 생각합니다. 즉, 길이는 사용의 로그 상호 확률입니다 (일반 변수는 짧은 이름을 가짐). 알파벳 문자 하나가 잘못된 길로 보입니다.
dan_waterworth

2
@dan_waterworth 단일 또는 이중 문자를 테이블 별칭으로 사용하는 것은 SQL 스크립트에서 매우 일반적인 관행입니다. 일반적으로 많은 [table].[column]식별자 를 작성해야하므로 가독성을 높이는 데 도움이됩니다 [T].[column]. 물론 스크립트에 따라 다릅니다. 이와 같은 작은 선택은 완벽하게 훌륭하지만 스크립트가 매우 큰 경우 더 설명적인 이름을 사용할 수 있습니다.
CodexArcanum

5
차라리 "더미"를 사용하고 싶습니다. 언어에는 몇 줄 밖에 의미가없는 변수가 필요하기 때문에 거기에 있다고 비명을 지 릅니다. _ 인간에게는 잘 읽히지 않습니다. (내가 PERL을 싫어하는 이유 중 하나 - 나는 그것을 입력하거나 읽을 수 없습니다)
크리스 Cudmore

1
참고 사항 : 명명 한 것은 하위 쿼리가 아닌 파생 테이블 이 있다는 것입니다 .
Nick Chammas

2
c #의 var 키워드는 이러한 의미가 없으며 type이 유추되는 일반적인 변수 선언 일뿐입니다.
Francesco De Vittori

답변:


60

모든 이름은 의미가 있어야합니다. 경우 _기업이나 넓은 지역 사회에 잘 알려진 표준이고, 다음은 '중요하지 않습니다 이름 "과 같은 의미가있을 것입니다. 그렇지 않은 경우 나쁜 습관이라고 말할 수 있습니다. 특히 나중에 이름이 중요 할 수 있으므로 참조하는 내용에 대해 설명적인 이름을 사용하십시오.


13
+1. dummy좋을 것 joined_ab입니다.
Blrfl

5
+1, 사용하지 않는 변수에 '_'를 사용하는 규칙이 있습니다. 나는 그것이 좋은 컨벤션이라고 생각하지만 OP의 경우에 대한이 답변에 동의합니다. 이상적으로 코드베이스는 마치 한 사람이 작성한 것처럼 보일 것입니다.
dan_waterworth

20
"_"는 파이썬에서 잘 알려진 표준입니다.
Neil G

2
반면, 회사에서 Perl을 사용하는 경우 $ _를 사용하면 때때로 놀라운 동작이 발생할 수 있습니다.
Plutor

2
프롤로그에서 밑줄은 변수가 익명이므로 변수가 사용되지 않음을 나타냅니다.
Ivan

44

나는 그것이 허용되는 관행이라고 말하고 싶습니다. 이것은 내가 대다수를 잘못 생각하고 최근 프로그래밍 아이디어에 대한 지식을 업데이트 해야하는 드문 경우입니다. 많은 언어, 특히 Haskell 및 OCaml과 같은 ML 기반 기능 언어 _에서 "사용하지 않는"변수 로 사용하는 것이 매우 일반적 입니다. 명시적인 언어 지원을 제공하지 않는 Lua조차도 _규칙에 따라 자리 표시 자로 사용하도록 권장합니다 .

여러 언어 (Haskell, Lua 및 DI는 내 머리 위로 생각)는 밑줄로 시작하는 변수가 _사용하지 않는 변수를 가장 짧게 만드는 "사용하지 않은 로컬 변수"에 대한 컴파일러 경고를 생성하지 않는 규칙을 제공합니다 . 당신은 같은 것을 사용할 수는 _unused있지만 그것이 혼란 스럽습니다.


SQL의 특정 경우에는 SQL을 고려했으며 동료가 여기에 맞을 수 있습니다. 나는 일반적으로 테이블 별칭에 단일 대문자를 사용하고 종종 하위 선택에 R (esults)을 사용합니다. *테이블에서 결과 집합 변경이 예기치 않게 변경되기 때문에 selects 를 사용 하는 것은 매우 나쁜 일 이라고 생각합니다 . 따라서 일반적으로 선택한 열을 식별하기 위해 단일 문자 별칭이 필요합니다. 를 *사용하지 않으면 "사용하지 않은"이름이 필요하지 않습니다.
CodexArcanum

11
적어도 Haskell에서 엄격하게 말하면 _변수가 아닌 패턴입니다. 미묘한 차이이지만 (x, _, _) = ...같은 변수를 여러 번 바인딩하면 오류가 발생하는 것과 같이 여러 번 사용할 수 있습니다.
hammar

12

파이썬 _에서는 확실하게 받아 들일 수 있습니다. 그러나 gettextalias 와 충돌 할 수 있습니다 _().

다른 일반적인 규칙은 다음 dummy과 같습니다 unused. 단독으로 또는 접두사로.

일부 코드 분석 도구는 이러한 규칙을 알고 있으며 사용되지 않은 변수 경고를 발행하지 않습니다.

  • PyLint 에 대한 _또는dummy
  • 를 PyDev는 어떤 변수로 시작 _, unused또는dummy

2
또한 _파이썬에서 더미 변수를 사용 _하면 마지막 반환 값 과 충돌 합니다. 예를 들어, 통역사에서 5*51 행을 한다면 ; 그런 다음 2 행 _에 값이 25있습니다. 그러나 그런 다음을 설정하면 그 값 x,_ = (3,'not used')은 사용자가 마지막으로 반환 한 값 _이 아니라는 것을 알게됩니다 . 실제 코드에서 마지막 반환 값 으로 사용해서는 안됩니다 . 그러나 새로운 것을 시도 할 때 통역사가 종종 편리합니다. not useddel __
dr jimbob

4
음, _같은 마지막 반환 값은 작동 에만 대화 형 쉘에서.
vartec

루아도 마찬가지입니다. 사용 _ 표준 방법입니다
sylvanaar은

11

이 코드가 적용되는 생태계에 따라 다릅니다. _"더미 변수"/ "사용되지 않은 출력"을 나타내는 허용 된 표준 이라면 반드시 준수하십시오. 그렇지 않은 경우 무엇인지 찾아서 사용하십시오.

일부 프로그래밍 언어 (예 : Haskell)에는 정확히 언급 한 목적을 위해이 '특별한'식별자가 구문에 내장되어 있습니다.


5

_는 이미 일부 언어에서 본질적인 의미를 가지고 있습니다.

파이썬에서 :

9.6. 개인 변수 및 클래스 로컬 참조

링크 설명을 여기에 입력하십시오 . 파이썬 내부에는 객체 내부를 제외하고는 액세스 할 수없는“비공개”인스턴스 변수가 있습니다. 그러나 대부분의 Python 코드가 따르는 규칙이 있습니다. 밑줄 (예 : _spam)이 붙은 이름은 API의 비공개 부분 (함수, 메소드 또는 데이터 멤버인지 여부)으로 취급해야합니다. . 구현 세부 사항으로 간주되어야하며 사전 통지없이 변경 될 수 있습니다.

PEP 8 (Python 코드 용 스타일 가이드)에는 또 다른 언급이 있습니다.

설명 : 이름 지정 스타일

_single_leading_underscore : "내부 사용"표시가 약합니다. 예를 들어 M import *에서 이름이 밑줄로 시작하는 객체는 가져 오지 않습니다.

C #에서 :

일반적으로 공개 / 내부 속성을 가진 개인 변수를 표시하는 데 사용됩니다. 그러나 이러한 관행은 일반적으로 요즘 내려져있다 .

자바 스크립트에서 :

비표준 프로토 타입 확장을위한 접두사로 밑줄을 사용하는 underscore.js라는 라이브러리가 있습니다.

예:

var object = { some:'stuff' };
var newObject = _.clone(object);

내 요점으로 이끈다. 기존 자리 표시 자 변수 규칙에 문제가 있습니다.

var i, j, k, l; // iterator placeholders
var x, y, z, xx, yy, zz // value placeholders
var foo, bar, bas, fixx, buzz, qux, etc... // demonstration placeholders

이미 사용 가능한 공통 규칙이 많을 때 잘못 해석 할 수있는 사용자 지정 규칙을 사용하는 이유는 무엇입니까?


스칼라 : 와일드 카드 / 자리 표시 자 기호이지만 자리 표시 자로 한 번만 참조 할 수 있습니다 .
Rex Kerr

@RexKerr 재미있는. 원하는 경우 답변을 자유롭게 수정하십시오. 나는 스칼라에 익숙하지 않습니다.
Evan Plaice

의견이 있어야합니다. 스칼라를 사용하는 사람이라면 누구나 알고있을 것이며, 스칼라를 사용하지 않는 사람은 아마도 무언가를하지 말아야 할 이유의 맨 위에 스칼라 호환성이 없을 것입니다.
렉스 커

사용하지 않는 변수에 대해 "컨벤션"자리 표시 자 중 하나를 사용하면 먼저 "이 사람이 왜이 이름을 더 잘 명명하지 않았습니까?" 잠시 후 변수가 사용되지 않았기 때문에 발견했습니다.
igorsantos07

나는 완전히 동의한다. 내가 선호하는 것은 임시 변수에 대해서도 설명적인 이름을 지정하는 것입니다. 이 답변의 핵심은 왜 밑줄이 명명 규칙에 적합하지 않은지를 보여주는 것입니다. 많은 언어에서 기존 의미로 인해.
Evan Plaice

2

나는 그런 종류의 것을 위해 "더미"를 사용합니다. 또는 그냥 무언가를 테스트하고 있다면 "쓰레기": 변수가 무엇인지 설명하기 위해 변수의 이름을 지정하십시오. 그것들이 더미의 사용되지 않는 변수라면 그 이름을 지정하십시오.


0

나는 그것이 나쁜 습관이라고 생각합니다.

  • 코드에 보이지 않는 변수가 없어야합니다. 당신이 느끼면 당신은 아마 이유를 논의 할 수 있습니다.

  • Go 언어는이 키워드를 사용하여 변수가 함수의 여러 반환 값 중 하나의 대상이 아님을 나타냅니다. 언어가 여러 번 반환되지 않으면 필요하지 않습니다. _를 표준 언어 표기법으로 사용하는 언어를 사용하는 날에는 네이밍 규칙이 손상 될 수 있습니다.

(나는 파이썬을 모른다 :이 구조는 정말로 필요한가?)


2
여러 반환 값을 필터링하는 데 사용하면 더미 함수 인수에도 사용됩니다. 사실, 둘 사이에 큰 차이가 아니다 : 패턴 매칭 기능 언어, 당신이 쓸 수 있습니다 let (a,b,_) = f(x,y,z)단지뿐만 아니라 let f(x,y,_) = (g(x),h(x),g(y)), 또는 무엇 이건. — 그리고 그렇습니다. 함수의 유일한 정의가 아니라 다형성 함수 또는 대체 패턴 일치 정의가있는 더미 매개 변수를 갖는 것이 종종 유용합니다.
leftaroundabout

1
당신의 두 번째 요점은 당신의 요점과 모순됩니다 : Go에서, 그것은 본질적으로 "나는이 값을 사용하지 않습니다"와 같은 의미입니다.
Casey Kuball

0

구문 상 유효 할 수 있으며 표준의 일부로 괜찮을 수 있습니다.

그 말로 누군가에게 코드 검토에서 변경하도록 요청하는 것입니다. 또한 코딩 표준에 넣지 않았으며 기존 표준에서 제거하려고 시도했습니다. 읽기가 더 어렵고 의미가 없습니다.


0

나는 그것이 틀렸다고 생각한다.

1) 픽셀이 많지 않아보기가 어렵습니다.

2) 둘 이상인 경우 _어떤 것을 알고 있습니까? -또는 새로운 개발자가 '규칙을 따랐으며'범위 내에서 극도로 지역적으로 사용하고 있습니까?

3) 도움이되지 않는 연습입니다. 단일 문자 변수 이름을 사용하는 것은 너무 오래된 학교입니다 (예 : 나의 원래 교육!). 나는 그들을 볼 것이다 ... 그리고 코드가 무엇을하는지 말을 추가 한 주석을 보아라. 그것은 오늘날 세계에서 나쁜 습관이다. 프로그래밍 변수 나 코드에 익숙하지 않더라도 모든 사람이 영어처럼 거의 "읽을"수 있도록 긴 변수 이름을 가능한 많이 사용합니다. 1 개의 문자 이름을 사용하는 것은 오래된 코드와 나이든 프로그래머 (나를 포함하여)에게 매우 일반적인 관행이지만 괜찮지는 않습니다.


9
"당신이하는 일을 알고 어떻게" 그렇게하지 : 정확히 지적이야, 당신이 하지 않는 변수를 사용합니다. 따라서 _이미 외부 범위에서 사용 되는지 여부 는 중요하지 않습니다 . 그런 다음 그 그림자는 (또는 그런 경우에 당신의 언어가하는 것) 어둡게 될 것이지만, 실제로 그들 중 어느 것도 사용되지 않습니다.
leftaroundabout

0

네임 스페이스 충돌을 피하고 디버깅을 허용하려면 변수 이름이 유일한 단서 인 경우 "joined_ab_unused"라고 부르는 것이 좋습니다.

Birfl에서 영감을 얻었습니다.


0

예, 두 가지 이유로 나쁜 습관입니다.

  1. 사용하지 않는 변수에 밑줄을 붙이는 것은 널리 인정되지 않는 표준입니다. "시작되지 않은"무시 될 것입니다.
  2. 일부 사람들은 개인 멤버 변수 앞에 밑줄을 붙이는 것을 보았습니다. 표준은 그러한 사람들을 크게 혼란스럽게 할 것 입니다.

0

당신이하려는 것은 쓸모없는 무언가의 이름을 강요하는 문제가없는 더 좋은 SQL 버전으로 코딩하는 것입니다.

밑줄은 거의 보이지 않으므로 해당 언어로되어있는 것처럼 보입니다. 공백 만 식별자로 사용할 수 있다면 완벽할까요?

그러나 당신은 다른 언어로되어 있지 않으며, 당신이하고있는 일은 언어 확장을 만드는 확실한 방법이 아닙니다.


0

언어에 따라 다릅니다. 에서 자바 , 그래이, 나쁜 및 코드에 추가 할 위험 추세 할 수 있습니다 때문에 크게 그들이 자바 변수 명명 규칙의 외부에 있기 때문에 사용 반사, 아주 잘 밑줄을 처리하지 않는 도구를 제공합니다. 에서 파이썬 ,이 또한 나쁘지하지만 나쁜 같습니다. 에서 Clojure에 자사의 100 % 좋아, 사실, 그 관용적는하자 문에 장소 소지자 _의를 사용합니다.

각 언어에는 고유 한 구문과 관용구 세트가 있으므로 절대 용어가 아닌 이러한 관용구의 관점에서 좋은 / 나쁜 점을 평가해야합니다.


5
나는 이것이 파이썬에서 나쁜 습관이라는 것에 동의하지 않습니다. 널리 이해되는 컨벤션
Daenyth

0

이것은 perl에서 좋지 않을 것인데, $ _ (때로는 _)를 특수 변수로 사용합니다.

일반적으로, 나는 _가 특정 언어 변수 인 것처럼 보이기 때문에 멀리 떨어져 있습니다. 내가 당신의 코드를 본다면, 나는 그것이 더미라는 것을 깨달을 때까지 _가 무엇인지 찾는 문서에있을 것입니다. DUMMY, $ DUMMY에 문제가 없습니다.


0

주어진 언어 또는 프레임 워크에서 다른 용도로 많이 사용하지 않는 것이 확실하지 않으면 var 시작 부분에서 밑줄을 피하십시오. 예를 들어, 파이썬에서 이중 밑줄은 마술 var를 나타내는 경향이 있습니다. JQuery 및 기타 JS 라이브러리에서 단일 밑줄은 네임 스페이스 덮어 쓰기에 대한 대체 변수를 나타내는 경향이 있습니다. 또한 포함 파일을 처리하는 데 사용되는 이름 지정 규칙으로, var 형식의 포함 코드를 처리하는 경향이 있습니다.

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