나는 모두 접두사 를 선호 합니다 .
나는 (시스템) 헝가리어 표기법이 접두사가 얻는 "나쁜 랩"의 대부분을 담당한다고 생각합니다.
이 표기법은 예를 들어 C ++ "lpsz"와 같이 강력하게 형식이 지정된 언어에서는 의미가 없습니다. 다음과 같은 경우 문자열이 널 종료 문자열에 대한 긴 포인터임을 나타냅니다. char 배열과 "customerName"이 문자열이라는 것을 알기 란 쉽지 않습니다!
그러나, 나는이 지정하는 데 사용할 접두사을 사용 (나는 그것 때문에 나쁜 및 시스템 헝가리어와 불공정 한 관계를 데 용어 헝가리어를 방지하는 것을 선호하지만, 본질적으로 "앱 헝가리어") 변수를,이 매우 편리 시간을 절약 하고 버그 감소 접근법.
나는 사용한다:
- 회원의 경우 m
- 상수 / 읽기 전용의 경우 c
- 포인터의 경우 p (포인터의 포인터의 경우 pp)
- 휘발성에 대한 v
- 정적의 경우
- 인덱스와 반복자의 경우
- 이벤트의 경우 e
유형을 명확 하게하고 싶을 때는 표준 접미사 (예 : List, ComboBox 등)를 사용하십시오.
이를 통해 프로그래머 는 변수를 보거나 사용할 때마다 변수 의 사용법 을 알 수 있습니다. 아마도 가장 중요한 경우는 포인터에 대해 "p"입니다 (용법이 var.에서 var->로 변경되고 포인터 (Null, 포인터 산술 등)에 훨씬 더주의를 기울여야하기 때문에)이지만 다른 모든 것들은 매우 편리합니다.
예를 들어 단일 함수에서 동일한 변수 이름을 여러 방법으로 사용할 수 있습니다 (여기서는 C ++ 예제이지만 여러 언어에 동일하게 적용됨).
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
당신은 여기에서 볼 수 있습니다 :
- 멤버와 매개 변수가 혼동되지 않습니다
- 인덱스 / 반복자와 아이템이 혼동되지 않습니다
- "count", "index"와 같은 일반적인 (모호한) 이름의 많은 함정을 피하는 명확하게 관련된 변수 (항목 목록, 포인터 및 색인) 세트를 사용하십시오.
- 접두어는 "itemIndex"및 "itemPtr"과 같은 대안보다 타이핑을 줄이고 (짧고 자동 완성 기능을 더 잘 수행합니다)
"iName"이터레이터의 또 다른 장점은 잘못된 인덱스로 배열을 인덱싱하지 않는다는 것입니다. 다른 루프 내에서 루프를 복사하면 루프 인덱스 변수 중 하나를 리팩터링 할 필요가 없습니다.
이 비현실적으로 간단한 예를 비교해보십시오.
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(읽기 어렵고 종종 "j"가 사용 된 곳에서 "i"를 사용하게 됨)
와:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(이것은 훨씬 더 읽기 쉽고 인덱싱에 대한 모든 혼란을 제거합니다. 최신 IDE에서 자동 완성 기능을 사용하면 빠르고 쉽게 입력 할 수 있습니다)
다음 이점은 코드 스 니펫 이 컨텍스트 를 이해할 필요가 없다는 것입니다. 두 줄의 코드를 전자 메일이나 문서에 복사 할 수 있으며 해당 스 니펫을 읽는 사람은 모든 멤버, 상수, 포인터, 색인 등의 차이점을 알 수 있습니다. "아 추가 할 필요가 없습니다. 'data'는 포인터에 대한 포인터 '입니다. 왜냐하면'ppData '입니다.
같은 이유로, 나는 그것을 이해하기 위해 코드 라인에서 눈을 옮길 필요가 없습니다. 'data'가 로컬, 매개 변수, 멤버 또는 상수인지 확인하기 위해 코드를 검색 할 필요가 없습니다. 마우스로 손을 움직일 필요가 없으므로 '데이터'위에 포인터를 놓고 툴팁 (때로는 나타나지 않는)이 나타날 때까지 기다릴 수 있습니다. 따라서 프로그래머는 검색 및 검색 또는 대기 시간을 낭비하지 않기 때문에 코드를 훨씬 빠르게 읽고 이해할 수 있습니다 .
(물건을 찾기 위해 위아래로 검색하는 데 시간을 낭비하지 않는다고 생각되면 1 년 전에 작성했지만 이후에 보지 않은 코드를 찾으십시오. 파일을 열고 읽지 않고 반쯤 줄어 듭니다. 방법보기 무언가가 멤버, 매개 변수 또는 로컬인지 알기 전에이 시점에서 읽을 수 있습니다. 이제 임의의 다른 위치로 이동하십시오 ... 이것은 우리가 다른 사람의 코드를 한 번 밟을 때 하루 종일 모든 일을합니다. 또는 함수 호출 방법을 이해하려고 시도)
'm'접두어는 또한 (IMHO) 추악하고 말끔한 "this->"표기법과 그것이 보장하지 않는 일관성을 피합니다 (주의를 기울여도 'this-> data'와 동일한 클래스의 '데이터'는 이름의 일관된 철자를 강제하지 않습니다.
'이'표기법은 모호성 을 해결하기위한 것이지만 왜 모호 할 수있는 코드를 의도적으로 작성하는 사람이 있습니까? 모호성 은 조만간 버그로 이어질 것 입니다. 그리고 일부 언어에서는 'this'를 정적 멤버에 사용할 수 없으므로 코딩 스타일에 '특별한 경우'를 도입해야합니다. 나는 명시적이고 모호하지 않으며 일관된 모든 곳에 적용되는 하나의 간단한 코딩 규칙을 선호합니다.
마지막 주요 이점은 Intellisense 및 자동 완성 기능입니다. Windows Form에서 Intellisense를 사용하여 이벤트를 찾으십시오. 이벤트를 찾기 위해 호출 할 필요가없는 수백 가지의 신비한 기본 클래스 메소드를 스크롤해야합니다. 그러나 모든 이벤트에 "e"접두사가 있으면 "e"아래의 그룹에 자동으로 나열됩니다. 따라서 접두사는 지능 목록에서 멤버, const, 이벤트 등을 그룹화하여 원하는 이름을 훨씬 빠르고 쉽게 찾을 수 있도록합니다. (보통, 메소드에는 범위 내에서 액세스 할 수있는 약 20-50 개의 값 (로컬, 매개 변수, 멤버, const, 이벤트)이있을 수 있지만 접 두부를 입력 한 후 (지금 색인을 사용하고 싶습니다.) 'i. .. '), 2-5 개의 자동 완성 옵션 만 제공됩니다.
나는 게으른 프로그래머이고 위의 규칙은 많은 작업을 절약합니다. 모든 변수를 어떻게 사용해야하는지 알고 있기 때문에 더 빨리 코딩 할 수 있고 실수도 훨씬 줄어 듭니다.
반대론
그렇다면 단점은 무엇입니까? 접두사에 대한 일반적인 인수는 다음과 같습니다.
"접두사 계획은 / 악 나쁜" . 나는 "m_lpsz"와 그 ilk가 잘 생각되지 않고 완전히 쓸모 없다는 것에 동의합니다. 그렇기 때문에 상황에 맞지 않는 것을 복사하는 대신 요구 사항을 지원하도록 잘 설계된 표기법을 사용하는 것이 좋습니다. (작업에 맞는 도구를 사용하십시오).
"사용 방법을 변경하면 이름을 바꿔야합니다 . " 물론 리팩토링이 중요한 이유이며 IDE에이 작업을 빠르고 쉽게 수행 할 수있는 리팩토링 도구가있는 이유가 여기에 있습니다. 접두어가 없어도 변수의 사용법을 변경하면 이름 이 변경 되어야 합니다.
"접두사는 저를 혼동합니다" . 사용 방법을 익힐 때까지 모든 도구가 그러합니다. 당신의 두뇌가 네이밍 패턴에 익숙해지면, 정보를 자동으로 걸러 내고 접두사가 더 이상 존재하지 않을 것입니다. 그러나 실제로 "유창한"상태가되기 전에 1-2 주 동안 이와 같은 체계를 사용해야합니다. 그리고 많은 사람들이 오래된 코드를보고 좋은 접두사 체계 없이 어떻게 관리했는지 궁금해하기 시작합니다 .
"이 작업을 수행하는 코드 만 살펴볼 수 있습니다 . " 예, 그러나 코드의 다른 곳을 보거나 이미 눈에 초점을 맞춘 지점에 대한 답변이 올 바르면 모든 세부 사항을 기억하는 데 시간을 낭비하지 않아도됩니다.
(일부) 해당 정보는 툴팁이 내 변수에 나타날 때까지 기다리면 찾을 수 있습니다 . 예. 지원되는 경우 일부 접두사 유형의 경우 코드가 깨끗하게 컴파일 될 때 대기 후 설명을 읽고 접두사가 즉시 전달한 정보를 찾을 수 있습니다. 접두사가 더 간단하고 안정적이며 효율적인 방법이라고 생각합니다.
"더 많은 타이핑입니다" . 정말? 하나의 전체 문자 더? 또는 IDE 자동 완성 도구를 사용하면 각 접두사 문자가 검색 공간을 크게 좁히기 때문에 타이핑이 줄어드는 경우가 많습니다. "e"를 누르면 클래스의 세 가지 이벤트가 지능적으로 나타납니다. "c"를 누르면 5 개의 상수가 나열됩니다.
" this->
대신에 사용할 수 있습니다 m
" . 그래, 할 수있어 그러나 그것은 훨씬 더 추악하고 더 자세한 접두사입니다! 컴파일러에게는 선택 사항 이므로 사용법이 일관되지 않기 때문에 (특히 팀에서) 훨씬 큰 위험을 감수 합니다. m
반면에 간단하고 명확하며 명시 적이며 선택 사항이 아니므로 실수로 사용하는 것이 훨씬 어렵습니다.