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

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

"Я" - вещь Java? Это означает мобильный? смешанный?


person pambuk    schedule 19.01.2010    source источник
comment
Член, конечно, имеет смысл: D Спасибо!   -  person pambuk    schedule 19.01.2010
comment
этот префикс ничего не делает, кроме как портить читаемость ...   -  person Dapeng    schedule 19.01.2010
comment
указание типа в качестве префикса плохо и называется венгерской нотацией, см. thc.org/root/phun/unmaintain. html и kernel.org/doc/Documentation/CodingStyle.   -  person Muayyad Alsadi    schedule 24.09.2013
comment
потому что они не очень хорошо разбирались в стиле Java-кода, чтобы начать с   -  person Victor Ionescu    schedule 11.10.2013
comment
@pambuk Я запутался, в руководстве по стилю кода Android говорится, что публичным полям не должно предшествовать это. Разве это не общедоступные, нестатические поля, а также поля-члены?   -  person doplumi    schedule 26.10.2013
comment
На мой взгляд, если у вас возникли проблемы с отличием локальных переменных от переменных-членов, у вас есть гораздо более серьезные проблемы, чем соблюдение соглашения о коде. Вот условное обозначение, которое я использую (иногда): долгая жизнь, длинное имя. Короткая жизнь, короткое имя. Пока не запуталась.   -  person Brandon    schedule 19.03.2014
comment
если у вас возникли проблемы с отличием локальных переменных от переменных-членов, у вас совершенно другая проблема.   -  person sschrass    schedule 24.06.2014
comment
Настоящая дурацкая приставка. Используйте свою IDE для создания сеттеров / получателей, и вы получите getmName () и setmName ()! Также такие инструменты, как Lombok для генераторов, геттеров, конструкторов и т. Д., Будут генерировать префикс m. В моем варианте префикс m не добавляет значения и должен быть удален из соглашения об именах.   -  person userM1433372    schedule 07.10.2014
comment
Мир JavaScript прекрасно обходился без этого бесполезного префикса.   -  person Dan Dascalescu    schedule 29.12.2015
comment
Это частный случай Почему имена переменных часто начинаются с буквой "м"?.   -  person Dan Dascalescu    schedule 29.12.2015
comment
@ userM1433372 поверьте мне, что Android IDE достаточно умен, чтобы делать нормальные геттеры / сеттеры для таких переменных и т. д. Так что только ваш комментарий здесь глуп. Вы даже пробовали?   -  person user924    schedule 19.03.2018
comment
@ user924 Извините, тестировался только с IntelliJ / Android Studio, а IntelliJ генерирует сеттеры и геттеры, такие как getmVariable () и setmVariable (). Вы сами это тестировали или используете другой редактор?   -  person userM1433372    schedule 20.03.2018
comment
@ userM1433372 Я использую Android Studio (единственная официальная IDE для разработки под Android). Вы настраивали следующие параметры - Настройки / Редактор / Стиль кода / Java / Генерация кода? postimg.org/image/coxz23utn. IntelliJ также должен иметь это   -  person user924    schedule 23.03.2018
comment
@ userM1433372 также здесь stackoverflow.com/a/49453184/7767664   -  person user924    schedule 23.03.2018


Ответы (14)


Это обозначение взято из стиля кода AOSP (Android Open Source Project) Рекомендации для авторов:

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

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

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

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

person xiaobing.zhao    schedule 16.08.2011
comment
Интересно .. стиль кода Google Java фактически противоречит стилю кода AOSP в этом отношении. - person Gautam; 09.09.2015
comment
Я считаю, что в наше время это ерунда, особенно делать это в своем приложении! Ваши классы и функции должны быть достаточно маленькими, чтобы они вам не понадобились. И вы должны использовать среду редактирования, которая выделяет или раскрашивает элементы, чтобы сделать их отличными. Кроме того, люди быстро учатся игнорировать префикс (или суффикс), чтобы увидеть значимую часть имени. Чем больше мы читаем код, тем меньше видим префиксов. В конце концов префиксы становятся невидимым беспорядком и маркером старого кода. - Роберт Мартин в Чистом коде - person mikugo; 02.01.2016
comment
Противоречит Руководству по стилю Java от Google - Непостоянные имена полей (статические или другие) записываются в lowerCamelCase . ... Например, _1 _... - person AlikElzin-kilaka; 10.07.2016
comment
Добавьте свой комментарий к этой петиции, чтобы удалить правило code.google.com / p / android / issues / detail? id = 226814 - person likejudo; 02.11.2016
comment
Боже, я думаю, что у меня ОКР в коде, я обычно ставлю префикс, поэтому каждое начало моей переменной-члена начинается с m. Мне действительно приятно на них смотреть. Это только я, и да, я знаю это странно ...: / - person Neon Warge; 30.06.2017

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

person Kolky    schedule 19.01.2010
comment
Все современные IDE различают локальных жителей и участников по цвету / шрифту, который, IMHO, более читабелен, чем префикс m. - person Dzmitry Lazerka; 17.09.2014
comment
согласовано. Меня это очень раздражает, но только потому, что IntelliJ потрясающий. - person ZakTaccardi; 07.02.2015
comment
Добавьте свой комментарий к этой петиции, чтобы удалить правило code.google.com / p / android / issues / detail? id = 226814 - person likejudo; 02.11.2016
comment
@DzmitryLazerka в большинстве инструментов проверки кода не имеет такого уровня выделения. Так что это имеет смысл в большом проекте с открытым исходным кодом. - person JWqvist; 13.02.2017
comment
@DzmitryLazerka как насчет чтения кода в блокноте или на гитхабе и так далее? - person user924; 19.11.2018
comment
Я бы сказал, что заниматься Java-разработкой в ​​блокноте крайне неудобно, и не следует делать это в повседневной работе, они просто теряют в производительности без всякой причины. Я могу представить себе редкие случаи, когда IDE недоступна, но зачем нам оптимизировать для этих редких случаев? Github также не является средой разработки, и я считаю, что общие языковые рекомендации не должны зависеть от одного коммерческого инструмента проверки кода, который имеет мало общего с Java / Android. Если они этого хотят, они могут реализовать раскраску на своей стороне, но пока кажется, что это не так уж важно для их пользователей. - person Dzmitry Lazerka; 21.11.2018
comment
@DzmitryLazerka вся IDE, но не все инструменты проверки кода. - person dbardakov; 11.03.2020
comment
Это рекомендуют многие программисты для C и C ++. Это «почти» необходимо в C ++, если вы правильно пишете конструкторы. Никогда не видел такого для Java, где это не нужно. - person user207421; 24.05.2021

Что такое префикс m?

m обозначает переменную-член или элемент данных. Используйте префикс m для закрытых и нестатических полей.

Когда использовать?

private String mCityName;
private float mTemperature;

Когда не использовать?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

Что я делаю?

Лично я им не пользуюсь. Это усложняет код и ухудшает читаемость. Если вы все еще используете Блокнот для кодирования, у меня нет слов, но современные IDE способны выделять и раскрашивать членские и локальные переменные или что-то еще.

Заключение

Использовать? «Да» или «Нет» - ваш личный выбор.

person Madan Sapkota    schedule 04.06.2015
comment
вы также можете использовать его для public static int, но используйте s вместо m: public static int sFirstNumber;, см. stackoverflow.com/a/49453184/7767664 - person user924; 19.11.2018

Если это переменные-члены в классах, «m» означает «член». Многие программисты Java делают это, хотя в современных IDE это не нужно, поскольку у вас есть выделение, подсказки при наведении указателя мыши и т. Д.

person ahans    schedule 19.01.2010
comment
Я бы сказал, что даже в современной среде IDE приятно добавлять к членам префикс m или m_ с целью переноса всех переменных-членов для класса в одно и то же место при использовании автозавершения кода. Это означает, что когда вы работаете в классе, вы можете просто нажать пробел m_ + ctrl, чтобы получить список всех членов. - person Nailer; 19.01.2010
comment
Согласен, я обычно также префикс членов с "m" в Java. Я добавил это последнее предложение, чтобы показать, что все программисты Java не согласны с этим. Например, стиль кодирования Sun не включает префикс «m». - person ahans; 19.01.2010
comment
Найлер, вы можете добиться того же, используя это. + ctrl пробел :) - person Romain Guy; 19.01.2010
comment
Кроме того, если вы распечатаете листинг кода, это будет полезно - у вас нет всплывающих подсказок, которые бы вам помогли (да, мне нравится распечатывать код и читать их в мягком кресле или даже иногда в постели). - person B. Clay Shannon; 13.12.2011
comment
@ahans, я запутался, в руководстве по стилю кода Android говорится, что публичным полям не должно предшествовать это. Разве это не общедоступные, нестатические поля, а также поля-члены? - person doplumi; 26.10.2013
comment
@domenicop Я не про префикс m-, но я предполагаю, что идея состоит в том, чтобы различать типы атрибутов внутри класса. При этом я обычно нигде не использую общедоступные нестатические атрибуты, за исключением классов, которые содержат исключительно эти атрибуты и не используют бизнес-логику (классы записей). В этом случае m бесполезен, поскольку в классе нет бизнес-логики. Поэтому лучше удалить его для удобства чтения вне класса (когда вы ссылаетесь на эти поля). - person Joffrey; 06.03.2014
comment
Мне не нравится это соглашение ... оно приводит к двусмысленности, «более» многословному синтаксису и требует интерпретации. ЯГНИ - person Edward J Beckett; 22.03.2014
comment
На мой взгляд, если вы не можете легко различать поля, параметры и переменные без использования таких префиксов, это означает, что с кодом что-то не так. Скорее всего, класс или метод слишком велик. - person Konrad Morawski; 07.07.2015
comment
Добавьте свой комментарий к этой петиции, чтобы удалить правило code.google.com / p / android / issues / detail? id = 226814 - person likejudo; 02.11.2016

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

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

person Hamedz    schedule 31.01.2016

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

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

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

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

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

person user924    schedule 23.03.2018

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

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

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

person Steffen Jørgensen    schedule 19.01.2010
comment
Учитывая, что большинство разработчиков Java используют IDE, которые позволяют устанавливать различные визуальные стили для переменных класса, метода, статики и параметра, я считаю гораздо более полезным иметь, например, подчеркнутые статические переменные / методы, переменные класса курсивом и т. Д. вы можете установить свои собственные шрифты и цвета. И он всегда будет работать независимо от того, какие префиксы вы используете. Но, конечно, все волшебство исчезает, когда вы покидаете IDE. - person ccpizza; 07.01.2013

Чтобы доказать, что вы определенно не должны использовать это соглашение об именах переменных в своем коде, я передаю снимок экрана из родительской Android Studio ниже.

Найдите эти переменные внутри объекта, специально отсортированные, чтобы поместить m-переменные ниже, чем ваши собственные переменные. Поэтому, называя их в коде префиксом m, вы скрываете их от себя в кучу.

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

person Zon    schedule 20.06.2017

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

person Janac Meena    schedule 18.12.2017

С точки зрения удобочитаемости соглашение m для переменных-членов и s для статических полей больше не должно использоваться, если вы используете современную среду IDE, такую ​​как Android Studio. Android Studio может различать их, не добавляя m или s.

person aselims    schedule 14.03.2016

Как упоминалось ранее, он стилизован под другую переменную. Но также это очень полезно для генерации кода. Если вы нажмете «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. После этого «get» и «set» для поля будут сгенерированы без «m». Andoroid Fle-> Настройка-> Стиль кода-> Java-> Генерация кода. И сделайте как на картинке. Может, это поможет. Извините за мою англ. Настроить android

person IHAFURR    schedule 23.10.2015

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

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

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

person likejudo    schedule 02.11.2016

Также можно указать, что это означает «моя», поскольку в классе / экземпляре говорится: «Эта переменная принадлежит мне, и никто другой не может до нее добраться». В отличие от static, который, хотя он может быть доступен только классу, используется всеми экземплярами этого класса. Например, если вы рисуете круги, вам нужно знать, насколько велик радиус каждого круга.

    private double mRadius;

но в то же время вы хотите, чтобы счетчик отслеживал все круги, внутри класса круга вы могли бы иметь

    private static int sCircleCount;

а затем просто используйте статические элементы, чтобы увеличивать и уменьшать количество кругов, которые у вас есть в настоящее время.

person jimistephen    schedule 03.10.2016

Ниже приведены соглашения об именах.

  • Непубличные нестатические имена полей начинаются с 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;
}
person LopezDevelop    schedule 31.08.2018