한 글자 변수의 사용이 권장됩니까? [닫은]


13

Java에서 한 글자 변수의 사용이 권장됩니까? 코드 스 니펫 또는 자습서에서 종종 볼 수 있습니다. 코드를 읽기가 더 어려워 다른 프로그래밍 언어에서 사용되는 것을 보지 못하기 때문에 사용하는 것이 좋습니다.


3
예, 아니오 상황에 따라 달라집니다.
Zavior




1
항상 코드를 읽기 어렵게 만드는 것은 아닙니다. 예를 들어, 수학 방정식을 기반으로 코드를 구현할 때는 일반적으로 방정식에 사용 된 것과 동일한 변수 이름을 사용하는 것이 좋습니다. (의견은 원래의 방정식을 찾을 수있는 종이 / 텍스트를 가리 키거나 나와 같은 경우 LaTeX 코드를 포함하기도합니다.)
jamesqf

답변:


32

제대로 이름을 지정하는 것은 어렵습니다. 열심히. 다른 방법으로 보면 올바르게 명명 된 것이 중요하다는 의미로이를 취할 수 있습니다. (그렇지 않으면 이름을 지정하는 데 왜 노력을 기울였습니까?)

그러나 때로는 사물의 이름이 중요 하지 않은 경우가 있습니다. 그렇기 때문에 익명 함수 ( "lambdas")와 같은 것이 있습니다. 때로는 이름을 짓는 것이 가치가 없기 때문입니다.

단일 문자 (또는 매우 짧은) 변수 이름이 적절한 많은 예가 있습니다.

  • i, j, k, l루프 인덱스에 대한
  • k그리고 v지도에서 키와 값
  • n숫자 (예 :에서 Math.abs(n))
  • a, b, c임의의 개체 (예에서 max(a, b))
  • e일반 for each루프 의 요소
  • f 고차 함수의 함수
  • p 필터의 술어 함수
  • T, T1, T2, ... 형 변수
  • E 컬렉션의 엘리먼트 타입을 나타내는 타입 변수
  • R 함수의 결과 유형을 나타내는 유형 변수
  • excatch조항 의 예외
  • op 지도 또는 접기 작업
  • s복수를 나타내는 문자 를 추가하는 것 , 즉 모음 (예 : ns숫자 모음 xsys임의의 2 개의 일반 객체 모음)

다른 프로그래밍 언어에서 사용되는 것을 본 적이 없습니다!

하스켈, F #, ML, 루비, 파이썬, 펄, PHP, C #, 자바, 스칼라, 그루비, 부, 네 메르, D, Go, C ++, C, 당신은 이름을지었습니다.


5
-1 1 문자 변수 이름을 사용하면 프로그래밍이 지연됩니다. 때로는 게으른 괜찮습니다,하지만 당신이 점점하는 경우 kl너무 멀리의 루프 인덱스에 (당신이로 시작하는 많은 중첩 루프를하지 말았어야; 기능에 추출물을) . 개인적으로 함수 당 하나 이상의 1 글자 변수를 사용하지는 않지만 0으로 촬영합니다.
BlueRaja-Danny Pflughoeft

또한, l또는 len길이 및 위해 사용된다 arr(예 : 배열에 대해 for(var i=0; l=arr.length; i<l; i++)). 또한 함수를 참조 할 때 fn대신에 사용할 수 있습니다 f.
Ismael Miguel

4
@ BlueRaja-DannyPflughoeft 효율적인 프로그래밍이라고 생각합니다. Jorg는 단일 문자가 적절한 위치에서 확장 될 수있을 것입니다. 물론 어디에서가 아니라 솔직히 말해서 대부분의 프로그래머가 다르게 선을 그립니다. 루프 인덱스의 경우 의미있는 값을 가진 이름이 필요하지 않은 모든 코드는 불필요한 추출에 대해 멀티 레벨 중첩을 정당화하기에 충분히 간단하다고 주장 할 수 있습니다. 또한 넬슨이 초래할 수있는 범위 지정 문제를 피하기 위해 별도의 루프에서 사용될 수도 있습니다 .
Lilienthal

2
@Lilienthal : 코드는 읽기에 효율적이고 쓰기에는 효율적이지 않아야합니다. 일반적으로이 경우와 동일하지만 항상 그런 것은 아닙니다.
BlueRaja-대니 Pflughoeft

@ BlueRaja-DannyPflughoeft 모든 프로그램에 해당되는 것은 아니지만 Jorg의 제안에 문제가있는 것은 아닙니다. 으로 킬리언은 넣어 : "더 이상 아무것도 가능성이 의미가 더 분명하게, 그러나 읽을 훨씬 더 오래 걸립니다 수 없습니다." 그러나 이것은 아마도 개인적 취향과 스타일의 문제 일 것입니다.
Lilienthal

20

루프가 아무것도 계산하지 않는 경우

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

그렇다면 네가 사용할 수있는 최고의 이름입니다. 더 이상 아무것도 의미를 더 명확하게 만들 수는 없지만 읽는 데 훨씬 오래 걸립니다.

변수가 루프 에서 사용 되면 의미있는 이름이 유용 할 수 있습니다.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

변수가 메소드 전체에서 사용되는 경우 이름이 더 길어야합니다. 클래스 전체에서 사용되는 경우 이름은 완전히 자명 한 것이 더 좋았습니다. 그렇지 않으면 코드의 선명도가 거의 떨어질 것입니다.

간단히 말해서 변수의 범위가 클수록 이름이 길어야합니다.


솔직히 말해서 하나의 문자 변수 이름, 마침표를 사용하지 않는 지점에 도달했습니다. 카운터의 경우에도 사용법을 나타내는 이름을 사용하려고합니다. index예를 들어 일반적으로 배열을 반복 할 때 명명 된 변수를 사용합니다 .
Michael

13
@ 마이클 : 내 의견으로는, 프로그래밍 전문 용어는 자체 언어이며 영어가 아닙니다. 그리고 그 언어에서, i정확하게 정의 된 의미를 가진 적절한 단어, 즉 "너무 걱정할 필요가없는 색인"입니다. 그러나 나는 그것이 친숙한 문제라고 생각합니다. 당신이 하스켈을 많이 읽는다면, 당신은 읽을 익숙해 될 것 m같은 모나드 , f , x같은 오브젝트로 , xs같은 목록 x 등등.
Jörg W Mittag

2
정말 큰 경고입니다. 단일 문자 변수 이름은 언어에 적절한 변수 범위가있는 경우에만 유효합니다. 당신은 분명히 '어떤 언어에 적절한 범위가 없는가?'를 물을 것입니다. 글쎄, JavaScript가 FOR 루프에서 변수의 범위를 지정하지 않는다는 것을 배우기 위해 3 시간이 걸렸습니다. 동일한 변수 이름을 사용하여 for 루프 내에서 for 루프로 시도하십시오. 당신의 마음을 날려 버릴 것입니다.
Nelson

@Nelson :이 질문과 대답은 Java에 관한 것입니다. 분명히 다른 언어는 다소 다른 고려 사항을 가질 수 있습니다. (JavaScript는 Java와 같은 언어가 아닙니다.)
ruakh

나는 그들이 가장 의미가있을 때마다 단일 문자 변수 이름에 모두 있지만, i계산에만 변수를 사용하는 루프에 대해 "최고의 이름"이라고 동의하지 않습니다 . 이 경우 count변수 이름으로 사용되는 것이 좋습니다. 즉각 이해할 수 있습니다. for (int count = 0; count < 10; count++)또는 while (count--).
Todd Lehman

4

킬리안의 대답에서 코드를 읽으면 "루프가 있고 변수가 있으며 int 유형이 있고 이름이 있고 이름이 i이며 0으로 초기화됩니다. .. ". 세 개의 점이 내가 생각조차하지 않는 중요하지 않은 세부 사항을 나타내는 "루프 ..."라고 생각합니다. 프로그래머의 마음에, 그 변수는 실제로 존재하지 않습니다. for (;;) {}처럼 루프를 만드는 것은 입력해야하는 인공물 일뿐입니다.

그 변수가 내 마음 속에 존재하지 않기 때문에 왜 절대적으로 필요한 것 이상의 이름을 주어야합니까?


나는 구조의 종류에 저것을 추가해야합니다, 나는 종종조차 사용하도록 유혹하고있어 i, 그러나 _명백하게 의미가 변수. 그러나 모든 사람이 Prolog에 익숙하지는 않으며 제거하는 것보다 더 많은 관심을 끌 것입니다.
Kilian Foth

또한 헤더 뿐만 아니라 루프 에서 변수가 어떻게 사용되는지 고려해야합니다 for (...).

@ KilianFoth : Haskell, ML, F # 및 Scala에서도 사용됩니다. 루비에서는 _다른 것과 마찬가지로 유효한 식별자 이지만 최근에 루비가 경고를하더라도 사용하지 않는 로컬 변수 _(또는로 시작 _)가 "사용하지 않는 로컬 변수"경고를 생성 하지 않는 최근 변경이 있었습니다.
Jörg W Mittag

-1

루프 내에서 문자 i, j, k를 색인으로 참조하는 경우 이는 Java 및 기타 프로그래밍 언어에서 일반적입니다. 각 스타일 루프마다를 사용하는 것이 좋습니다.

for(User user: users) {
  doSomethingWithTheUser(user);
}

대신에

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

Java에서는 해당 스타일의 루핑이 최근에 도입되었습니다. 그렇기 때문에 인덱스를 반복하는 것이 배열이나 목록을 반복하는 가장 일반적인 방법이기 때문에 Java에 대해 더 많이 알 수 있습니다.

n, x 또는 y와 같은 단일 문자가 이미 일반적 일 수있는 수학 함수를 구현할 때와 같이 단일 문자가 적절한 경우가 몇 가지 있습니다. 그러나 일반적으로 변수 이름을 의미있는 이름으로 지정하십시오.


5
10 년 전과 같이 "자바에서는 그 스타일의 루핑이 상당히 최근에 도입 된 것입니까?" ( 자바 5는 2004 년에 출시 된 )
메리 톤

1
예, 꽤 최근입니다. 아니, 난 나이가 아니야. 입 닥쳐. 젠장 아이들이 내 잔디밭에서 내려 이전의 Java 5에는 여전히 많은 레거시 Java 응용 프로그램이 있습니다. Java 1.4에서 언어를 배우고 작업 방식 업데이트를 거부하는 더 많은 Java 프로그래머도 있습니다. 그리고 2000 년대 초로 거슬러 올라가는 훨씬 더 많은 코드 샘플이 온라인에있었습니다 (예, 인터넷은 당시에 웹 2.0이라고 불렀습니다).
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.