Конвенція про іменування ідентифікаторів Android: мала літера з підкресленням проти регістру верблюда


89

В даний час я програмую додаток для Android. Тепер я дізнався, що ви не можете розміщувати об’єкти ресурсів, скажімо, зображення в папці, що малюється, і називати його як „myTestImage.jpg”. Це дасть вам помилку компілятора, оскільки синтаксис регістру верблюда заборонений, тому вам доведеться перейменовувати його як "my_test_image.jpg".

А як щодо ідентифікаторів, які ви визначаєте у файлі XML. Скажімо, у вас є таке визначення

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

Це дійсне визначення, компілюється і чудово працює на моєму емуляторі Android, хоча - як бачите - я вказую ідентифікатор у синтаксисі справи верблюда.

Зараз у зразках Android завжди використовуються регістри та підкреслення. Це просто умова іменування для використання нижчих регістрів з підкресленням для ідентифікаторів чи це може спричинити проблеми на реальному пристрої?

Дякую

Відповіді:


87

Пристрій не буде скаржитися, якщо ви використовуєте ідентифікаційні імена верблюдів. Для мого першого додатка я написав усі ідентифікатори у верблюді, тому що, на мою думку, це виглядає краще в коді Java, і це чудово працює.

Однак я повільно передумую над випадком верблюда, оскільки у вас виходять дві різні конвенції щодо іменування - наприклад:

// 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);

Я теж дивуюсь щодо стандартів тут. Google суперечливий у своїх прикладах; іноді вони використовують усі малі літери, іноді вставляють підкреслення, а іноді використовують верблюд.


18
Так, це саме моя проблема. Вони змушують вас використовувати підкреслену конвенцію іменування для макетів, тоді як ви можете використовувати або регістр верблюда, або підкреслену для ідентифікаторів, що посилаються на елементи керування / віджети всередині визначень макета XML. Google справді повинен визначити тут якийсь стандарт (якщо вони цього ще не зробили, принаймні я нічого не знайшов). Отже, якщо ви йдете в один бік, найкраще, щоб найкраще було узгоджено у всій програмі, незалежно від того, посилаєтесь ви на макети чи поля з посиланнями на id.
Юрі 02

Тільки для цікавості: чи є у вас посилання, де Google не узгоджується, тобто, де вони використовували нотацію справи верблюда для ідентифікаторів?
Джурі

6
Щоб ще більше заплутати речі, імена стилів (подібні до ідентифікаторів стилів) у шаблонах проектів використовують PascalCase, наприклад AppBaseThemeі AppTheme.
Едвард Брей,

4
Метод підкреслення, як правило, вважається набагато менш читабельним у командах, в яких я брав участь. Дещо дивне обмеження імен файлів ресурсів, заборонених бути у справі верблюда, не повинно забруднити ваше мислення щодо решти інтерфейсів Java - camelCase міцно вкорінився, і я не думаю, що хтось подякує вам за те, що ви домоглися нового стилю "_" в іменах.
RichieHH

3
@RichardRiley Я вважаю це цікавим, оскільки з підкресленнями межі слів правильно визначені, тоді як у випадку з верблюдами вони стискаються разом, тому мені легше проводити синтаксичний розбір імен, розділених підкресленням, ніж тих, що містять верблюди.
JAB,

13

Якщо ви подивитеся на android.R.id.*поля, то помітите, що всі вони знаходяться у футлярі для верблюдів. Тож, якщо ідентифікатори андроїда написані у випадку з верблюдом, я маю на увазі, що ми повинні дотримуватися цієї угоди :)


Вони там у футлярі для верблюдів, тому що вони були створені в camelCase. Це не створює жодного прецеденту стилю кодування для спільноти в цілому, і це не пов’язано із правилами іменування файлів ресурсів порівняно із правилами імен рядків, про що запитує оригінальний плакат.
RichieHH

3
Так, вони були створені у випадку з верблюдом. Але ці ідентифікатори від самого API Android, тому, якщо творець API використав верблюд, я думаю, це хороший підхід дотримуватися його домовленостей.
Кирило Александров

8
там widget_frameполе [ developer.android.com/reference/android/R.id.html#widget_frame] також у android.R.id.*полях. у цьому полі Google використовує підкреслення, а не випадок верблюда. Отже, ваш висновок про конвенцію про верблюда правильно, вибрати для
згоди

4

я думаю, що добре, якщо ми використовуємо всі маленькі літери з підкресленням.

Просто подивіться на це (Додаючи до того, що Даніель відповів)

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

на власному досвіді я, як правило, трохи заплутався у конвенції про верблюдів у xml, тому що коли ви пов'язуєте її з Java, яка також використовує верблюд (тому що це стандарт), це виглядає як допплеганжер.


Це дуже суб’єктивно і не відповідає на запитання, чому ви не можете так само називати файли ресурсів, як ідентифікуєте рядки.
RichieHH

3

Думаю, якщо ми використовуємо підкреслене дозвіл для ідентифікатора у файлах xml та домовленість верблюда для полів класів, то це дасть кращу видимість кожному розробнику для розрізнення ідентифікаторів xml та полів класу.


3

Якщо ви подивитесь на деякі зразки додатків Google, такі як:

https://github.com/google/iosched

Вони використовують підкреслення. Тож .... може, саме так ми повинні це робити?


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));

Перш за все, не існує певного стандарту, який би визначив, який із них є більш правильним, але я маю власне уявлення про це. Моя ідея є розумною, щоб зберігати ідентифікатор XML і змінну java точно в одному і тому ж назві згідно з конвенцією про верблюда.

  1. Дістатися до змінної легко, шукаючи проект як XML, так і сторону Java.

  2. Визначення бібліотеки butterKnife

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

Доцільніше зберігати таким чином.


3
Прив'язка подання Котліна повертає те саме, що і butterKnife, тому я взагалі скидаю snake_case.
Рік Мартінс

1

Назви файлів xml (що використовується у папці, що малюється) мають бути з нижчими літерами, розділені символом підкреслення _, оскільки імена файлів з великими літерами не підтримуються в xml.


1
Йдеться не про імена файлів, і крім того, деякі люди вважають за краще не писати велику літеру, коли в кожусі верблюда.
Jesper

Це дивне суперечливе питання IMO. Ні, ви не можете чути регістр, щоб розрізнити, але чому б просто не заборонити файли ресурсів, що мають однаковий кореневий компонент імені, в одному каталозі.
RichieHH

(До речі, це про імена файлів проти ідентифікаторів ресурсів: перевірте OP)
RichieHH

0

Якщо компілятор Android справді робить те, що ви говорите, обмежуючи випадок верблюда (що здається досить дивним), то вам слід дотримуватися встановлених умов.

Вихід проти зерна призведе лише до непотрібної плутанини. Дотримуйтесь речей у всіх місцях, де це можливо.


Ви, мабуть, неправильно зрозуміли те, що я намагався сказати. Компілятор скаржиться, якщо ви розмістите ресурси як файл і напишете це у випадку верблюда. Однак інший випадок - це коли ви вказуєте ідентифікатори у файлах XML-макета. Там у вас є можливість розмістити ідентифікатори імен верблюдів, і емулятор чудово працює. Тепер, як я вже згадував, усі зразки Google мають форму my_id_name, але є багато інших зразків, що мають ідентифікаційні імена верблюдів ...
Юрі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.