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


446

Я знаю о правилах использования верблюдов, но меня смущает это правило. Что это значит? Я разработчик PHP. «Мы» используем первые буквы переменных в качестве указания типа, например, «b» для логического значения, «i» для целого числа и так далее.

«Я» вещь Java? Это стоит для мобильного телефона? смешанная?


281
этот префикс не делает ничего, кроме как портит читабельность ...
Дапенг

10
указание типа в качестве префикса неверно и называется венгерской нотацией, см. thc.org/root/phun/unmaintain.html и kernel.org/doc/Documentation/CodingStyle
Муайяд Алсади

10
потому что у них не было большого знания стиля кода Java с самого начала
Виктор Ионеску

10
По моему мнению, если у вас возникают проблемы с дифференциацией локальных переменных от переменных-членов, у вас гораздо большие проблемы, чем в соответствии с соглашением о коде. Вот соглашение, которое я использую (иногда): Long Life, Long Name. Короткая жизнь, короткое имя. До сих пор не был смущен.
Брэндон

17
Настоящий глупый префикс. Используйте вашу IDE для генерации сеттеров / геттеров, и вы получите getmName () и setmName ()! Также такие инструменты, как Lombok для генераторов, геттеров, конструкторов и т. Д. Будут генерировать префикс m. В моем варианте префикс m не добавляет значения и должен быть удален из соглашения об именах.
userM1433372

Ответы:


552

Эта нотация взята из Руководства по стилю кода AOSP (Android Open Source Project) для участников :

Следуйте правилам именования полей

  • Непубличные, нестатические имена полей начинаются с m.
  • Имена статических полей начинаются с s.
  • Другие поля начинаются со строчной буквы.
  • Открытые статические конечные поля (константы) являются ALL_CAPS_WITH_UNDERSCORES.

Обратите внимание, что руководство по связанному стилю предназначено для добавления кода в проект Android с открытым исходным кодом.

Это не руководство по стилю для кода отдельных приложений Android.


33
Интересно ... Стиль кода Google Java фактически противоречит стилю кода AOSP в этом отношении.
Гаутам

51
Я думаю, что в эти времена это чепуха, особенно делать это в своем приложении! «Ваши классы и функции должны быть достаточно маленькими, чтобы они вам не нужны. И вы должны использовать среду редактирования, которая выделяет или раскрашивает элементы, чтобы выделить их. Кроме того, люди быстро учатся игнорировать префикс (или суффикс), чтобы видеть значимая часть имени. Чем больше мы читаем код, тем меньше мы видим префиксы. В конце концов префиксы становятся невидимым беспорядком и маркером старого кода ». - Роберт Мартин в Чистом коде
mikugo

4
Противоречит руководству Google по стилю Java - «Непостоянные имена полей (статические или иные) записываются в lowerCamelCase. ... Например, computedValues...»
AlikElzin-kilaka

Для отдельных приложений я помню хороший совет, предлагающий использовать строчные буквы названия приложения вместо «m».
около

4
Добавьте свой комментарий к этой петиции, чтобы удалить правило code.google.com/p/android/issues/detail?id=226814
likejudo

83

Многие строки руководства по кодированию используют m для «членов» класса. Поэтому, когда вы программируете, вы можете видеть разницу между локальными и переменными-членами


90
Все современные IDE различают локальных и участников по цвету / шрифту, что, IMHO, более читабельно, чем mпрефикс.
Дмитрий Лазерка

5
согласовано. Я нахожу эту вещь очень раздражающей, но только потому, что IntelliJ потрясающий.
ZakTaccardi

Добавьте свой комментарий к этой петиции, чтобы удалить правило code.google.com/p/android/issues/detail?id=226814
likejudo

4
@DzmitryLazerka в большинстве инструментов просмотра кода не имеет такого уровня выделения. Так что это имеет смысл в большом проекте с открытым исходным кодом.
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» означает «член». Многие Java-программисты делают это, хотя в современных IDE это не нужно, поскольку у вас есть подсветка, всплывающие подсказки и т. Д.


9
Я бы сказал, что даже в современной среде IDE было бы неплохо добавлять в члены префикс m или m_ для того, чтобы все переменные-члены класса были в одном месте при использовании автозавершения кода. Это означает, что когда вы работаете в классе, вы можете просто нажать пробел m_ + ctrl, чтобы получить список всех членов.
Nailer

38
Nailer, ты мог бы добиться того же, используя это. + ctrl пробел :)
Romain Guy

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

3
@domenicop Я не профессиональный префикс, однако я предполагаю, что идея состоит в том, чтобы различать типы атрибутов в классе. При этом я обычно нигде не использую публичные нестатические атрибуты, за исключением классов, которые содержат исключительно эти атрибуты и не содержат бизнес-логики (классы записей). В этом случае m бесполезен, так как в классе нет бизнес-логики. Поэтому лучше удалить его для удобства чтения вне класса (когда вы ссылаетесь на эти поля).
Джоффри

2
По моему мнению, если вы не можете легко отличить поля, параметры и переменные без использования таких префиксов, это означает, что с кодом что-то не так. Скорее всего, класс или метод слишком велики.
Конрад Моравский

9

Согласно книге «Чистый код», это не чистый код.

Вам не нужно добавлять префикс членских переменных к m . Кроме того, люди быстро учатся игнорировать префикс или суффикс, чтобы увидеть значимую часть имени.


9

Если у вас есть проблемы, такие как

ваша IDE для генерации сеттеров / геттеров, и вы получите getmName () и setmName ()

Не забудьте сделать следующее ( Настройки / Редактор / Стиль кода / Java / Генерация кода ):

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

Обновление: мы не используем что-то подобное в Kotlin (поэтому лучше переключиться на него и больше не использовать префиксы)


6

Я думаю, это очень индивидуально, какие соглашения кода используются. Я предпочитаю называть мои переменные следующими префиксами:

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

Но я думаю, что у каждого программиста свой стиль.


7
Учитывая, что большинство разработчиков Java используют IDE, которые позволяют устанавливать различные визуальные стили для переменных класса, метода, статики и параметров, я считаю гораздо более полезным иметь, например, подчеркнутые статические переменные / методы, переменные класса курсивом и т. Д. И, конечно, Вы можете установить свои собственные шрифты и цвета. И это всегда будет работать независимо от того, какие префиксы вы используете. Но, конечно, магия исчезла, когда вы покидаете IDE.
ccpizza

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-> Setting-> Code Style-> Java-> Code Genenretion. И сделай как на картинке. Может быть, это поможет. Извините за мой англ. Настроить андроид


2

Кажется, некоторые ранние инженеры Android / Google предпочитали начинать переменные-члены с «m», и поэтому они рекомендовали это.

Теперь это правило навязывается разработчикам в компаниях, которые не являются участниками AOSP, просто потому, что эта страница считается правилами стиля кода Android. В этом правиле мало пользы. Google должен рассмотреть возможность его удаления. В противном случае, укажите, что для Android-приложений какое из правил стиля кода является необязательным.

Добавьте свой комментарий поддержки в эту петицию, чтобы удалить правило https://code.google.com/p/android/issues/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.