Чому більшість полів (учасників класу) в підручнику для Android починаються з `m`?


446

Я знаю про правила справи з верблюдами, але я плутаю це правило. Що це означає? Я розробник PHP. "Ми" використовуємо перші літери змінних як вказівку типу, наприклад, "b" для булевих, "i" для цілих чисел тощо.

Це "я" річ Java? Чи означає це мобільний телефон? змішаний?


281
цей префікс не робить нічого, крім того, щоб зіпсувати читабельність ...
Dapeng

10
вказівка ​​типу префікса є поганою і називається угорською позначенням див. thc.org/root/phun/unmaintain.html та kernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi

10
тому що вони не мали багато знань про стиль коду Java
Віктор Іонеску

10
На мою думку, якщо у вас виникають проблеми з диференціацією локальних змінних від змінних членів, у вас є набагато більші проблеми, ніж відповідність конвенції коду. Ось умова, яку я використовую (іноді): Довге життя, Довге ім'я. Коротке життя, коротке ім'я. Досі його не плутали.
Брендон

17
Справжня дурна приставка. Використовуйте свій IDE для створення сетерів / getters, і ви отримуєте getmName () та setmName ()! Також такі інструменти, як Lombok для генераторів сетерів, геттерів, кондукторів тощо, будуть генерувати префікс m. У моєму варіанті префікс m не додає значення, і його слід видалити з конвенції про іменування.
користувачM1433372

Відповіді:


552

Ця позначення походить з правил керівництва стилем коду AOSP (Android Open Source) для учасників :

Дотримуйтесь конвенцій про іменування поля

  • Непублічні, нестатичні назви полів починаються з m.
  • Назви статичних полів починаються з s.
  • Інші поля починаються з малої літери.
  • Публічні статичні кінцеві поля (константи) - ALL_CAPS_WITH_UNDERSCORES.

Зауважте, що пов’язаний посібник зі стилем призначений для внесення коду до проекту з відкритим кодом Android.

Це не посібник зі стилем для коду окремих програм для Android.


33
Цікаво .. Стиль коду Google Java насправді суперечить цьому стилю коду AOSP .
Гаутам

51
Я думаю, що в ці часи це нісенітниця, особливо робити це у своєму додатку! "Ваші класи та функції повинні бути досить маленькими, щоб вони вам не потрібні. І ви повинні використовувати середовище редагування, яке виділяє або забарвлює членів, щоб зробити їх відмінними. Крім того, люди швидко вчаться ігнорувати префікс (або суфікс), щоб побачити змістовна частина імені. Чим більше ми читаємо код, тим менше ми бачимо префікси. Зрештою префікси стають небаченими безладом і маркером старого коду ". - Роберт Мартін у "
Чистому

4
Суперечить керівництву Java по стилю Java - " Нестабільні назви полів (статичні чи інші) записуються в нижнійCamelCase. Наприклад, computedValues..."
AlikElzin-kilaka

Для окремих додатків я пам’ятаю приємну пораду, що пропонує використовувати малі ініціали імені програми замість «m».
приблизно

4
Додайте свій коментар до цієї петиції, щоб видалити правило code.google.com/p/android/isissue/detail?id=226814
likejudo

83

Дуже багато керівних ліній кодування використовують m для 'членів' класу. Отже, коли ви програмуєте, ви можете бачити різницю між локальними та членами змінних.


90
Усі сучасні IDE розрізняють місцевих жителів та членів за кольором / шрифтом, що IMHO набагато читає, ніж mпрефікс.
Дмитро Лазерка

5
домовились. Мені здається, що це дуже дратує, але тільки тому, що IntelliJ є приголомшливим.
ZakTaccardi

Додайте свій коментар до цієї петиції, щоб видалити правило code.google.com/p/android/isissue/detail?id=226814
likejudo

4
@DzmitryLazerka у більшості засобів перегляду коду u не мають такого рівня виділення. Тож це має сенс у великому проекті з відкритим кодом.
JWqvist

@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замість m: public static int sFirstNumber;см stackoverflow.com/a/49453184/7767664
user924

31

Якщо це змінні елементи в класах, 'm' означає 'member'. Багато Java-програмісти роблять це, хоча для сучасних IDE це не потрібно, оскільки у вас є виділення, вказівник миші та підказки тощо.


9
Я заперечую, що навіть із сучасним IDE приємно встановлювати префікси членів m або m_ з метою виведення всіх змінних членів для класу в одному місці при використанні завершення коду. Це означає, що працюючи в класі, ви можете просто натиснути пробіл m_ + ctrl, щоб отримати список всіх учасників.
Nailer

38
Nailer, ти можеш досягти цього, скориставшись цим. + ctrl space :)
Ромен Гай

3
Крім того, якщо ви роздруковуєте список кодів, це корисно - у вас немає підказок, щоб допомогти вам там (так, мені подобається роздрукувати код і читати їх у легкому кріслі або навіть у ліжку часом).
Б. Клей Шеннон

3
@domenicop Я не pro-префікс, однак я думаю, що ідея полягає в тому, щоб розрізняти види атрибутів у класі. При цьому я зазвичай ніде не використовую публічні нестатичні атрибути, за винятком класів, які містять виключно ті атрибути і не мають ділової логіки (класи записів). У цьому випадку m є марним, оскільки у класі відсутня ділова логіка. Тому краще видалити його для читабельності поза класом (коли ви посилаєтесь на ці поля).
Джоффрі

2
На мою думку, якщо ви не можете легко розрізнити поля, параметри та змінні без використання таких префіксів, це означає, що з кодом щось не так. Швидше за все, клас або метод просто занадто великий.
Конрад Моравський

9

Згідно книги «Чистий код», це не чистий код.

Не потрібно префіксувати змінні члена з m . Крім того, люди швидко вчаться ігнорувати префікс або суфікс, щоб побачити змістовну частину імені.


9

Якщо у вас є такі проблеми

ваш IDE для створення сетерів / getters, і ви отримуєте getmName () та setmName ()

Не забудьте зробити наступне ( Налаштування / Редактор / Стиль коду / Генерація Java / Коду ):

введіть тут опис зображення

Оновлення: ми не використовуємо щось подібне в Котліні (тому краще перейти на нього і більше не використовувати префікси)


6

Я вважаю, що дуже індивідуально, які кодові угоди використовуються. Я вважаю за краще називати свої змінні такими префіксами:

  • m - змінні методу
  • c - змінні класу
  • p - змінні параметра

Але я здогадуюсь, що кожен програміст має свій стиль.


7
Враховуючи, що більшість Java-розробників використовують IDE, що дозволяє встановлювати різні візуальні стилі для змінних класу, методу, статики та параметрів, я вважаю, що набагато корисніше, наприклад, підкреслювати статичні змінні / методи, курсові змінні курсивом тощо. І звичайно Ви можете встановити власні шрифти та кольори. І це завжди працюватиме незалежно від того, якими префіксами ви користуєтесь. Але, звичайно, магія все пропала, коли ви покинете ІДЕ.
ccpizza

4

Щоб довести, що ви визначено не повинні ставитися до цієї конвенції щодо іменування змінних у своєму коді, я передаю скріншот з батьківської Android Studio за цим документом.

Знайдіть, що змінні всередині об'єкта спеціально відсортовані, щоб m-змінні ставили нижче, ніж ваші нативні змінні . Отже, називаючи їх у своєму коді з префіксом «m», ви ховаєте їх у купу від себе .

введіть тут опис зображення


3

Єдине перевагу, яке я знайшов у цьому стилі коду, - це коли під час автоматичного заповнення деякої посилання на змінну я знаю, що можу набрати "m", щоб побачити лише змінні учасника.


2

Як було сказано раніше, він призначений для різних змінних. Але також це дуже корисно для генерації коду. Якщо натиснути "Alt + Insert", ви отримаєте вікна для найбільш поширених властивостей генерації коду. Якщо ви хочете створити метод "отримати" для вашої змінної, ви отримаєте.

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-> Генерація коду. І зробити як на малюнку. Можливо, це допоможе. Вибачте за мою англ. Налаштувати андроїд


2

Здається, було особистим уподобанням деяких ранніх інженерів Android / Google запускати змінні учасники з «m», тому вони рекомендували це.

Тепер це правило змушується забивати горло розробникам у компаніях, які не є жодними учасниками AOSP, просто тому, що ця сторінка вважається правилами Android Code Style. З цього правила мало користі. Google повинен розглянути можливість її видалення. В іншому випадку вкажіть, що для програм Android, які з правил стилю коду не є обов'язковими.

Додайте свій коментар підтримки до цієї петиції, щоб видалити правило https://code.google.com/p/android/isissue/detail?id=226814


2

Що стосується читабельності, конвенція mщодо змінних членів та sстатичних полів більше не повинна використовуватися, якщо ви використовуєте сучасний IDE, як Android Studio. Android Studio може розрізняти ті, не додаючи 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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.