Dlaczego większość pól (członków klasy) w samouczku na Androida zaczyna się od `m`?

446

Wiem o regułach dotyczących wielbłądów, ale jestem mylony z tą zasadą. Co to oznacza? Jestem programistą PHP. „Używamy” pierwszych liter zmiennych jako wskazania typu, takich jak „b” dla wartości logicznej, „i” dla liczby całkowitej i tak dalej.

Czy „m” to Java? Czy to oznacza telefon komórkowy? mieszany?

pambuk
źródło
281
ten prefiks nie tylko psuje czytelność ...
Dapeng
10
wskazanie typu jako prefiksu jest złe i nazywa się notacją węgierską, patrz thc.org/root/phun/unmaintain.html i kernel.org/doc/Documentation/CodingStyle
Muayyad Alsadi 24.09.2013
10
ponieważ nie mieli dużej wiedzy na temat stylu kodu java
Victor Ionescu,
10
Moim zdaniem, jeśli masz problemy z odróżnieniem zmiennych lokalnych od zmiennych składowych, masz znacznie większe problemy niż zgodność z konwencją kodu. Oto konwencja, której używam (czasami): Long Life, Long Name. Krótkie życie, krótka nazwa. Do tej pory nie byłem zdezorientowany.
Brandon
17
Prawdziwy głupi prefiks. Użyj swojego IDE do wygenerowania setterów / getterów, a skończysz na getmName () i setmName ()! Również narzędzia takie jak Lombok dla ustawiaczy generacji, pobierających, konstruktorów itp. Wygenerują przedrostek m. W mojej opcji przedrostek m nie dodaje wartości i powinien zostać usunięty z konwencji nazewnictwa.
userM1433372,

Odpowiedzi:

552

Notacja pochodzi od Wytycznych stylu dla AOSP (Android Open Source Project) dla autorów :

Postępuj zgodnie z konwencjami nazewnictwa pól

  • Niepubliczne, niestatyczne nazwy pól rozpoczynają się od m.
  • Nazwy pól statycznych zaczynają się od s.
  • Inne pola zaczynają się od małej litery.
  • Publiczne statyczne pola końcowe (stałe) to ALL_CAPS_WITH_UNDERSCORES.

Pamiętaj, że połączony przewodnik po stylu dotyczy kodu, który można wnieść do projektu Android Open Source.

To nie jest przewodnik po stylu dla kodu poszczególnych aplikacji na Androida.

xiaobing.zhao
źródło
33
Interesujące ... Styl kodu Java firmy Google jest w tym zakresie sprzeczny ze stylem kodu AOSP .
Gautam
51
Myślę, że w tych czasach jest to nonsens, szczególnie jeśli robisz to w swojej aplikacji! „Twoje klasy i funkcje powinny być na tyle małe, aby ich nie potrzebować. Powinieneś używać środowiska edycyjnego, które wyróżnia lub koloruje członków, aby je odróżnić. Poza tym ludzie szybko uczą się ignorować prefiks (lub sufiks), aby zobaczyć znaczącą część nazwy. Im więcej czytamy kod, tym mniej widzimy prefiksów. W końcu prefiksy stają się niewidzialnym bałaganem i znacznikiem starszego kodu. ” - Robert Martin w Clean Code
mikugo
4
Sprzeczności z przewodnikiem po stylu Java firmy Google - „Nie stałe nazwy pól (statyczne lub inne) są zapisywane w lowerCamelCase. ... Na przykład computedValues...”
AlikElzin-kilaka
W przypadku poszczególnych aplikacji pamiętam fajną wskazówkę sugerującą użycie małych liter w nazwie aplikacji zamiast „m”.
abcoep,
4
Dodaj swój komentarz do petycji, aby usunąć regułę code.google.com/p/android/issues/detail?id=226814
likejudo,
83

Wiele linii przewodnich kodowania używa m dla „członków” klasy. Więc kiedy programujesz, możesz zobaczyć różnicę między zmiennymi lokalnymi a zmiennymi składowymi.

Kolky
źródło
90
Wszystkie współczesne IDE odróżniają mieszkańców i członków według koloru / czcionki, która jest IMHO o wiele bardziej czytelna niż mprzedrostek.
Dzmitry Lazerka
5
Zgoda. Uważam to za bardzo denerwujące, ale tylko dlatego, że IntelliJ jest niesamowity.
ZakTaccardi
Dodaj swój komentarz do petycji, aby usunąć regułę code.google.com/p/android/issues/detail?id=226814
likejudo,
4
@DzmitryLazerka w większości narzędzi do przeglądu kodu nie ma tego poziomu podświetlania. Ma to sens w dużym projekcie open source.
JWqvist
@DzmitryLazerka co z czytaniem kodu w notatniku lub githubie i tak dalej?
user924,
57

Co to jest mprefiks?

moznacza element członkowski zmiennej lub element danych. Użyj mprzedrostka dla pól niepublicznych i niestatycznych.

Kiedy użyć?

private String mCityName;
private float mTemperature;

Kiedy nie używać?

public static int mFirstNumber;
public static final String mDATABASE_NAME;

Co robię?

Osobiście nie używam tego. To sprawia, że ​​kod jest bardziej skomplikowany i chaos czytelności. Jeśli nadal używasz Notatnika do kodowania, nie mam słów, ale nowoczesne IDE potrafią wyróżniać i kolorować zmienne składowe i lokalne lub cokolwiek innego.

Wniosek

Posługiwać się? „Tak” lub „Nie” to twój osobisty wybór.

Madan Sapkota
źródło
1
możesz go również użyć public static int, ale użyj szamiast m: public static int sFirstNumber;patrz stackoverflow.com/a/49453184/7767664
user924
31

Jeśli są to zmienne składowe w klasach, „m” oznacza „członek”. Wielu programistów Java robi to, chociaż w nowoczesnych IDE nie jest to konieczne, ponieważ masz podświetlenie, myszy na etykietach itp.

ahans
źródło
9
Argumentowałbym, że nawet przy nowoczesnym IDE miło jest poprzedzać członków m lub m_ w celu wywołania wszystkich zmiennych składowych dla klasy w tym samym miejscu, gdy używa się uzupełniania kodu. Oznacza to, że kiedy pracujesz na zajęciach, możesz po prostu nacisnąć m_ + ctrl spację, aby uzyskać listę wszystkich członków.
Nailer
38
Gwoździarka, możesz osiągnąć to samo, korzystając z tego. + ctrl spacja :)
Romain Guy
3
Ponadto, jeśli wydrukujesz listę kodów, takie jest pomocne - nie masz podpowiedzi, które by ci tam pomogły (tak, lubię drukować kod i czytać je na wygodnym krześle, a czasem nawet w łóżku).
B. Clay Shannon,
3
@domenicop Nie jestem pro-prefiksem, jednak myślę, że chodzi o rozróżnienie rodzajów atrybutów w klasie. To powiedziawszy, zwykle nigdzie nie używam publicznych atrybutów niestatycznych, z wyjątkiem klas, które zawierają wyłącznie te atrybuty i nie mają logiki biznesowej (klasy rekordów). W tym przypadku m jest bezużyteczne, ponieważ w klasie nie ma logiki biznesowej. Dlatego lepiej jest usunąć go, aby był czytelny poza klasą (gdy odwołujesz się do tych pól).
Joffrey
2
Moim zdaniem, jeśli nie możesz łatwo rozróżnić pól, parametrów i zmiennych bez użycia takich prefiksów, oznacza to, że coś jest nie tak z kodem. Najprawdopodobniej klasa lub metoda jest po prostu za duża.
Konrad Morawski
9

Według książki Clean Code nie jest to czysty kod.

Nie musisz poprzedzać zmiennych członka znakiem m . Poza tym ludzie szybko uczą się ignorować prefiks lub sufiks, aby zobaczyć znaczącą część nazwy.

Hamedz
źródło
9

Jeśli masz problemy, takie jak

twoje IDE do generowania setterów / getterów i kończysz na getmName () i setmName ()

Nie zapomnij zrobić dalej ( Ustawienia / Edytor / Styl kodu / Java / Generowanie kodu ):

wprowadź opis zdjęcia tutaj

Aktualizacja: nie używamy czegoś takiego w Kotlin (więc lepiej się na to przełączyć i nie używać już prefiksów)

użytkownik924
źródło
6

Sądzę, że konwencje kodu są bardzo indywidualne. Wolę nazywać moje zmienne następującymi prefiksami:

  • m - Zmienne metod
  • c - Zmienne klasowe
  • p - Zmienne parametrów

Ale myślę, że każdy programista ma swój własny styl.

Steffen Jørgensen
źródło
7
Biorąc pod uwagę, że większość programistów Java korzysta z IDE, które pozwalają na ustawianie różnych stylów wizualnych dla zmiennych klas, metod, statycznych i zmiennych parametrów, uważam, że o wiele bardziej przydatne jest na przykład podkreślenie zmiennych / metod statycznych, zmiennych klasowych kursywą itp. I oczywiście możesz ustawić własne czcionki i kolory. I zawsze będzie działać bez względu na używane prefiksy. Ale, rzecz jasna, cała magia zniknęła po opuszczeniu IDE.
ccpizza
4

Aby udowodnić, że zdecydowanie nie powinieneś traktować tej konwencji nazewnictwa zmiennych w kodzie, przekazuję zrzut ekranu z nadrzędnego Android Studio poniżej.

Znajdź te zmienne wewnątrz obiektu specjalnie posortowane, aby umieścić zmienne m niższe niż zmienne rodzime . Dlatego nazywając je w kodzie prefiksem „m”, ukrywasz je przed sobą .

wprowadź opis zdjęcia tutaj

Strefa
źródło
3

Jedną z korzyści, jakie znalazłem w tym stylu kodu, jest to, że podczas automatycznego uzupełniania niektórych odniesień do zmiennej wiem, że mogę wpisać „m”, aby zobaczyć tylko zmienne składowe.

Janac Meena
źródło
2

Jak wspomniano wcześniej, jest on zaprojektowany dla innej zmiennej. Ale jest również bardzo przydatny do generowania kodu. Jeśli naciśniesz „Alt + Insert”, zobaczysz okna dla najpopularniejszych właściwości generowania kodu. Jeśli chcesz wygenerować metodę „get” dla swojej zmiennej, otrzymasz.

public class Foo{
   private int bar;

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

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

}

Ale jeśli zadeklarujesz „m, s”, otrzymasz:

public class Foo{
private int mBar;

public int getBar(){
   return mBar;
}

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

Zostanie automatycznie wygenerowany i „m” lub „s” usunięte z twojego konstruktora, pobierz, ustaw nazwę metody. Po tym „get” i „set” dla pola zostaną wygenerowane bez „m”. Andoroid Fle-> Setting-> Code Style-> Java-> Code Genenretion. I zrób jak na zdjęciu. Może to pomoże. Przepraszam za mój eng. Skonfiguruj Androida

IHAFURR
źródło
2

Wydaje się, że niektórzy wcześni inżynierowie z Androidem / Google preferowali rozpoczynanie zmiennych członkowskich od „m”, więc oni to zalecili.

Teraz ta zasada jest przymuszana do gardła programistów w firmach, które nie są ani współpracownikami AOSP, tylko dlatego, że ta strona jest uważana za reguły stylu kodu Android. Zasada ta ma niewiele, jeśli w ogóle, korzyści. Google powinien rozważyć jego usunięcie. W przeciwnym razie należy określić, że w przypadku aplikacji na Androida, które reguły stylu kodu są opcjonalne.

Dodaj komentarz do pomocy w tej petycji, aby usunąć regułę https://code.google.com/p/android/issues/detail?id=226814

likejudo
źródło
2

Ze względu na czytelność nie należy już stosować konwencji mzmiennych zmiennych i spól statycznych, jeśli używasz nowoczesnego środowiska IDE, takiego jak Android Studio. Android Studio może rozróżniać te bez dodawania mlub s.

aselims
źródło
1

Można również stwierdzić, że oznacza „moje”, ponieważ w klasie / instancji jest powiedziane „Ta zmienna jest moja i nikt inny nie może się do niej dostać”. Różni się od statycznego, który chociaż może być dostępny tylko dla klasy, jest współużytkowany przez wszystkie instancje tej klasy. Na przykład, jeśli rysujesz koła, musisz wiedzieć, jak duży jest promień każdego koła

    private double mRadius;

ale jednocześnie chcesz, aby licznik śledził wszystkie koła, wewnątrz klasy koła, którą możesz mieć

    private static int sCircleCount;

a następnie po prostu mieć członków statycznych, aby zwiększyć i zmniejszyć liczbę kręgów, które obecnie masz.

jimistephen
źródło
1

Oto konwencje nazewnictwa,

  • Niepubliczne, niestatyczne nazwy pól rozpoczynają się od m.
  • Nazwy pól statycznych zaczynają się od s.
  • Inne pola zaczynają się od małej litery.
  • Publiczne statyczne pola końcowe (stałe) to ALL_CAPS_WITH_UNDERSCORES.

Przykład:

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
źródło