Android 튜토리얼의 대부분의 필드 (클래스 멤버)가 왜 m으로 시작합니까?


446

나는 낙타 사건 규칙에 대해 알고 있지만이 m 규칙과 혼동됩니다. 그것은 무엇을 의미합니까? 저는 PHP 개발자입니다. "우리"는 부울의 경우 'b', 정수의 경우 'i'등 유형의 표시로 변수의 첫 문자를 사용합니다.

'm'은 Java입니까? 모바일을 의미합니까? 혼합?


281
그 접두사는 가독성을 엉망으로 만들기 위해 아무것도하지 않습니다 ...
Dapeng

10
접두사로 유형을 표시하는 것은 헝가리 표기법이라고하며 thc.org/root/phun/unmaintain.htmlkernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi

10
Java 코드 스타일에 대한 지식이 많지 않았기 때문에
Victor Ionescu

10
제 생각에는 로컬 변수를 멤버 변수와 구별하는 데 문제가 있다면 코드 규칙을 따르는 것보다 훨씬 큰 문제가 있습니다. 다음은 내가 사용하는 규칙입니다 (때로는 긴 수명, 긴 이름). 짧은 수명, 짧은 이름. 지금까지 혼동하지 않았습니다.
Brandon

17
진짜 바보 접두사. IDE를 사용하여 setter / getter를 생성하면 getmName () 및 setmName ()으로 끝납니다! 또한 생성 세터, 게터, 컨스트럭터 등을위한 롬복과 같은 도구는 m 접두사를 생성합니다. 선택에 따라 m 접두어는 값을 추가하지 않으며 명명 규칙에서 제거해야합니다.
userM1433372

답변:


552

이 표기법은 제공자를위한 AOSP (Android Open Source Project) 코드 스타일 지침 에서 비롯된 것입니다 .

필드 명명 규칙 준수

  • 공개되지 않은 비 정적 필드 이름은 m으로 시작합니다.
  • 정적 필드 이름은 s로 시작합니다.
  • 다른 필드는 소문자로 시작합니다.
  • 공개 정적 최종 필드 (상수)는 ALL_CAPS_WITH_UNDERSCORES입니다.

링크 된 스타일 가이드는 코드가 Android 오픈 소스 프로젝트에 기여하기위한 것입니다.

개별 Android 앱의 코드에 대한 스타일 가이드는 아닙니다.


33
재미있는 .. 구글 자바 코드 스타일은 실제로 이것에 관한 AOSP 코드 스타일 과 모순된다 .
Gautam

51
나는이 시대에는 특히 응용 프로그램에서 그것을하는 것은 말도 안된다고 생각합니다! "클래스와 함수는 필요하지 않을 정도로 작아야합니다. 또한 멤버를 구분하거나 강조 표시하는 편집 환경을 사용해야합니다. 게다가 사람들은 접두사 (또는 접미사)를 무시하여 빠르게 볼 수 있습니다. 코드를 많이 읽을수록 접두사를 더 적게 볼 수 있습니다. 결국 접두사는 보이지 않는 오래된 코드의 표시자가됩니다. " -깨끗한 코드의 Robert Martin
mikugo

4
Google의 Java 스타일 가이드와 모순 - "일정하지 않은 필드 이름 (정적 또는 기타)은 lowerCamelCase 로 작성됩니다 . ... 예를 들어 computedValues..."
AlikElzin-kilaka 's

개별 앱의 경우 'm'대신 소문자 이니셜을 사용하는 것이 좋습니다.
abcoep

4
규칙 제거하려면이 청원에 댓글을 추가하세요 code.google.com/p/android/issues/detail?id=226814을
likejudo

83

많은 코딩 가이드 라인은 클래스의 '멤버'에 m을 사용합니다. 따라서 프로그래밍 할 때 로컬 변수와 멤버 변수의 차이를 확인할 수 있습니다.


90
모든 최신 IDE는 색상 / 글꼴로 지역 및 멤버를 m구분합니다. 이는 접두사 보다 읽기 쉬운 IMHO 방식 입니다.
Dzmitry Lazerka

5
동의했다. 나는 m 성가신 것을 매우 성가신 것으로 생각하지만 IntelliJ만이 훌륭하기 때문입니다.
ZakTaccardi 2019

규칙 제거하려면이 청원에 댓글을 추가하세요 code.google.com/p/android/issues/detail?id=226814을
likejudo

4
대부분의 코드 검토 도구에서 @DzmitryLazerka는이 수준의 강조 표시가 없습니다. 따라서 큰 오픈 소스 프로젝트에서 센세이션을합니다.
JWqvist 2012

@DzmitryLazerka 메모장이나 github 등에서 코드를 읽는 것은 어떻습니까?
user924

57

m접두사 란 무엇입니까 ?

m멤버 변수 또는 데이터 멤버를 나타냅니다. m비 공용 및 비 정적 필드 에는 접두사를 사용하십시오 .

언제 사용합니까?

private String mCityName;
private float mTemperature;

언제 사용하지 않습니까?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

내가 뭘?

개인적으로는 사용하지 않습니다. 코드가 더 복잡해지고 가독성이 떨어집니다. 코딩에 여전히 메모장을 사용하는 경우 단어가 없지만 최신 IDE는 멤버 및 로컬 변수 또는 다른 것을 강조 표시하고 채색 할 수 있습니다.

결론

사용하다? "예"또는 "아니오"는 개인적인 선택입니다.


1
에 사용할 수도 public static int있지만 : s대신 사용 하십시오. stackoverflow.com/a/49453184/7767664mpublic static int sFirstNumber;
user924 November

31

클래스의 멤버 변수 인 경우 'm'은 'member'를 의미합니다. 많은 Java 프로그래머는 최신 IDE를 사용하지만 강조 표시, 마우스 오버 툴팁 등이 있으므로 필요하지 않습니다.


9
현대 IDE에서도 코드 완성을 사용할 때 클래스의 모든 멤버 변수를 동일한 위치에 가져 오기 위해 멤버 앞에 m 또는 m_을 붙이는 것이 좋습니다. 이것은 수업에서 일할 때 m_ + ctrl space를 눌러 모든 회원의 목록을 얻을 수 있음을 의미합니다.
일러

38
네 일러, 이것을 사용하면 같은 결과를 얻을 수 있습니다. + ctrl space :)
Romain Guy

3
또한 코드 목록을 인쇄하면 도움이됩니다. 도움이 될만한 툴팁이 없습니다 (예, 코드를 인쇄하여 편안한 의자 나 침대에서 가끔 읽습니다).
B. Clay Shannon

3
@domenicop 나는 pro- 접두사가 아니지만 클래스 내에서 속성의 종류를 구별하는 아이디어라고 생각합니다. 즉, 일반적으로 비즈니스 논리 (레코드 클래스)가없는 속성을 포함하는 클래스를 제외하고는 일반적으로 공개 정적이 아닌 속성을 사용하지 않습니다. 이 경우 클래스에 비즈니스 로직이 없으므로 m은 쓸모가 없습니다. 따라서 클래스 외부에서 읽기 쉽도록 제거하는 것이 좋습니다 (이러한 필드를 참조 할 때).
Joffrey

2
필자가 생각하기에 그러한 접두사를 사용하지 않고 필드, 매개 변수 및 변수를 쉽게 구별 할 수 없다면 코드에 문제가 있음을 의미합니다. 클래스 나 메소드가 너무 클 가능성이 높습니다.
Konrad Morawski

9

Clean Code book에 따르면 깨끗한 코드가 아닙니다.

멤버 변수 앞에 m 을 붙일 필요는 없습니다 . 게다가 사람들은 이름의 의미있는 부분을보기 위해 접두사 나 접미사를 무시하는 법을 빨리 배웁니다.


9

당신이 같은 문제가있는 경우

IDE에서 setter / getter를 생성하고 getmName () 및 setmName ()으로 끝납니다.

다음을 수행하는 것을 잊지 마십시오 ( Settings / Editor / Code Style / Java / Code Generation ) :

여기에 이미지 설명을 입력하십시오

업데이트 : 우리는 Kotlin에서 이와 같은 것을 사용하지 않습니다 (그래서 더 이상 접두사를 사용하지 않는 것이 좋습니다)


6

코드 규칙이 사용되는 것은 매우 개별적이라고 생각합니다. 다음 접두사로 변수 이름을 지정하는 것을 선호합니다.

  • m-메소드 변수
  • c-클래스 변수
  • p-매개 변수

그러나 각 프로그래머마다 고유 한 스타일이 있다고 생각합니다.


7
대부분의 Java 개발자는 클래스, 메소드, 정적 및 매개 변수에 서로 다른 시각적 스타일을 설정할 수있는 IDE를 사용한다는 점을 고려할 때 정적 변수 / 메소드에 밑줄이 그어진 클래스, 기울임 꼴의 클래스 변수 등을 갖는 것이 훨씬 더 유용하다는 것을 알았습니다. 당신은 당신의 자신의 글꼴과 색상을 설정할 수 있습니다. 그리고 어떤 접두사를 사용하든 항상 작동 합니다. 물론 IDE를 떠날 때 마술은 사라집니다.
ccpizza 2012 년

4

코드에서 변수 이름을 지정하기 위해이 규칙을 처리해서는 안된다는 것을 증명하기 위해 아래의 부모 Android Studio 에서 스크린 샷을 전달합니다 .

m- 변수를 기본 변수보다 낮추기 위해 특별히 정렬 된 객체 내부의 변수를 찾으십시오 . 따라서 코드에서 "m"접두어로 이름을 지정하면 자신의 힙에 숨길 수 있습니다 .

여기에 이미지 설명을 입력하십시오


3

이 코드 스타일에서 찾은 이점 중 하나는 변수에 대한 참조를 자동 완성하는 동안 "m"을 입력하여 멤버 변수 만 볼 수 있다는 것입니다.


2

앞에서 언급했듯이 다른 변수에 맞게 스타일이 지정됩니다. 또한 코드 생성에 매우 유용합니다. "Alt + Insert"를 누르면 가장 일반적인 코드 생성 속성에 대한 창이 나타납니다. 변수에 대해 "get"메소드를 생성하려는 경우 얻을 수 있습니다.

public class Foo{
   private int bar;

   public int getBar(){
       return this.bar;
   }

   public void setBar(int bar){
       this.bar = bar; 
   }

}

그러나 "m, s"를 선언하면 다음과 같은 결과가 나타납니다.

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

public void setBar(int bar){
   mBar = bar;
}
}

생성자에서 자동으로 생성되고 "m"또는 "s"가 삭제되고 메소드 이름을 가져옵니다. 이 필드 후에 "get"및 "set"은 "m"없이 생성됩니다. Andoroid Fle-> 설정-> 코드 스타일-> Java-> 코드 생성. 그리고 그림과 같이 만드십시오. 아마 도움이 될 것입니다. 내 eng 죄송합니다. 안드로이드 구성


2

'm'으로 멤버 변수를 시작하는 것이 초기 Android / Google 엔지니어의 개인적인 선호로 보였으므로 권장했습니다.

이제이 규칙은 AOSP 기고자가 아닌 회사의 개발자들의 목을 강요하고 있습니다. 단순히 해당 페이지가 Android 코드 스타일 규칙으로 간주되기 때문입니다. 그 규칙에 어떤 이점이 있는지는 거의 없습니다. Google은 삭제를 고려해야합니다. 그렇지 않은 경우 Android 앱의 경우 코드 스타일 규칙 중 어느 것이 선택적인지 지정하십시오.

https://code.google.com/p/android/issues/detail?id=226814 규칙을 삭제하려면이 탄원서에 대한 지원 의견을 추가하십시오


2

가독성을 m위해 sAndroid Studio와 같은 최신 IDE를 사용하는 경우 멤버 변수 및 정적 필드 의 규칙을 더 이상 사용해서는 안됩니다. 안드로이드 스튜디오는 추가하지 않고 그 구별 할 수 있습니다 m또는 s.


1

또한 클래스 / 인스턴스에서 "이 변수는 내 변수이며 다른 사람은이 변수에 접근 할 수 없습니다"라고 말하는 것처럼 "광산"을 나타냅니다. 정적과는 달리 클래스에서만 사용할 수 있지만 해당 클래스의 모든 인스턴스에서 공유 할 수 있습니다. 원을 그리 듯이 각 원의 반지름이 얼마나 큰지 알아야합니다.

    private double mRadius;

동시에 카운터는 서클 클래스 내에서 모든 서클을 추적하기를 원합니다.

    private static int sCircleCount;

그런 다음 현재 회원의 서클 수를 늘리고 줄일 수있는 정적 멤버가 있습니다.


1

다음은 명명 규칙입니다.

  • 공개되지 않은 비 정적 필드 이름은 m으로 시작합니다.
  • 정적 필드 이름은 s로 시작합니다.
  • 다른 필드는 소문자로 시작합니다.
  • 공개 정적 최종 필드 (상수)는 ALL_CAPS_WITH_UNDERSCORES입니다.

예:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.