나는 종종 볼 m_
접두사 변수에 사용 ( m_World
, m_Sprites
주로 게임 개발에 관련된 튜토리얼, 예 및 기타 코드, ...).
사람들 m_
이 변수 에 접두사 를 추가하는 이유는 무엇 입니까?
m_
위한 것인지 명확하게 묻지 만, 여기에있는 응답의 절반은 모든 사람들이 현재 자신이 좋아하는 것이 최고라고 생각하는 이유에 대한 주석입니다.
나는 종종 볼 m_
접두사 변수에 사용 ( m_World
, m_Sprites
주로 게임 개발에 관련된 튜토리얼, 예 및 기타 코드, ...).
사람들 m_
이 변수 에 접두사 를 추가하는 이유는 무엇 입니까?
m_
위한 것인지 명확하게 묻지 만, 여기에있는 응답의 절반은 모든 사람들이 현재 자신이 좋아하는 것이 최고라고 생각하는 이유에 대한 주석입니다.
답변:
멤버 변수 인 변수를 정의하기위한 일반적인 프로그래밍 방법입니다. 따라서 나중에 사용하는 경우 범위를 알기 위해 정의 된 위치를 볼 필요가 없습니다. 범위를 이미 알고 있고 intelliSense 와 같은 것을 사용하고 있다면 시작할 수 m_
있으며 모든 멤버 변수 목록이 표시됩니다. 헝가리 표기법의 일부는 여기 예제의 범위에 대한 부분을 참조 하십시오 .
m_
.
에서 클린 코드 : 애자일 소프트웨어 장인의 수첩 이 접두사의 사용에 대한 명시 적 권고가있다 :
또한 멤버 변수에
m_
더 이상 접두사를 지정할 필요가 없습니다. 클래스와 함수는 필요하지 않을 정도로 작아야합니다.
이것의 예 (C # 코드)도 있습니다 :
나쁜 습관 :
public class Part
{
private String m_dsc; // The textual description
void SetName(string name)
{
m_dsc = name;
}
}
좋은 연습:
public class Part
{
private String description;
void SetDescription(string description)
{
this.description = description;
}
}
우리는 명시 적 모호성 (의 경우 멤버 변수를 참조하는 언어 구조와 계산 즉 , description
멤버 및 description
매개 변수) this
.
C ++에서는 일반적인 관행입니다. C ++에서는 멤버 함수와 멤버 변수에 동일한 이름을 사용할 수없고 getter 함수는 종종 "get"접두사없이 이름이 지정되기 때문입니다.
class Person
{
public:
std::string name() const;
private:
std::string name; // This would lead to a compilation error.
std::string m_name; // OK.
};
main.cpp:9:19: error: duplicate member 'name' std::string name; ^ main.cpp:6:19: note: previous declaration is here std::string name() const; ^ 1 error generated.
"m_"은 "member"의 상태입니다. 접두사 "_"도 일반적입니다.
다른 규칙 / 문법을 사용하여이 문제를 해결하는 프로그래밍 언어에서는이 언어를 사용하지 않아야합니다.
m_
접두사는 종종 멤버 변수에 사용되는 - 나는 그것의 주요 장점은 공용 속성과 개인 멤버 변수 뒷면이 사이에 명확한 구분을 만들 수 있다고 생각합니다 :
int m_something
public int Something => this.m_something;
지원 변수에 대해 일관된 명명 규칙을 유지하는 데 도움이 될 수 있으며 m_
접두사는이를 수행하는 한 가지 방법입니다. 대소 문자를 구분하지 않는 언어로 작동합니다.
이것이 얼마나 유용한지는 사용중인 언어와 도구에 따라 다릅니다. 강력한 리 팩터 툴과 인텔리전스를 갖춘 최신 IDE는 이와 같은 규칙이 필요하지 않으며,이를 수행 할 수있는 유일한 방법은 아니지만 어쨌든 실습을 인식하는 것이 좋습니다.
this.
당신의 언어 로 작성해야한다면 , m_
정말 쓸모가 없습니다.
m_
를 구별하는 것입니다 . 내가 선호하는 관습은 아니지만 VB와 같이 대소 문자를 구분하지 않는 언어에서 주로 사용되는 것을 보았습니다. this.Something
this.m_something
this.Something
재산과 this.something
후원을 위해? 아니면 this._something
후원을 위해? this.m_something
중복됩니다. 나는 _something
타이핑 할 때 실수로 타이핑하지 않도록 Something
멤버쉽과 관련이 있거나없는
_
접두사가 자체적으로 작동하지만 m_
규칙입니다. 개인적으로 사용하는 것이 아니지만 코드에서 볼 때 저자의 의도였습니다.
다른 답변에서 언급했듯이 m_
접두사는 변수가 클래스 멤버임을 나타내는 데 사용됩니다. 변수의 유형이 아니라 컨텍스트를 나타 내기 때문에 헝가리 표기법과 다릅니다.
m_
C ++에서는 사용 하지만 'this'또는 'self'는 필수 인 다른 언어에서는 사용 하지 않습니다. C ++에서 'this->'가 코드를 어지럽히 기 때문에 사용되는 것을보고 싶지 않습니다.
또 다른 대답 m_dsc
은 "나쁜 습관"과 "설명"입니다. "좋은 관행"이지만 약어에 문제가 있기 때문에 이것은 붉은 청어입니다.
또 다른 대답은 입력 this
하면 IntelliSense가 팝업되지만 좋은 IDE에는 현재 클래스 멤버를 위해 IntelliSense를 팝업하는 단축키가 있습니다.
m_description
vs description
입니다.
다른 많은 응답에서 언급했듯이 m_은 멤버 변수를 나타내는 접두사입니다. C ++ 세계에서 일반적으로 사용되었으며 Java를 포함한 다른 언어에도 전파되었습니다.
최신 IDE에서는 구문 강조 표시를 통해 어떤 변수가 로컬 이고 어떤 변수 가 멤버인지를 알 수 있으므로 완전히 중복됩니다 . 그러나 90 년대 후반에 구문 강조가 나타 났을 때,이 협약은 수년 동안 지속되어 왔으며 (적어도 C ++ 세계에서는) 확실하게 설정되었습니다.
어떤 자습서를 참조하는지 모르지만 두 가지 요소 중 하나 때문에 규칙을 사용하고 있다고 생각합니다.
Lockheed Martin은 특히 다른 사람의 코드를 읽을 때 사용할 수있는 3 접두사 명명 체계를 사용합니다.
Scope Reference Type(*Case-by-Case) Type
member m pointer p integer n
argument a reference r short n
local l float f
double f
boolean b
그래서...
int A::methodCall(float af_Argument1, int* apn_Arg2)
{
lpn_Temp = apn_Arg2;
mpf_Oops = lpn_Temp; // Here I can see I made a mistake, I should not assign an int* to a float*
}
가치있는 것으로 가져 가십시오.
현재 답변을 완성하고 질문이 언어에 국한되지 않기 때문에 일부 C- 프로젝트는 접두어 m_
를 사용하여 파일과 g_
관련된 전역 변수 및 정의 된 파일보다 범위가 큰 전역 변수를 정의합니다.
이 경우 접두사로 정의 된 전역 변수 m_
는로 정의해야합니다 static
.
이 규칙을 사용하는 프로젝트의 예는 EDK2 (UEFI 오픈 소스 구현) 코딩 규칙 을 참조하십시오 .