Konwencja nazewnictwa identyfikatorów Androida: małe litery z podkreśleniem a wielkie litery

89

Obecnie programuję aplikację na Androida. Teraz odkryłem, że nie można umieścić obiektów zasobów, powiedzmy, obrazu w folderze do rysowania i nazwać go „myTestImage.jpg”. Spowoduje to błąd kompilatora, ponieważ składnia wielkości liter wielbłąda jest niedozwolona, ​​więc musisz zmienić jej nazwę na „my_test_image.jpg”.

Ale co z identyfikatorami zdefiniowanymi w pliku XML. Powiedzmy, że masz następującą definicję

<TextView android:id="@+id/myTextViewFirstname"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Firstname" />

To jest poprawna definicja, kompiluje się i działa dobrze na moim emulatorze Androida, chociaż - jak widzisz - określam identyfikator w składni wielbłąda.

Teraz próbki Androida zawsze używają małych liter i podkreślenia. Czy jest to tylko konwencja nazewnictwa polegająca na używaniu małych liter z podkreśleniem dla identyfikatorów, czy może to powodować problemy na prawdziwym urządzeniu?

Dzięki

Juri
źródło

Odpowiedzi:

87

Urządzenie nie będzie narzekać, jeśli używasz nazw identyfikatorów w kształcie wielbłądów. Dla mojej pierwszej aplikacji napisałem wszystkie identyfikatory w przypadku wielbłąda, ponieważ wydaje mi się, że w ten sposób wygląda lepiej w kodzie Java i działa dobrze.

Powoli zmieniam jednak zdanie na temat obudowy wielbłąda, ponieważ kończy się to na dwóch różnych konwencjach nazewnictwa - na przykład:

// This must be undescored due to naming constrictions
setContentView(R.layout.my_long_layout_name);

// Now this looks a little out of place
findViewById(R.id.myLongSpecificId);

Ja też zastanawiam się nad standardami tutaj. Google jest niespójny w ich przykładach; czasami używają wszystkich małych liter, czasami dodają podkreślenia, a czasami używają wielbłądów.

Dan Lew
źródło
18
Tak, to jest dokładnie mój problem. Zmuszają cię do używania konwencji nazewnictwa podkreślonego dla układów, podczas gdy możesz użyć wielkości wielbłąda lub podkreślenia dla identyfikatorów odwołujących się do formantów / widżetów w definicjach układu XML. Google naprawdę powinien zdefiniować tutaj jakiś standard (jeśli jeszcze tego nie zrobił, to przynajmniej nic nie znalazłem). Zatem wybranie jednego sposobu jest najlepszym rozwiązaniem, aby zachować spójność w całej aplikacji, niezależnie od tego, czy odwołujesz się do układów, czy też do pól, do których istnieją odwołania.
Juri
Z ciekawości: czy masz link, w którym Google jest niespójny, czyli gdzie użyli notacji wielbłąda dla identyfikatorów?
Juri
6
Mylić rzeczy dalszych nazwy stylu (które są jak identyfikatory dla stylów) Przy użyciu szablonów projektowych, np PascalCase AppBaseThemei AppTheme.
Edward Brey
4
Metoda podkreślenia jest ogólnie uważana za znacznie mniej czytelną w zespołach, w których byłem zaangażowany. Nieco dziwne ograniczenie nazw plików zasobów, których nie można używać w przypadku wielbłądów, nie powinno zanieczyszczać twojego myślenia w przypadku pozostałych interfejsów Javy - camelCase to mocno zakorzenione i nie sądzę, by ktokolwiek podziękował za narzucenie nowego stylu „_” w konwencjach nazewnictwa.
RichieHH
3
@RichardRiley Uważam to za interesujące, ponieważ w przypadku podkreślenia granice słów są odpowiednio zdefiniowane, podczas gdy w przypadku wielbłądów są zgniecione, więc łatwiej mi analizować nazwy oddzielone podkreśleniem niż te z wielbłądami.
JAB,
13

Jeśli spojrzysz na android.R.id.*pola, zauważysz, że wszystkie są w skrzynce wielbłąda. Więc jeśli identyfikatory Androida są zapisane w przypadku wielbłąda, myślę, że musimy przestrzegać tej konwencji :)

Kiril Aleksandrov
źródło
Są tam w przypadku wielbłądów, ponieważ zostały stworzone w camelCase. Nie ustanawia to żadnego precedensu w stylu kodowania dla całej społeczności i nie jest to związane z konwencją nazewnictwa plików zasobów w porównaniu z konwencjami nazewnictwa ciągów identyfikacyjnych, o co pyta oryginalny plakat.
RichieHH
3
Tak, zostały stworzone w pudełku na wielbłąda. Ale te identyfikatory pochodzą z samego API Androida, więc jeśli twórca API użył obudowy wielbłąda, myślę, że dobrym podejściem jest przestrzeganie jego konwencji.
Kiril Aleksandrov
8
tam widget_framepole [ developer.android.com/reference/android/R.id.html#widget_frame] również w android.R.id.*polach. w tym polu Google używa podkreślenia, a nie przypadku wielbłąda Więc twój wniosek dotyczący konwencji wielbłąda jest słuszny Wybór konwencji ID może być fałszywy
ahmed hamdy
4

myślę, że dobrze będzie, jeśli użyjemy wszystkich małych liter z podkreśleniami.

Po prostu spójrz na to (dodając do tego, co odpowiedział Daniel)

  // Camel Case
    TextView tvUserName = (TextView) findViewById(R.id.tvUserName);
    // Small Caps and Underscores
    TextView tvUserName = (TextView) findViewById(R.id.tv_user_name);

z własnego doświadczenia mam tendencję do trochę pomieszania z konwencją wielkości wielbłądów w xml, ponieważ kiedy połączysz ją z Javą, która również używa wielbłąda (ponieważ jest to standard), wygląda to jak doppleganger.

Rogene Sagmit
źródło
Jest to bardzo subiektywne i nie odpowiada na pytanie Q, dlaczego nie można w podobny sposób nazywać plików zasobów, jak ciągi identyfikacyjne.
RichieHH
3

Myślę, że jeśli użyjemy konwencji podkreślenia dla identyfikatorów w plikach xml i konwencji wielbłądów dla pól klas, zapewni to każdemu deweloperowi lepszą widoczność w rozróżnieniu identyfikatorów xml i pól klas.

Yasir Ali
źródło
3
android:id="@+id/frag_account_button"
frag_account_button = ((ListView)view.findViewById(R.id.frag_account_button));

android:id="@+id/fragAccountButton"
fragAccountButton = ((ListView)view.findViewById(R.id.fragAccountButton));

Po pierwsze, nie ma określonego standardu, który pozwoliłby określić, który z nich jest bardziej właściwy, ale mam na to swój własny pomysł. Mój pomysł jest rozsądny, aby zachować identyfikator XML i zmienną java dokładnie o tej samej nazwie, zgodnie z konwencją wielbłądów.

  1. Dostęp do zmiennej jest łatwy, wyszukując projekt zarówno po stronie XML, jak i java.

  2. Definicja biblioteki butterKnife

    @BindView (R.id.infoTextView) TextViewFont infoTextView;

W ten sposób lepiej jest zachować.

Samet ÖZTOPRAK
źródło
3
Wiązanie widoku Kotlina zwraca to samo, co ButterKnife, więc całkowicie porzucam snake_case.
Rik Martins,
1

Nazwy plików XML (które są używane w folderze do rysowania) muszą być wszystkie zapisane małymi literami, oddzielone znakiem podkreślenia _, ponieważ nazwy plików pisane wielkimi literami nie są obsługiwane w formacie XML.

Paweł
źródło
1
Nie chodzi o nazwy plików, a poza tym niektórzy ludzie wolą nie pisać wielkimi literami pierwszej litery w przypadku wielbłądów.
Jesper
To dziwny, niespójny problem IMO. Nie możesz rozróżniać wielkości liter, nie, ale dlaczego nie po prostu zakazać plików zasobów o tej samej nazwie jako składnik główny w tym samym katalogu.
RichieHH
(Btw chodzi o nazwy plików w porównaniu z identyfikatorami zasobów:
sprawdź
0

Jeśli kompilator Androida naprawdę robi to, co mówisz, ograniczając wielkość wielbłąda (co wydaje się dość dziwne), powinieneś trzymać się ustalonych konwencji.

Podążanie pod prąd spowoduje tylko niepotrzebne zamieszanie. Utrzymuj spójność we wszystkich możliwych miejscach.

Brock Woolf
źródło
Prawdopodobnie źle zrozumiałeś, co chciałem powiedzieć. Kompilator będzie narzekać, jeśli umieścisz zasoby takie jak plik i napiszesz to w przypadku wielbłąda. Innym przypadkiem jest jednak określenie identyfikatorów w plikach układu XML. Tam masz możliwość umieszczenia nazw identyfikatorów wielbłądów, a emulator działa dobrze. Jak już wspomniałem, wszystkie próbki Google mają postać my_id_name, ale istnieje wiele innych próbek o nazwach identyfikacyjnych w postaci wielbłądów ...
Juri