[hungarian-notation] `m_` 변수 접두사는 무엇을 의미합니까?

나는 종종 볼 m_접두사 변수에 사용 ( m_World, m_Sprites주로 게임 개발에 관련된 튜토리얼, 예 및 기타 코드, …).

사람들 m_이 변수 에 접두사 를 추가하는 이유는 무엇 입니까?



답변

멤버 변수 인 변수를 정의하기위한 일반적인 프로그래밍 방법입니다. 따라서 나중에 사용하는 경우 범위를 알기 위해 정의 된 위치를 볼 필요가 없습니다. 범위를 이미 알고 있고 intelliSense 와 같은 것을 사용하고 있다면 시작할 수 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.

http://coliru.stacked-crooked.com/a/f38e7dbb047687ad

“m_”은 “member”의 상태입니다. 접두사 “_”도 일반적입니다.

다른 규칙 / 문법을 사용하여이 문제를 해결하는 프로그래밍 언어에서는이 언어를 사용하지 않아야합니다.


답변

m_접두사는 종종 멤버 변수에 사용되는 – 나는 그것의 주요 장점은 공용 속성과 개인 멤버 변수 뒷면이 사이에 명확한 구분을 만들 수 있다고 생각합니다 :

int m_something

public int Something => this.m_something;

지원 변수에 대해 일관된 명명 규칙을 유지하는 데 도움이 될 수 있으며 m_접두사는이를 수행하는 한 가지 방법입니다. 대소 문자를 구분하지 않는 언어로 작동합니다.

이것이 얼마나 유용한지는 사용중인 언어와 도구에 따라 다릅니다. 강력한 리 팩터 툴과 인텔리전스를 갖춘 최신 IDE는 이와 같은 규칙이 필요하지 않으며,이를 수행 할 수있는 유일한 방법은 아니지만 어쨌든 실습을 인식하는 것이 좋습니다.


답변

다른 답변에서 언급했듯이 m_접두사는 변수가 클래스 멤버임을 나타내는 데 사용됩니다. 변수의 유형이 아니라 컨텍스트를 나타 내기 때문에 헝가리 표기법과 다릅니다.

m_C ++에서는 사용 하지만 ‘this’또는 ‘self’는 필수 인 다른 언어에서는 사용 하지 않습니다. C ++에서 ‘this->’가 코드를 어지럽히 기 때문에 사용되는 것을보고 싶지 않습니다.

또 다른 대답 m_dsc은 “나쁜 습관”과 “설명”입니다. “좋은 관행”이지만 약어에 문제가 있기 때문에 이것은 붉은 청어입니다.

또 다른 대답은 입력 this하면 IntelliSense가 팝업되지만 좋은 IDE에는 현재 클래스 멤버를 위해 IntelliSense를 팝업하는 단축키가 있습니다.


답변

다른 많은 응답에서 언급했듯이 m_은 멤버 변수를 나타내는 접두사입니다. C ++ 세계에서 일반적으로 사용되었으며 Java를 포함한 다른 언어에도 전파되었습니다.

최신 IDE에서는 구문 강조 표시를 통해 어떤 변수가 로컬 이고 어떤 변수 가 멤버인지를 알 수 있으므로 완전히 중복됩니다 . 그러나 90 년대 후반에 구문 강조가 나타 났을 때,이 협약은 수년 동안 지속되어 왔으며 (적어도 C ++ 세계에서는) 확실하게 설정되었습니다.

어떤 자습서를 참조하는지 모르지만 두 가지 요소 중 하나 때문에 규칙을 사용하고 있다고 생각합니다.

  • 그것들은 m_ 규칙에 익숙한 사람들이 작성한 C ++ 튜토리얼입니다.
  • 구문 강조없이 일반 (단일 공백) 텍스트로 코드를 작성하므로 m_ 규칙은 예제를 더 명확하게하는 데 유용합니다.

답변

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*
}

가치있는 것으로 가져 가십시오.