Warum beginnen die meisten Felder (Klassenmitglieder) im Android-Tutorial mit "m"?

446

Ich kenne Kamelfallregeln, bin aber mit dieser Regel verwirrt. Für was steht das? Ich bin ein PHP-Entwickler. "Wir" verwenden erste Buchstaben von Variablen als Typangabe, wie 'b' für Boolesche Werte, 'i' für Ganzzahlen und so weiter.

Ist 'm' eine Java-Sache? Steht es für Handy? gemischt?

pambuk
quelle
281
Dieses Präfix tut nichts anderes, als die Lesbarkeit zu beeinträchtigen ...
Dapeng
10
Die Angabe des Typs als Präfix ist schlecht und wird als ungarische Notation bezeichnet. siehe thc.org/root/phun/unmaintain.html und kernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi
10
weil sie nicht viel Wissen über den Java-Code-Stil hatten, um damit zu beginnen
Victor Ionescu
10
Wenn Sie Probleme haben, lokale Variablen von Mitgliedsvariablen zu unterscheiden, haben Sie meiner Meinung nach viel größere Probleme als die Einhaltung einer Codekonvention. Hier ist die Konvention, die ich (manchmal) verwende: Langes Leben, langer Name. Kurzes Leben, kurzer Name. Wurde bisher nicht verwirrt.
Brandon
17
Ein wirklich dummes Präfix. Verwenden Sie Ihre IDE, um Setter / Getter zu generieren, und Sie erhalten getmName () und setmName ()! Auch Tools wie Lombok für Generationssetter, Getter, Konstruktoren usw. generieren das Präfix m. In meiner Option bietet das Präfix m keinen Mehrwert und sollte aus der Namenskonvention entfernt werden.
userM1433372

Antworten:

551

Diese Notation stammt aus den AOSP-Richtlinien (Android Open Source Project) für den Codestil für Mitwirkende :

Befolgen Sie die Feldbenennungskonventionen

  • Nicht öffentliche, nicht statische Feldnamen beginnen mit m.
  • Statische Feldnamen beginnen mit s.
  • Andere Felder beginnen mit einem Kleinbuchstaben.
  • Öffentliche statische Endfelder (Konstanten) sind ALL_CAPS_WITH_UNDERSCORES.

Beachten Sie, dass im verknüpften Styleguide Code für das Android Open Source-Projekt bereitgestellt wird.

Es ist kein Styleguide für den Code einzelner Android-Apps.

xiaobing.zhao
quelle
33
Interessant .. Der Google Java Code Style widerspricht diesbezüglich tatsächlich dem AOSP Code Style .
Gautam
51
Ich denke in diesen Zeiten ist es Unsinn, besonders in deiner App! "Ihre Klassen und Funktionen sollten so klein sein, dass Sie sie nicht benötigen. Außerdem sollten Sie eine Bearbeitungsumgebung verwenden, in der Mitglieder hervorgehoben oder eingefärbt werden, um sie voneinander zu unterscheiden. Außerdem lernen die Benutzer schnell, das zu sehende Präfix (oder Suffix) zu ignorieren der aussagekräftige Teil des Namens. Je mehr wir den Code lesen, desto weniger sehen wir die Präfixe. Schließlich werden die Präfixe unsichtbar und ein Marker für älteren Code. " - Robert Martin im sauberen Code
Mikugo
4
Widerspricht Googles Java Style Guide - "Nicht konstante Feldnamen (statisch oder anderweitig) werden in lowerCamelCase geschrieben. ... Zum Beispiel computedValues..."
AlikElzin-kilaka
Ich erinnere mich an einen netten Tipp für einzelne Apps, bei dem vorgeschlagen wurde, anstelle von 'm' Kleinbuchstaben des App-Namens zu verwenden.
Abcoep
4
Bitte fügen Sie Ihren Kommentar zu dieser Petition hinzu, um den Regelcode
likejudo
83

Viele Codierungsrichtlinien verwenden m für 'Mitglieder' einer Klasse. Wenn Sie also programmieren, können Sie den Unterschied zwischen lokalen und Mitgliedsvariablen erkennen.

Kolky
quelle
90
Alle modernen IDEs unterscheiden Einheimische und Mitglieder nach Farbe / Schriftart, was meiner Meinung nach besser lesbar ist als das mPräfix.
Dzmitry Lazerka
5
einverstanden. Ich finde das m-Ding sehr nervig, aber nur, weil IntelliJ großartig ist.
ZakTaccardi
Bitte fügen Sie Ihren Kommentar zu dieser Petition hinzu, um den Regelcode
likejudo
4
@DzmitryLazerka in den meisten Codeüberprüfungstools haben Sie diese Hervorhebungsstufe nicht. In einem großen Open-Source-Projekt macht es also Sinn.
JWqvist
@DzmitryLazerka was ist mit dem Lesen von Code in Editor oder Github und so weiter?
user924
57

Was ist ein mPräfix?

msteht für Mitgliedsvariable oder Datenelement. Verwenden Sie das mPräfix für nicht öffentliche und nicht statische Felder.

Wann verwenden?

private String mCityName;
private float mTemperature;

Wann nicht verwenden?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

Was ich mache?

Ich persönlich benutze es nicht. Dies macht den Code komplizierter und die Lesbarkeit chaotisch. Wenn Sie Notepad noch zum Codieren verwenden, habe ich keine Wörter, aber moderne IDEs können Element- und lokale Variablen oder etwas anderes hervorheben und färben.

Fazit

Verwenden? "Ja" oder "Nein" ist Ihre persönliche Wahl.

Madan Sapkota
quelle
1
Sie können es auch für den Einsatz public static int, sondern verwenden sstatt m: public static int sFirstNumber;siehe stackoverflow.com/a/49453184/7767664
user924
31

Wenn es sich um Mitgliedsvariablen in Klassen handelt, bedeutet 'm' 'Mitglied'. Viele Java-Programmierer tun dies, obwohl dies bei modernen IDEs nicht erforderlich ist, da Sie Hervorhebungen, Mauszeiger über QuickInfos usw. haben.

Ahans
quelle
9
Ich würde argumentieren, dass es selbst mit einer modernen IDE schön ist, Mitgliedern m oder m_ voranzustellen, um alle Elementvariablen für eine Klasse an derselben Stelle aufzurufen, wenn die Code-Vervollständigung verwendet wird. Das bedeutet, wenn Sie in einer Klasse arbeiten, können Sie einfach m_ + Strg drücken, um eine Liste aller Mitglieder zu erhalten.
Nagler
38
Nailer, Sie könnten das gleiche erreichen, indem Sie dies verwenden. + Strg Leerzeichen :)
Romain Guy
3
Wenn Sie die Codeliste ausdrucken, ist dies hilfreich - Sie haben nicht die Tooltips, die Ihnen dabei helfen (ja, ich drucke gerne Code aus und lese ihn manchmal in einem Sessel oder sogar im Bett).
B. Clay Shannon
3
@domenicop Ich bin kein Pro-Präfix, aber ich denke, die Idee ist, zwischen den Arten von Attributen innerhalb einer Klasse zu unterscheiden. Abgesehen davon verwende ich normalerweise nirgendwo öffentliche nicht statische Attribute, außer in Klassen, die ausschließlich diese Attribute und keine Geschäftslogik enthalten (Datensatzklassen). In diesem Fall ist das m nutzlos, da die Klasse keine Geschäftslogik enthält. Daher ist es besser, es aus Gründen der Lesbarkeit außerhalb der Klasse zu entfernen (wenn Sie auf diese Felder verweisen).
Joffrey
2
Wenn Sie ohne die Verwendung solcher Präfixe nicht einfach zwischen Feldern, Parametern und Variablen unterscheiden können, bedeutet dies meiner Meinung nach, dass mit dem Code etwas nicht stimmt. Höchstwahrscheinlich ist die Klasse oder die Methode einfach zu groß.
Konrad Morawski
9

Laut Clean Code-Buch handelt es sich nicht um einen sauberen Code.

Sie müssen Mitgliedsvariablen nicht m voranstellen . Außerdem lernen die Leute schnell, das Präfix oder Suffix zu ignorieren, um den aussagekräftigen Teil des Namens zu sehen.

Hamedz
quelle
9

Wenn Sie Probleme haben wie

Ihre IDE, um Setter / Getter zu generieren, und Sie erhalten getmName () und setmName ()

Vergessen Sie nicht, als nächstes zu tun ( Einstellungen / Editor / Codestil / Java / Codegenerierung ):

Geben Sie hier die Bildbeschreibung ein

Update: In Kotlin wird so etwas nicht verwendet (daher ist es besser, dorthin zu wechseln und keine Präfixe mehr zu verwenden).

user924
quelle
6

Ich finde es sehr individuell, welche Codekonventionen verwendet werden. Ich bevorzuge es, meine Variablen mit den folgenden Präfixen zu benennen:

  • m - Methodenvariablen
  • c - Klassenvariablen
  • p - Parametervariablen

Aber ich denke, dass jeder Programmierer seinen eigenen Stil hat.

Steffen Jørgensen
quelle
7
In Anbetracht der Tatsache, dass die meisten Java-Entwickler IDEs verwenden, mit denen unterschiedliche visuelle Stile für Klassen-, Methoden-, statische und Parametervariablen festgelegt werden können, finde ich es viel nützlicher, beispielsweise statische Variablen / Methoden unterstrichen, Klassenvariablen kursiv usw. zu haben. Und natürlich Sie können Ihre eigenen Schriftarten und Farben festlegen. Und es funktioniert immer, egal welche Präfixe Sie verwenden. Aber natürlich ist die Magie verschwunden, wenn Sie die IDE verlassen.
ccpizza
4

Um zu beweisen, dass Sie diese Konvention für die Benennung von Variablen in Ihrem Code definitiv nicht behandeln sollten, übergebe ich einen Screenshot von einem übergeordneten Android Studio .

Finden Sie heraus, dass Variablen innerhalb eines Objekts speziell sortiert sind, um m-Variablen niedriger als Ihre nativen Variablen zu platzieren . Indem Sie sie in Ihrem Code mit dem Präfix "m" benennen, verstecken Sie sie in einem Haufen vor sich selbst .

Geben Sie hier die Bildbeschreibung ein

Zon
quelle
3

Der einzige Vorteil dieses Codestils besteht darin, dass ich während einer automatischen Vervollständigung eines Verweises auf eine Variable weiß, dass ich "m" eingeben kann, um nur die Mitgliedsvariablen anzuzeigen.

Janac Meena
quelle
2

Wie bereits erwähnt, ist es für verschiedene Variablen gestaltet. Es ist aber auch sehr nützlich für die Codegenerierung. Wenn Sie "Alt + Einfügen" drücken, erhalten Sie Fenster für die meisten Eigenschaften der Codegenerierung. Wenn Sie eine "get" -Methode für Ihre Variable generieren möchten, erhalten Sie.

public class Foo{
   private int bar;

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

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

}

Aber wenn Sie "m, s" deklarieren, erhalten Sie:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

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

Es wird automatisch generiert und "m" oder "s" aus Ihrem Konstruktor gelöscht, get, set Methodenname. Danach werden "get" 'und "set" für das Feld ohne "m" generiert. Andoroid Fle-> Setting-> Code Style-> Java-> Code Genenretion. Und wie auf einem Bild machen. Vielleicht hilft es. Entschuldigung für meine eng. Android konfigurieren

IHAFURR
quelle
2

Es scheint eine persönliche Präferenz einiger früher Android / Google-Ingenieure gewesen zu sein, Mitgliedsvariablen mit 'm' zu starten, und deshalb haben sie es empfohlen.

Jetzt wird diese Regel Entwicklern in Unternehmen, die keine AOSP-Beiträge leisten, in den Rachen gezwungen, einfach weil diese Seite als Android-Code-Stil-Regeln gilt. Diese Regel hat wenig oder gar keinen Nutzen. Google sollte in Betracht ziehen, es zu entfernen. Andernfalls geben Sie für Android Apps an, welche der Codestilregeln optional sind.

Bitte fügen Sie dieser Petition Ihren Unterstützungskommentar hinzu, um die Regel https://code.google.com/p/android/issues/detail?id=226814 zu entfernen

Likejudo
quelle
2

Aus Gründen der Lesbarkeit sollte die Konvention mfür Mitgliedsvariablen und sfür statische Felder nicht mehr verwendet werden, wenn Sie eine moderne IDE wie Android Studio verwenden. Android Studio kann zwischen diesen unterscheiden, ohne moder hinzuzufügen s.

Aselims
quelle
1

Es kann auch angegeben werden, dass es für "mein" steht, wie in der Klasse / Instanz gesagt wird "Diese Variable gehört mir und niemand anderes kann darauf zugreifen." Anders als statisch, das zwar nur für die Klasse verfügbar ist, aber von allen Instanzen dieser Klasse gemeinsam genutzt wird. Wenn Sie beispielsweise Kreise zeichnen, müssen Sie wissen, wie groß der Radius jedes Kreises ist

    private double mRadius;

Gleichzeitig möchten Sie, dass ein Zähler alle Kreise innerhalb der Kreisklasse verfolgt, die Sie haben könnten

    private static int sCircleCount;

und dann haben Sie nur statische Elemente, um die Anzahl der Kreise, die Sie derzeit haben, zu erhöhen und zu verringern.

jimistephen
quelle
1

Das Folgende sind die Namenskonventionen:

  • Nicht öffentliche, nicht statische Feldnamen beginnen mit m.
  • Statische Feldnamen beginnen mit s.
  • Andere Felder beginnen mit einem Kleinbuchstaben.
  • Öffentliche statische Endfelder (Konstanten) sind ALL_CAPS_WITH_UNDERSCORES.

Beispiel:

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
quelle