Convenção de nomenclatura de id do Android: minúscula com sublinhado x camel case

89

Atualmente estou programando um aplicativo para o Android. Agora o que descobri é que você não pode colocar objetos de recurso, digamos, uma imagem na pasta drawable e nomeá-la como "myTestImage.jpg". Isso gerará um erro do compilador, já que a sintaxe camel case não é permitida, então você terá que renomeá-la como "my_test_image.jpg".

Mas e quanto aos ids que você define no arquivo XML. Digamos que você tenha a seguinte definição

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

Esta é uma definição válida, compila e funciona muito bem no meu emulador Android, embora - como você vê - eu esteja especificando o id na sintaxe camel case.

Agora, os exemplos do Android sempre usam minúsculas e sublinhado. Esta é apenas uma convenção de nomenclatura para usar minúsculas com sublinhado para os ids ou pode causar problemas no dispositivo real?

THX

Juri
fonte

Respostas:

87

O dispositivo não reclamará se você usar nomes de identificação com caixa de camelo. Para meu primeiro aplicativo, escrevi todos os ids em camel-case porque acho que parece melhor no código Java dessa forma e funciona muito bem.

No entanto, estou mudando lentamente de ideia sobre o caso do camelo, porque você acaba com duas convenções de nomenclatura diferentes - por exemplo:

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

Eu também me pergunto sobre os padrões aqui. O Google é inconsistente em seus exemplos; às vezes eles usam todas as letras minúsculas, às vezes eles inserem sublinhados e às vezes eles usam caixa de camelo.

Dan Lew
fonte
18
Sim, esse é exatamente o meu problema. Eles o forçam a usar a convenção de nomenclatura sublinhada para layouts, enquanto você pode usar caixa-camelo ou sublinhado para os ids que fazem referência a controles / widgets dentro das definições de layout XML. O Google realmente deveria definir algum padrão aqui (se ainda não definiu, pelo menos eu não encontrei nada). Portanto, seguir um caminho é com certeza o melhor para ser consistente em todo o aplicativo, quer você faça referência a layouts ou campos referenciados por id.
Juri
Apenas por curiosidade: você tem um link em que o Google é inconsistente, ou seja, onde eles usaram a notação camel-case para ids?
Juri
6
Para confundir ainda mais as coisas, os nomes de estilo (que são como IDs para estilos) nos modelos de projeto usam PascalCase, por exemplo, AppBaseThemee AppTheme.
Edward Brey
4
O método de sublinhado é geralmente considerado muito menos legível nas equipes em que estive envolvido. A limitação um tanto estranha dos nomes de arquivos de recursos não sendo permitidos em camel case não deve poluir seu pensamento para o resto das interfaces Java - camelCase é firmemente arraigado e eu não acho que alguém agradeceria por forçar um novo estilo "_" nas convenções de nomenclatura.
RichieHH
3
@RichardRiley Acho isso interessante, já que com sublinhados os limites das palavras são definidos corretamente, enquanto com caixa de camelo eles são compactados, então eu tenho mais facilidade em analisar nomes separados por sublinhado do que nomes com caixa de camelo.
JAB de
13

Se você observar os android.R.id.*campos, notará que todos eles estão em uma caixa de camelo. Portanto, se os ids do Android forem escritos em "camel-case", acho que devemos seguir esta convenção :)

Kiril Aleksandrov
fonte
Eles estão em camel case porque foram criados em camelCase. Isso não estabelece nenhum precedente de estilo de codificação para a comunidade em geral e não está vinculado às convenções de nomenclatura de arquivos de recursos versus aquelas de strings de ID, que é o que o autor original está perguntando.
RichieHH
3
Sim, eles foram criados em caixa de camelo. Mas esses IDs são da própria API do Android, portanto, se o criador da API usou a caixa de camelo, acho que é uma boa abordagem seguir sua convenção.
Kiril Aleksandrov,
8
widget_framecampo [ developer.android.com/reference/android/R.id.html#widget_frame] também nos android.R.id.*campos. neste campo, o Google usa o sublinhado, não o caso do camelo. Portanto, sua conclusão sobre a convenção do caso do camelo é a escolha certa para a convenção de identidade pode ser falsa
ahmed hamdy
4

Eu acho que é bom se usarmos todas as letras minúsculas com sublinhados.

Basta olhar para isso (acrescentando ao que Daniel respondeu)

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

em minha própria experiência, tendo a ficar um pouco confuso com a convenção de caixa de camelo em xml porque quando você o vincula a Java, que também usa caixa de camelo (porque é o padrão), parece um doppleganger.

Rogene Sagmit
fonte
Isso é muito subjetivo e não responde à pergunta sobre por que você não pode nomear arquivos de recursos da mesma forma como pode identificar strings.
RichieHH
3

Acho que se usarmos a convenção de sublinhado para id em arquivos xml e a convenção camel case para campos de classe, isso dará melhor visibilidade a cada desenvolvedor para distinguir entre ids xml e campos de classe.

Yasir Ali
fonte
3

Se você olhar alguns exemplos de aplicativos do Google, como:

https://github.com/google/iosched

Eles usam sublinhados. Então .... talvez seja assim que deveríamos estar fazendo isso?

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

Em primeiro lugar, não existe um padrão certo para definir qual é o mais adequado, mas tenho minha própria ideia sobre isso. Minha ideia é razoável manter o id XML e a variável java exatamente no mesmo nome com a convenção camel-case.

  1. É fácil chegar à variável procurando pelo projeto tanto no XML quanto no lado Java.

  2. definição da biblioteca butterKnife

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

É mais apropriado manter assim.

Samet ÖZTOPRAK
fonte
3
A associação de visão de Kotlin retorna o mesmo que butterKnife, então estou descartando snake_case completamente.
Rik Martins
1

Os nomes de arquivo xml (que é o que é usado na pasta drawable) devem ser todos minúsculos separados pelo caractere de sublinhado _ uma vez que nomes de arquivo em maiúsculas não são suportados em xml.

Paulo
fonte
1
Não se trata de nomes de arquivos e, além disso, algumas pessoas preferem não colocar a primeira letra em maiúscula ao colocar camelo.
Jesper
É uma questão estranha e inconcistente IMO. Você não pode diferenciar maiúsculas de minúsculas para distinguir, não, mas por que não apenas banir arquivos de recursos com o mesmo nome de componente raiz no mesmo diretório.
RichieHH
(A propósito, é sobre nomes de arquivo x IDs de recursos: verifique novamente o OP)
RichieHH
0

Se o compilador do Android está realmente fazendo o que você diz restringindo a caixa de camelo (o que parece um tanto estranho), então você deve seguir as convenções estabelecidas.

Ir contra a corrente só causará confusão desnecessária. Mantenha as coisas consistentes em todos os lugares onde for possível.

Brock Woolf
fonte
Você provavelmente entendeu mal o que eu estava tentando dizer. O compilador reclamará se você colocar recursos como um arquivo e escrever isso no caso de camelo. O outro caso, entretanto, é quando você especifica IDs nos arquivos de layout XML. Lá você tem a possibilidade de colocar nomes de id de caixa de camelo e o emulador funciona perfeitamente. Agora, como mencionei, as amostras do Google estão todas no formato my_id_name, mas há muitas outras amostras com nomes de id de caixa de camelo ...
Juri