Perché la maggior parte dei campi (membri della classe) nel tutorial di Android iniziano con `m`?


446

Conosco le regole del caso dei cammelli, ma sono confuso con questa regola. Cosa significa? Sono uno sviluppatore PHP. "Noi" usiamo le prime lettere di variabili come indicazione di tipo, come 'b' per booleano, 'i' per intero e così via.

'M' è una cosa di Java? Sta per mobile? misto?


281
quel prefisso non fa altro che rovinare la leggibilità ...
Dapeng,

10
indica che il tipo come prefisso è errato e chiamato notazione ungherese vedi thc.org/root/phun/unmaintain.html e kernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi

10
perché non avevano molta conoscenza dello stile del codice java per cominciare
Victor Ionescu,

10
A mio avviso, se hai problemi a differenziare le variabili locali dalle variabili dei membri, hai problemi molto più grandi rispetto alla conformità a una convenzione di codice. Ecco la convenzione che uso (a volte): Long Life, Long Name. Vita breve, nome breve. Finora non sono stato confuso.
Brandon,

17
Un vero stupido prefisso. Usa il tuo IDE per generare setter / getter e finisci con getmName () e setmName ()! Anche strumenti come Lombok per setter di generazione, getter, contruttori ecc. Genereranno il prefisso m. Nella mia opzione il prefisso m non aggiunge valore e dovrebbe essere rimosso dalla convenzione di denominazione.
userM1433372

Risposte:


552

Questa notazione proviene dalle linee guida sullo stile di codice AOSP (Android Open Source Project) per i collaboratori :

Seguire le convenzioni di denominazione dei campi

  • I nomi dei campi non pubblici e non statici iniziano con m.
  • I nomi dei campi statici iniziano con s.
  • Altri campi iniziano con una lettera minuscola.
  • I campi finali statici pubblici (costanti) sono ALL_CAPS_WITH_UNDERSCORES.

Si noti che la guida di stile collegata è per il contributo del codice al progetto Open Source Android.

Non è una guida di stile per il codice delle singole app Android.


33
Interessante ... lo stile di codice Java di Google in realtà contraddice lo stile di codice AOSP al riguardo.
Gautam,

51
Penso che in questi tempi sia una sciocchezza, soprattutto farlo nella tua app! "Le tue classi e funzioni dovrebbero essere abbastanza piccole da non averne bisogno. E dovresti utilizzare un ambiente di modifica che evidenzi o colora i membri per renderli distinti. Inoltre, le persone imparano rapidamente a ignorare il prefisso (o suffisso) per vedere la parte significativa del nome. Più leggiamo il codice, meno vediamo i prefissi. Alla fine i prefissi diventano disordine invisibile e un indicatore di codice più vecchio. " - Robert Martin in codice pulito
mikugo

4
Contraddice la Guida allo stile Java di Google - "I nomi dei campi non costanti (statici o di altro tipo) sono scritti in lowerCamelCase. ... Ad esempio, computedValues..."
AlikElzin-kilaka

Per le singole app, ricordo un bel suggerimento che suggerisce di usare le iniziali minuscole del nome dell'app anziché "m".
circa

4
Aggiungi il tuo commento a questa petizione per rimuovere la regola code.google.com/p/android/issues/detail?id=226814
likejudo,

83

Molte linee guida per la codifica usano m per "membri" di una classe. Quindi, quando stai programmando, puoi vedere la differenza tra variabili locali e variabili membro.


90
Tutti gli IDE moderni differenziano i locali e i membri per colore / carattere, che è IMHO molto più leggibile rispetto al mprefisso.
Dzmitry Lazerka,

5
concordato. Trovo la cosa molto fastidiosa, ma solo perché IntelliJ è fantastico.
ZakTaccardi,

Aggiungi il tuo commento a questa petizione per rimuovere la regola code.google.com/p/android/issues/detail?id=226814
likejudo,

4
@DzmitryLazerka nella maggior parte degli strumenti di revisione del codice non hai questo livello di evidenziazione. Quindi ha senso in un grande progetto open source.
JWqvist,

@DzmitryLazerka che ne dici di leggere il codice nel blocco note o github e così via?
user924

57

Che cos'è il mprefisso?

msta per variabile membro o membro dati. Utilizzare il mprefisso per i campi non pubblici e non statici.

Quando usare?

private String mCityName;
private float mTemperature;

Quando non usare?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

Quello che faccio?

Personalmente, non lo uso. Rende il codice più complicato e caos la leggibilità. Se stai ancora utilizzando Blocco note per la codifica, non ho parole, ma gli IDE moderni sono in grado di evidenziare e colorare le variabili locali e locali o qualsiasi altra cosa.

Conclusione

Uso? "Sì" o "No" è una tua scelta personale.


1
è anche possibile utilizzarlo per public static int, ma utilizzare sinvece di m: public static int sFirstNumber;, vedi stackoverflow.com/a/49453184/7767664
user924

31

Se si tratta di variabili membro nelle classi, "m" significa "membro". Molti programmatori Java lo fanno, anche se con gli IDE moderni non è necessario dato che hai evidenziazione, suggerimenti del mouse sopra, ecc.


9
Direi che anche con un IDE moderno è bello anteporre ai membri m o m_ allo scopo di far apparire tutte le variabili membro per una classe nello stesso posto quando si usa il completamento del codice. Ciò significa che quando lavori in una classe puoi semplicemente premere m_ + ctrl space per ottenere un elenco di tutti i membri.
Nailer,

38
Nailer, potresti ottenere lo stesso usando questo. + spazio ctrl :)
Romain Guy,

3
Inoltre, se stampi l'elenco dei codici, questo è utile - non hai i suggerimenti per aiutarti là fuori (sì, mi piace stampare il codice e leggerli su una poltrona o anche a letto a volte).
B. Clay Shannon,

3
@domenicop Non sono un pro prefisso, tuttavia suppongo che l'idea sia quella di distinguere i tipi di attributi all'interno di una classe. Detto questo, di solito non uso attributi pubblici non statici da nessuna parte, tranne nelle classi che contengono esclusivamente quegli attributi e nessuna logica aziendale (classi di record). In questo caso, la m è inutile in quanto non esiste una logica aziendale nella classe. Pertanto, è meglio rimuoverlo per leggibilità al di fuori della classe (quando si fa riferimento a questi campi).
Joffrey,

2
Secondo me se non riesci a distinguere facilmente tra campi, parametri e variabili senza usare tali prefissi, significa che c'è qualcosa di sbagliato nel codice. Molto probabilmente la classe o il metodo sono troppo grandi.
Konrad Morawski,

9

Secondo il Clean Code book, non è un codice pulito.

Non è necessario aggiungere il prefisso alle variabili membro con m . Inoltre, le persone imparano rapidamente a ignorare il prefisso o il suffisso per vedere la parte significativa del nome.


9

Se hai problemi come

il tuo IDE per generare setter / getter e finisci con getmName () e setmName ()

Non dimenticare di fare il prossimo ( Impostazioni / Editor / Stile codice / Java / Generazione di codice ):

inserisci qui la descrizione dell'immagine

Aggiornamento: non usiamo qualcosa di simile in Kotlin (quindi è meglio passare ad esso e non usare più i prefissi)


6

Penso che sia molto individuale quali convenzioni di codice vengano utilizzate. Preferisco nominare le mie variabili con i seguenti prefissi:

  • m - Variabili del metodo
  • c - Variabili di classe
  • p - Variabili dei parametri

Ma immagino che ogni programmatore abbia il suo stile.


7
Considerando che la maggior parte degli sviluppatori Java usano IDE che consentono di impostare diversi stili visivi per variabili di classe, metodo, statico e parametro, trovo molto più utile avere ad esempio variabili / metodi statici sottolineati, variabili di classe in corsivo, ecc. E ovviamente potresti impostare i tuoi caratteri e colori. E funzionerà sempre, indipendentemente dai prefissi che usi. Ma, naturalmente, la magia è sparita quando lasci l'IDE.
ccpizza,

4

Per dimostrare che sicuramente non dovresti trattare questa convenzione per la denominazione delle variabili nel tuo codice, passo uno screenshot da un Android Studio padre di seguito.

Trova che le variabili all'interno di un oggetto siano ordinate in modo speciale per mettere le variabili m inferiori alle variabili native . Quindi, nominandoli nel tuo codice con il prefisso "m", li nascondi in un mucchio da te stesso .

inserisci qui la descrizione dell'immagine


3

L'unico vantaggio che ho riscontrato di questo stile di codice è quando durante un completamento automatico di alcuni riferimenti a una variabile, so che posso digitare "m" per vedere solo le variabili membro.


2

Come accennato in precedenza, è progettato per diverse variabili. Ma è anche molto utile per la generazione di codice. Se premi "Alt + Inserisci" otterrai finestre per le proprietà più comuni di generazione del codice. Se vuoi generare il metodo "get" per la tua variabile, otterrai.

public class Foo{
   private int bar;

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

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

}

Ma se dichiari "m, s" otterrai:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

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

Verrà generato automaticamente e "m" o "s" eliminati dal costruttore, ottenere, impostare il nome dei metodi. Dopo questo "get" 'e "set" per il campo verranno generati senza "m". Andoroid Fle-> Setting-> Code Style-> Java-> Code Genenretion. E fai come in una foto. Forse aiuterà. Scusa per il mio ing. Configura Android


2

Sembra essere stata una preferenza personale di alcuni dei primi ingegneri Android / Google per iniziare le variabili membro con 'm' e quindi lo hanno raccomandato.

Ora questa regola è stata forzata alla gola degli sviluppatori in aziende che non sono né contributori AOSP, semplicemente perché quella pagina è considerata regole di stile codice Android. C'è poco o nessun beneficio in quella regola. Google dovrebbe prendere in considerazione la rimozione. In caso contrario, specificare che per le app Android quali delle Regole di stile del codice sono facoltative.

Aggiungi il tuo commento di supporto a questa petizione per rimuovere la regola https://code.google.com/p/android/issues/detail?id=226814


2

Per motivi di leggibilità, la convenzione di mvariabili membro e scampi statici non deve più essere utilizzata se si utilizza un IDE moderno come Android Studio. Android Studio può distinguere tra quelli senza aggiungere mo s.


1

Si può anche affermare che sta per "mio", come in Class / Instance sta dicendo "Questa variabile è mia e nessun altro può accedervi". Diverso da statico che, sebbene possa essere disponibile solo per la classe, è condiviso da tutte le istanze di quella classe. Come se disegnassi dei cerchi, dovresti sapere quanto è grande il raggio di ciascun cerchio

    private double mRadius;

ma allo stesso tempo vuoi che un contatore tenga traccia di tutti i cerchi, all'interno della classe del cerchio che potresti avere

    private static int sCircleCount;

e quindi hai solo membri statici per aumentare e ridurre il conteggio delle cerchie che hai attualmente.


1

Di seguito sono riportate le convenzioni di denominazione,

  • I nomi dei campi non pubblici e non statici iniziano con m.
  • I nomi dei campi statici iniziano con s.
  • Altri campi iniziano con una lettera minuscola.
  • I campi finali statici pubblici (costanti) sono ALL_CAPS_WITH_UNDERSCORES.

Esempio:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.