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


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.