java - 함수 - 파라미터 변수 명




이름 붙이기:C++/Java에서 명명 된 상수를 모두 대문자로 사용해야하는 이유는 무엇입니까? (11)

C ++과 Java의 경우 잘 알려진 명명 규칙이므로 상수는 모두 대문자로, 밑줄은 단어를 구분하여 작성해야합니다. 이와 같이 (자바 예제) :

public final static Color BACKGROUND_COLOR = Color.WHITE;
public final static Color TEXT_COLOR = Color.BLACK;

이 명명 규칙은 이해하기 쉽고 따르기 쉽지만, 나는 왜 스스로에게 물어 봅니다. 변수에 대한 일반적인 명명 규칙보다이 명명 규칙을 선택해야하는 이유는 무엇입니까?

public final static Color backgroundColor = COLOR.WHITE;
public final static Color textColor = COLOR.BLACK;

Theres는 상수의 모양을 바꿀 필요가없는 것처럼 보인다. 값을 할당하려면 컴파일러가이를 방지합니다. 실제로 문제가 발생합니다. 나중에 상수가 적절한 변수로 변경되면 (예를 들어 색상이 구성 가능해지기 때문입니다).

그렇다면 명명 된 상수를 모두 대문자로 쓰는 궁극적 인 이유는 무엇입니까? 역사적인 이유?


상수가 매크로로 사용 되었기 때문에 상수에 ALL_CAPS를 사용하지 마십시오.

이 C ++ 핵심 지침의 quote 은이 모든 것을 요약합니다.


C (및 C ++)에서 전 처리기 #define 지시어로 정의 된 기호는 개발자가 코드를 정상적인 기호로 취급하지 않는 것처럼 큰 소리로 모두 대문자로 작성되었습니다. 상수는 K & R C에 처음에는 존재하지 않았지만 (나중에 const 가 C ++에서 다시 가져 왔음) 개발자가 대신 #define 사용 했으므로 대문자를 사용했습니다.

웬일인지, 이것은 "상수는 대문자"이므로 Java로 왜곡되어 현재의 잘못된 (IMO) 규칙입니다.


기본적으로 사람들이 C와 사랑에 빠졌을 때, C ++ 및 Java가 새로 생성되었거나 아직 생성되지 않았기 때문에 사람들은 전처리 상수 이름에 대문자를 사용하여 실제로 변수가 아님을 나타냅니다.

#define INT_CONST 4
#define STRING_CONST "Yello."
#define FLOAT_CONST 3.6122448

이것이 C에서 진정한 상수를 정의하는 유일한 방법이라는 것을 고려하면 (예를 들어 알고 있다면 const 변수를 변경하는 것이 가능합니다.) 그런 전처리 상수는 그냥 상수로 보았습니다. 따라서 모든 대문자의 의미가 바뀌 었습니다 전처리 상수에서 단순히 상수로 일반적으로. 이것은 다음 언어로 이어져 표준 "consts = capitals"관행이되었습니다.

그러나 다른 언어에는 선호하는 스타일이 있습니다 (예 : C # 및 .NET은 PascalCase를 선호 함). 일반적으로 선호되는 스타일을 사용하는 것이 가장 좋습니다.


나는 C ++에서 선행 처리기를 사용하여 상수 값을 # 정의 할 때부터 이월 된 규칙을 믿습니다. 당시에는 C 함수와 변수 이름에 대한 일반적인 규칙에 따라 대소 문자가 혼합되거나 대문자가되기 때문에 전처리 기가 소스 코드를 뒤 흔드는 것을 피하기 위해 수행되었습니다.

C ++의 관점에서 상수를 모두 대문자로 만드는 것은 나쁜 생각이라고 말하고 싶습니다. 이 때문에 하나 이상의 빌드 문제를 디버깅해야했습니다. C ++ 전처리 기는 네임 스페이스와 명명 범위에 대해 모르고 있으며 적절하지 않다고 생각하는 부분을 기꺼이 대신 할 것입니다.


내가 뭔가가 상수라는 것을 안다면 나는 여러 번 참조 할 수 있고 그것이 변하지 않을 것임을 알 수 있습니다. 즉, 나는 그것을 안다 :

Color black = Colors.BLACK;
foo(black);
foo(black);

와 같다:

foo(Colors.BLACK);
foo(Colors.BLACK);

가끔은 알아두면 유용 할 수 있습니다. 개인적으로 나는 .NET 명명 규칙을 선호하는데, 이는 상수 (및 메소드)에 파스칼 케이스를 사용하는 것입니다.

Foo(Colors.Black);
Foo(Colors.Black);

나는 격렬한 사건에 대한 큰 팬이 아니지만 상수가 명백하게 상수가되는 것을 좋아한다.


대문자 상수는 C의 나쁜 유산이라고 생각합니다. 뒤에 오는 논리는 개인 멤버의 접두사로 밑줄을 사용할 때와 같습니다. 이것은 이미 private 와 같은 Java 키워드 또는 상수의 경우 static final 표현 된 기술적 인 내용입니다.

참고 : http://weblogs.java.net/blog/2006/09/28/case-against-uppercases


실제로 대부분의 C ++ 명명 규칙 (ISO, Boost, Sutter & Stroustrup 및 Google 포함)은 모든 대문자로 명명 상수를 사용하지 못하게합니다. 이는 매크로가 모두 대문자를 사용하기 때문에 헤더 파일에 이상하게 생겨서 이상한 행동을 유발할 수 있기 때문입니다. 사람들은 오래된 C / K & R 또는 오래된 레거시 코드에서 배우기 때문에 여전히 모든 대문자를 사용합니다. 그러나 Modern C ++의 새로운 코드에서는 매크로를 제외하고 모두 대문자를 사용하지 않아야합니다.

왜 모든 대소 문자가 존재하는지에 대한 나의 애완 동물 이론은 매우 오래된 기계에서는 코드가 숫자 키패드를 사용하여 기계 코드에 직접 입력된다는 것입니다. 조립 언어가 현장에 도착했을 때, 그 당시의 키보드는 표준화되지 않았고 일부 키보드는 제한되어있었습니다 (예 : 피쳐 폰과 같은 알파벳을 입력하기 위해 동일한 숫자 키패드 사용). 이것은 BASIC과 같은 많은 초기 언어로 이어져 모든 것을 모두 덮었습니다. 실제 터미널을 사용할 수있게되고 키보드가 표준화되기 시작했을 때 사람들은 예약없이 혼합 된 사례를 사용하기 시작했으며 함수 및 변수와 비교하여 상수와 같이 발생하기 쉬운 모든 것에 대해 모든 대문자가 예약되었습니다.

대부분의 C ++ 지침에서는 상수에 접두어로 "k"를 사용하고 밑줄이나 CamelCase로 이름을 붙이는 것에 동의합니다. 저는 개인적으로 kCameCase를 선호하는데 왜냐하면 쉽게 under_scores라는 이름의 변수와 구분할 수 있기 때문입니다.

const float kFixedRadius = 3.141;

아마 당신 말이 맞아. 컴퓨터와 컴파일러 (특히)는 오늘날과 같이 빠르지 않았습니다.

조엘 스폴 스키 (Joel Spolsky) 는 자신의 에세이 에서 터보 파스칼 (Turbo Pascal)의 새 버전을 컴파일 할 때 얼마나 감명을 받았는지에 대해 언급했습니다.

PC XT 10MHz에서 Turbo Pascal 5.0의 오버레이가 포함 된 너무 큰 프로그램 (10-20KLOC)을 컴파일하는 데 약 20 분이 걸린 것을 기억합니다 ...

오류를 감지하기 위해 컴파일을 기다리는 것이 받아 들일 수 없다고 생각합니다.

그런 컨벤션은 오류를 피하고 컴파일이 깨지는 시간을 낭비하는 데 도움이됩니다.


코딩 변환은 가독성을 향상시키는 것입니다. 편지를 사용할 필요가 없습니다. 자바는 예를 들어 $ 기호를 허용합니다.

public final static Color $$ = COLOR.WHITE;
public final static Color $_ = COLOR.BLACK;

변수에 번호를 매길 수는 있지만 좋은 아이디어는 아닙니다. ;)


프로그래밍 할 때 인간이 이해할 수있는 코드를 만드는 것이 중요합니다. 명명 규칙을 사용하면이 작업을 수행하는 데 도움이됩니다. 이것은 작성하지 않은 코드를 볼 때 가장 좋으며 상수 및 변수와 구별하기 쉽기 때문에 코드를보다 관리하기 쉽게 만듭니다.


이것은 순수하게 프로그래머가 자신이 뭘보고 있는지 이해할 수 있도록 돕는 것입니다. 상수가 사용되는 것을 알고 있으면 참조하는 방법에 관계없이 값이 변경되지 않습니다.

컴파일러 측면에 대해서는별로 이유가 없습니다. 명명 규칙은 순수한 개념으로, 기술적 인 제한이 아닙니다.







naming-conventions