¿Por qué la mayoría de los campos (miembros de la clase) en el tutorial de Android comienzan con `m`?

446

Sé sobre reglas de casos de camellos, pero estoy confundido con esta regla m. Que significa? Soy un desarrollador de PHP. "Nosotros" utilizamos las primeras letras de variables como indicación de tipo, como 'b' para booleano, 'i' para entero y así sucesivamente.

¿Es 'm' una cosa de Java? ¿Es sinónimo de móvil? ¿mezclado?

pambuk
fuente
281
ese prefijo no hace más que estropear la legibilidad ...
Dapeng
10
indicando que el tipo como prefijo es incorrecto y se llama notación húngara ver thc.org/root/phun/unmaintain.html y kernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi
10
porque no tenían mucho conocimiento del estilo del código de Java para empezar
Victor Ionescu
10
En mi opinión, si tiene problemas para diferenciar las variables locales de las variables miembro, tiene problemas mucho mayores que conformarse a una convención de código. Aquí está la convención que uso (a veces): Long Life, Long Name. Vida corta, nombre corto. No se ha confundido hasta ahora.
Brandon
17
Un verdadero estúpido prefijo. ¡Usa tu IDE para generar setters / getters y terminarás con getmName () y setmName ()! También las herramientas como Lombok para los generadores, generadores, constructores, etc., generarán el prefijo m. En mi opción, el prefijo m no agrega valor y debe eliminarse de la convención de nomenclatura.
userM1433372

Respuestas:

551

Esta notación proviene de las Directrices de estilo de código de AOSP (Proyecto de código abierto de Android) para contribuyentes :

Siga las convenciones de nomenclatura de campo

  • Los nombres de campo no públicos y no estáticos comienzan con m.
  • Los nombres de campo estático comienzan con s.
  • Otros campos comienzan con una letra minúscula.
  • Los campos finales estáticos públicos (constantes) son ALL_CAPS_WITH_UNDERSCORES.

Tenga en cuenta que la guía de estilo vinculada es para que el código se contribuya al proyecto de código abierto de Android.

No es una guía de estilo para el código de aplicaciones individuales de Android.

xiaobing.zhao
fuente
33
Interesante ... el estilo de código de Java de Google en realidad contradice el estilo de código de AOSP con respecto a esto.
Gautam
51
Creo que en estos tiempos no tiene sentido, ¡especialmente hacerlo en tu aplicación! "Sus clases y funciones deben ser lo suficientemente pequeñas como para que no las necesite. Y debe usar un entorno de edición que resalte o coloree a los miembros para hacerlos distintos. Además, las personas aprenden rápidamente a ignorar el prefijo (o sufijo) para ver la parte significativa del nombre. Cuanto más leemos el código, menos vemos los prefijos. Finalmente, los prefijos se vuelven desorden invisible y un marcador de código más antiguo ". - Robert Martin en Clean Code
mikugo
44
Contradice la Guía de estilo Java de Google : "Los nombres de campo no constantes (estáticos o no) están escritos en lowerCamelCase ... Por ejemplo, computedValues..."
AlikElzin-kilaka
Para aplicaciones individuales, recuerdo un buen consejo que sugiere usar iniciales en minúsculas del nombre de la aplicación en lugar de 'm'.
abcoep
44
Agregue su comentario a esta petición para eliminar la regla code.google.com/p/android/issues/detail?id=226814
likejudo el
83

Muchas líneas de guía de codificación usan m para 'miembros' de una clase. Entonces, cuando está programando, puede ver la diferencia entre las variables locales y las miembros.

Kolky
fuente
90
Todos los IDEs modernos diferencian a los locales y miembros por color / fuente, lo cual es en mi humilde opinión más legible que el mprefijo.
Dzmitry Lazerka
55
convenido. Me parece muy molesto, pero solo porque IntelliJ es increíble.
ZakTaccardi
Agregue su comentario a esta petición para eliminar la regla code.google.com/p/android/issues/detail?id=226814
likejudo el
44
@DzmitryLazerka en la mayoría de las herramientas de revisión de código no tiene este nivel de resaltado. Por lo tanto, tiene sentido en un gran proyecto de código abierto.
JWqvist
@DzmitryLazerka ¿qué pasa con la lectura de código en el bloc de notas o github y así sucesivamente?
usuario924
57

¿Qué es el mprefijo?

msignifica miembro variable o miembro de datos. Utilice el mprefijo para campos no públicos y no estáticos.

¿Cuándo usar?

private String mCityName;
private float mTemperature;

¿Cuándo no usar?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

¿Lo que hago?

Personalmente, no lo uso. Hace que el código sea más complicado y caos la legibilidad. Si todavía está usando el Bloc de notas para la codificación, no tengo palabras, pero los IDE modernos son capaces de resaltar y colorear las variables miembro y locales o cualquier otra cosa.

Conclusión

¿Utilizar? "Sí" o "No" es su elección personal.

Madan Sapkota
fuente
1
también puede usarlo public static int, pero use en slugar de m: public static int sFirstNumber;consulte stackoverflow.com/a/49453184/7767664
user924
31

Si se trata de variables miembro en clases, la 'm' significa 'miembro'. Muchos programadores de Java hacen eso, aunque con IDEs modernos no es necesario ya que tiene resaltado, mouse sobre información sobre herramientas, etc.

ahans
fuente
99
Yo diría que incluso con un IDE moderno es bueno prefijar miembros con m o m_ con el fin de mostrar todas las variables miembro para una clase en el mismo lugar cuando se usa la finalización de código. Esto significa que cuando trabajas en una clase, puedes presionar m_ + ctrl para obtener una lista de todos los miembros.
Nailer
38
Nailer, podrías lograr lo mismo usando esto. + ctrl space :)
Romain Guy
3
Además, si imprime la lista de códigos, es útil: no tiene la información sobre herramientas para ayudarlo (sí, me gusta imprimir el código y leerlos en un sillón o incluso en la cama a veces).
B. Clay Shannon
3
@domenicop No soy un prefijo pro m, sin embargo, supongo que la idea es distinguir entre los tipos de atributos dentro de una clase. Dicho esto, generalmente no uso atributos públicos no estáticos en ninguna parte, excepto en clases que contienen exclusivamente esos atributos y no lógica de negocios (clases de registros). En este caso, el m es inútil ya que no hay lógica de negocios en la clase. Por lo tanto, es mejor eliminarlo para facilitar la lectura fuera de la clase (cuando hace referencia a estos campos).
Joffrey
2
En mi opinión, si no puede distinguir fácilmente entre campos, parámetros y variables sin usar dichos prefijos, significa que hay algo mal con el código. Lo más probable es que la clase o el método sea demasiado grande.
Konrad Morawski
9

Según el libro Clean Code, no es un código limpio.

No necesita prefijar las variables miembro con m . Además, las personas aprenden rápidamente a ignorar el prefijo o sufijo para ver la parte significativa del nombre.

Hamedz
fuente
9

Si tienes problemas como

tu IDE para generar setters / getters y terminas con getmName () y setmName ()

No olvide hacer lo siguiente ( Configuración / Editor / Estilo de código / Java / Generación de código ):

ingrese la descripción de la imagen aquí

Actualización: no usamos algo como esto en Kotlin (por lo que es mejor cambiar a él y no usar prefijos más)

usuario924
fuente
6

Creo que es muy individual qué convenciones de código se utilizan. Prefiero nombrar mis variables con los siguientes prefijos:

  • m - Variables del método
  • c - Variables de clase
  • p - Variables de parámetros

Pero supongo que cada programador tiene su propio estilo.

Steffen Jørgensen
fuente
77
Teniendo en cuenta que la mayoría de los desarrolladores de Java usan IDE que permiten configurar diferentes estilos visuales para las variables de clase, método, estática y parámetro, me resulta mucho más útil tener, por ejemplo, variables / métodos estáticos subrayados, variables de clase en cursiva, etc. Y, por supuesto, puedes configurar tus propias fuentes y colores. Y siempre funcionará sin importar los prefijos que use. Pero, por supuesto, la magia desaparece cuando dejas el IDE.
ccpizza
4

Para demostrar que definitivamente no debe tratar esta convención para nombrar variables en su código, le paso una captura de pantalla de un Android Studio principal a continuación.

Encuentra las variables dentro de un objeto especialmente ordenadas para poner las variables m más bajas que tus variables nativas . Entonces, al nombrarlos en su código con el prefijo "m", los oculta en un montón de usted mismo .

ingrese la descripción de la imagen aquí

Zon
fuente
3

El único beneficio que encontré de este estilo de código es cuando durante un autocompletado de alguna referencia a una variable, sé que puedo escribir "m" para ver solo las variables miembro.

Janac Meena
fuente
2

Como se mencionó anteriormente, está diseñado para diferentes variables. Pero también es muy útil para la generación de código. Si presiona "Alt + Insertar" obtendrá ventanas para las propiedades de generación de código más comunes. Si desea generar el método "get" para su variable, obtendrá.

public class Foo{
   private int bar;

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

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

}

Pero si declaras "m, s" obtendrás:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

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

Se generará automáticamente y se eliminará "m" o "s" del constructor, get, set nombre de métodos. Después de esto, "get" 'y "set" para el campo se generarán sin "m". Andoroid Fle-> Setting-> Code Style-> Java-> Code Genenretion. Y hacer como en una foto. Tal vez te ayude. Perdón por mi eng. Configurar android

IHAFURR
fuente
2

Parece haber sido una preferencia personal de algunos de los primeros ingenieros de Android / Google comenzar las variables miembro con 'm', por lo que lo recomendaron.

Ahora, esta regla está siendo forzada por los desarrolladores de empresas que no son contribuyentes de AOSP, simplemente porque esa página se considera reglas de estilo de código de Android. Hay poco o ningún beneficio en esa regla. Google debería considerar eliminarlo. De lo contrario, especifique que para las aplicaciones de Android cuáles de las reglas de estilo de código son opcionales.

Agregue su comentario de apoyo a esta petición para eliminar la regla https://code.google.com/p/android/issues/detail?id=226814

likejudo
fuente
2

Como cuestión de legibilidad, la convención de las mvariables miembro y slos campos estáticos ya no se deben usar si está utilizando un IDE moderno como Android Studio. Android Studio puede diferenciar entre aquellos sin agregar mo s.

aselims
fuente
1

También se puede afirmar que significa "mío", ya que en la Clase / Instancia se dice "Esta variable es mía y nadie más puede acceder a ella". Diferente al estático que, si bien puede estar disponible solo para la Clase, todas las instancias de esa clase lo comparten. Como si estuvieras dibujando círculos, necesitarías saber qué tan grande es el radio de cada círculo

    private double mRadius;

pero al mismo tiempo desea un contador para realizar un seguimiento de todos los círculos, dentro de la clase de círculo que podría tener

    private static int sCircleCount;

y luego solo tienes miembros estáticos para aumentar y disminuir la cuenta de los círculos que tienes actualmente.

jimistephen
fuente
1

Las siguientes son las convenciones de nomenclatura,

  • Los nombres de campo no públicos y no estáticos comienzan con m.
  • Los nombres de campo estático comienzan con s.
  • Otros campos comienzan con una letra minúscula.
  • Los campos finales estáticos públicos (constantes) son ALL_CAPS_WITH_UNDERSCORES.

Ejemplo:

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;
}
LopezDevelop
fuente