Por que a maioria dos campos (alunos) no tutorial do Android começa com `m`?

446

Eu sei sobre regras de casos de camelo, mas estou confuso com esta regra. O que significa? Sou desenvolvedor de PHP. "Nós" usamos as primeiras letras das variáveis ​​como indicação do tipo, como 'b' para booleano, 'i' para inteiro e assim por diante.

Sou uma coisa de Java? Significa móvel? misturado?

pambuk
fonte
281
esse prefixo não faz nada além de estragar a legibilidade ...
Dapeng
10
indicando o tipo como um prefixo é ruim e chamado notação húngara ver thc.org/root/phun/unmaintain.html e kernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi
10
porque eles não têm muito conhecimento sobre o estilo do código java para começar
Victor Ionescu
10
Na minha opinião, se você está tendo problemas para diferenciar variáveis ​​locais de variáveis-membro, você tem problemas muito maiores do que estar em conformidade com uma convenção de código. Aqui está a convenção que uso (às vezes): Longa Vida, Longo Nome. Vida curta, nome curto. Não foram confundidos até agora.
Brandon
17
Um verdadeiro prefixo estúpido. Use seu IDE para gerar setters / getters e você terminará com getmName () e setmName ()! Também ferramentas como o Lombok para setters de geração, getters, construtores, etc, irão gerar o prefixo m. Na minha opção, o prefixo m não agrega valor e deve ser removido da convenção de nomenclatura.
userM1433372

Respostas:

551

Esta notação vem das Diretrizes de estilo de código AOSP (Android Open Source Project) para colaboradores :

Siga as convenções de nomenclatura de campo

  • Os nomes de campos não públicos e não estáticos começam com m.
  • Os nomes dos campos estáticos começam com s.
  • Outros campos começam com uma letra minúscula.
  • Campos finais estáticos públicos (constantes) são ALL_CAPS_WITH_UNDERSCORES.

Observe que o guia de estilo vinculado é para que o código seja contribuído para o Projeto de código aberto do Android.

Não é um guia de estilo para o código de aplicativos Android individuais.

xiaobing.zhao
fonte
33
Interessante .. o estilo de código Java do Google realmente contradiz o estilo de código AOSP em relação a isso.
Gautam
51
Eu acho que nesses tempos é um absurdo, especialmente fazê-lo no seu aplicativo! "Suas classes e funções devem ser pequenas o suficiente para que você não precise delas. E você deve usar um ambiente de edição que destaque ou colore os membros para diferenciá-los. Além disso, as pessoas aprendem rapidamente a ignorar o prefixo (ou sufixo) para ver a parte significativa do nome. Quanto mais lemos o código, menos visualizamos os prefixos. Eventualmente, os prefixos se tornam uma confusão invisível e um marcador de código antigo ". - Robert Martin em Clean Code
mikugo
4
Contradiz o Java Style Guide do Google - "Nomes de campo não constantes (estáticos ou não) são escritos em lowerCamelCase. ... Por exemplo, computedValues..."
AlikElzin-kilaka 10/07/16
Para aplicativos individuais, lembro-me de uma boa dica sugerindo o uso de iniciais em minúsculas do nome do aplicativo em vez de 'm'.
abcoep
4
Adicione seu comentário a esta petição para remover a regra code.google.com/p/android/issues/detail?id=226814
likejudo
83

Muitas linhas-guia de codificação usam m para 'membros' de uma classe. Então, quando você está programando, pode ver a diferença entre variáveis ​​locais e membros.

Kolky
fonte
90
Todos os IDEs modernos diferenciam locais e membros por cor / fonte, o que é IMHO muito mais legível que o mprefixo.
Dzmitry Lazerka
5
acordado. Acho a coisa muito chata, mas apenas por causa do IntelliJ ser incrível.
ZakTaccardi
Adicione seu comentário a esta petição para remover a regra code.google.com/p/android/issues/detail?id=226814
likejudo
4
@DzmitryLazerka na maioria das ferramentas de revisão de código, você não tem esse nível de destaque. Por isso, faz sentido em um grande projeto de código aberto.
JWqvist
@DzmitryLazerka, que tal ler código no bloco de notas ou no github e assim por diante?
user924
57

O que é mprefixo?

msignifica variável de membro ou membro de dados. Use o mprefixo para campos não públicos e não estáticos.

Quando usar?

private String mCityName;
private float mTemperature;

Quando não usar?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

O que eu faço?

Pessoalmente, eu não uso. Isso torna o código mais complicado e prejudica a legibilidade. Se você ainda estiver usando o Bloco de Notas para codificação, não tenho palavras, mas os IDEs modernos são capazes de destacar e colorir variáveis ​​de membros e locais ou qualquer outra coisa.

Conclusão

Usar? "Sim" ou "Não" é sua escolha pessoal.

Madan Sapkota
fonte
1
você também pode usá-lo para public static int, mas use em svez de m: public static int sFirstNumber;consulte stackoverflow.com/a/49453184/7767664 #
user924
31

Se são variáveis ​​de membro em classes, o 'm' significa 'membro'. Muitos programadores Java fazem isso, embora com IDEs modernos não seja necessário, pois você tem destaque, dicas de ferramentas sobre o mouse etc.

ahans
fonte
9
Eu diria que, mesmo com um IDE moderno, é bom prefixar membros com m ou m_ com o objetivo de trazer todas as variáveis ​​de membros para uma classe no mesmo local ao usar a conclusão de código. Isso significa que, quando você estiver trabalhando em uma classe, basta pressionar m_ + ctrl space para obter uma lista de todos os membros.
quer
38
Nailer, você pode conseguir o mesmo usando isso. + ctrl space :)
Romain Guy
3
Além disso, se você imprimir a lista de códigos, isso é útil - você não tem as dicas para ajudá-lo (sim, eu gosto de imprimir códigos e lê-los em uma poltrona ou mesmo na cama às vezes).
B. Clay Shannon
3
@ domenicop Eu não sou pró-prefixo, mas acho que a idéia é distinguir entre os tipos de atributos dentro de uma classe. Dito isto, normalmente não uso atributos não estáticos públicos em nenhum lugar, exceto em classes que contêm exclusivamente esses atributos e nenhuma lógica de negócios (classes de registros). Nesse caso, m é inútil, pois não há lógica de negócios na classe. Portanto, é melhor removê-lo para facilitar a leitura fora da classe (quando você faz referência a esses campos).
Joffrey
2
Na minha opinião, se você não consegue distinguir facilmente campos, parâmetros e variáveis ​​sem usar esses prefixos, significa que há algo errado com o código. Muito provavelmente a classe ou o método é muito grande.
Konrad Morawski
9

De acordo com o livro Clean Code, não é um código limpo.

Você não precisa prefixar variáveis ​​de membro com m . Além disso, as pessoas aprendem rapidamente a ignorar o prefixo ou sufixo para ver a parte significativa do nome.

Hamedz
fonte
9

Se você tiver problemas como

seu IDE para gerar setters / getters e você acaba com getmName () e setmName ()

Não se esqueça de fazer o próximo ( Configurações / Editor / Estilo do código / Java / Geração de código ):

insira a descrição da imagem aqui

Atualização: não usamos algo assim no Kotlin (é melhor mudar para ele e não usar mais prefixos)

user924
fonte
6

Eu acho que é muito individual quais convenções de código são usadas. Prefiro nomear minhas variáveis ​​com os seguintes prefixos:

  • m - variáveis ​​de método
  • c - Variáveis ​​de classe
  • p - Variáveis ​​de parâmetro

Mas acho que cada programador tem seu próprio estilo.

Steffen Jørgensen
fonte
7
Considerando que a maioria dos desenvolvedores Java usa IDE, que permite definir estilos visuais diferentes para variáveis ​​de classe, método, estática e parâmetro, acho muito mais útil ter, por exemplo, variáveis ​​/ métodos estáticos sublinhados, variáveis ​​de classe em itálico etc. você pode definir suas próprias fontes e cores. E sempre funcionará, independentemente dos prefixos que você usar. Mas, é claro, a mágica acabou quando você sai do IDE.
Ccpizza
4

Para provar que você definitivamente não deve tratar esta convenção para nomear variáveis ​​em seu código, passo uma captura de tela de um Android Studio pai abaixo.

Encontre que as variáveis ​​dentro de um objeto são classificadas especialmente para colocar variáveis ​​m abaixo das variáveis ​​nativas . Assim, nomeando-os em seu código com o prefixo "m", você os oculta em uma pilha de si mesmo .

insira a descrição da imagem aqui

Zon
fonte
3

O único benefício que encontrei nesse estilo de código é quando, durante um preenchimento automático de alguma referência a uma variável, sei que posso digitar "m" para ver apenas as variáveis ​​de membro.

Janac Meena
fonte
2

Como mencionado anteriormente, ele é denominado para variável diferente. Mas também é muito útil para geração de código. Se você pressionar "Alt + Insert", obterá janelas para as propriedades mais comuns de geração de código. Se você deseja gerar o método "get" para sua variável, receberá.

public class Foo{
   private int bar;

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

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

}

Mas se você declarar "m, s", receberá:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

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

Ele será gerado automaticamente e "m" ou "s" serão excluídos do seu construtor, get, definir o nome dos métodos. Depois disso, "get" 'e "set" para o campo serão gerados sem "m". Andoróide Fle-> Configuração-> Código Estilo-> Java-> Código Genenretion. E faça como na foto. Talvez isso ajude. Desculpe pelo meu eng. Configurar android

IHAFURR
fonte
2

Parece ter sido uma preferência pessoal de alguns dos primeiros engenheiros do Android / Google iniciar variáveis ​​de membro com 'm' e, portanto, eles recomendaram.

Agora, essa regra está sendo forçada a cair na garganta dos desenvolvedores em empresas que não são colaboradores da AOSP, simplesmente porque essa página é considerada uma regra do Android Code Style. Há pouco ou nenhum benefício nessa regra. O Google deve considerar removê-lo. Caso contrário, especifique que, para aplicativos Android, quais das regras de estilo de código são opcionais.

Adicione seu comentário de suporte a esta petição para remover a regra https://code.google.com/p/android/issues/detail?id=226814

likejudo
fonte
2

Por uma questão de legibilidade, a convenção de mvariáveis-membro e scampos estáticos não deve mais ser usada se você estiver usando um IDE moderno como o Android Studio. O Android Studio pode diferenciar aqueles sem adicionar mou s.

aselims
fonte
1

Também pode ser afirmado que significa "meu", como na Classe / Instância está dizendo "Esta variável é minha e ninguém mais pode acessá-la". Diferente de estático, que, embora possa estar disponível apenas para a Classe, é compartilhado por todas as instâncias dessa classe. Como se você estivesse desenhando círculos, precisaria saber o tamanho do raio de cada círculo

    private double mRadius;

mas, ao mesmo tempo, você quer um contador para acompanhar todos os círculos, dentro da classe de círculos que você poderia ter

    private static int sCircleCount;

e, em seguida, basta ter membros estáticos para aumentar e diminuir a contagem dos círculos que você possui atualmente.

jimistephen
fonte
1

A seguir estão as convenções de nomenclatura,

  • Os nomes de campos não públicos e não estáticos começam com m.
  • Os nomes dos campos estáticos começam com s.
  • Outros campos começam com uma letra minúscula.
  • Campos finais estáticos públicos (constantes) são ALL_CAPS_WITH_UNDERSCORES.

Exemplo:

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
fonte