Qual é a convenção para separador de palavras nos nomes de pacotes Java?

370

Como se deve separar as palavras nos nomes dos pacotes? Quais das seguintes opções estão corretas?

  1. com.stackoverflow.my_package (sublinhado)
  2. com.stackoverflow.my-package (hífens)
  3. com.stackoverflow.MyPackage (CamelCase)

Qual é o padrão geral?

Jigar
fonte
15
outro exemplo ainda não mencionado está usando um período:com.stackoverflow.my.package
Brad Cupit 30/05
11
(2) não é Java legal. Não está claro por que você está perguntando sobre isso.
Marquês de Lorne
Observe que tudo isso é apenas para garantir a exclusividade. A única coisa realmente aplicada é ficar fora do espaço java. *.
Thorbjørn Ravn Andersen

Respostas:

248

Aqui está o que o documento oficial das convenções de nomenclatura prescreve:

Pacotes

O prefixo do nome de um pacote único é sempre escrito em todos os-minúsculas letras ASCII e deve ser um dos nomes de domínio de nível superior, atualmente com, edu, gov, mil, net, org, ou um dos Inglês códigos de duas letras que identificam países como especificado na ISO Padrão 3166, 1981.

Os componentes subsequentes do nome do pacote variam de acordo com as convenções de nomenclatura internas da própria organização. Tais convenções podem especificar que determinados componentes de nome de diretório sejam nomes de divisão, departamento, projeto, máquina ou login.

Exemplos

  • com.sun.eng
  • com.apple.quicktime.v2
  • edu.cmu.cs.bovik.cheese

Referências


Observe que, em particular, qualquer coisa após o prefixo de domínio de nível superior não é especificado no documento acima. O JLS também concorda com isso, fornecendo os seguintes exemplos:

  • com.sun.sunsoft.DOE
  • gov.whitehouse.socks.mousefinder
  • com.JavaSoft.jag.Oak
  • org.npr.pledge.driver
  • uk.ac.city.rugby.game

O seguinte trecho também é relevante:

Em alguns casos, o nome de domínio da Internet pode não ser um nome de pacote válido. Aqui estão algumas convenções sugeridas para lidar com essas situações:

  • Se o nome do domínio contiver um hífen ou qualquer outro caractere especial não permitido em um identificador, converta-o em um sublinhado.
  • Se algum dos componentes do nome do pacote resultante forem palavras-chave, acrescente-lhes sublinhado.
  • Se algum dos componentes resultantes do nome do pacote começar com um dígito ou qualquer outro caractere que não seja permitido como caractere inicial de um identificador, tenha um sublinhado prefixado no componente.

Referências

poligenelubricants
fonte
52
O capítulo 7.7 até recomenda usar o sublinhado nos nomes dos pacotes!
Andreas Dolk
6
Aqui: oracle.com/technetwork/java/codeconventions-135099.html diz tudo menos, mas aqui docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 diz que o primeiro componente deveria estar em letras minúsculas, também removeram exemplos de separação de palavras em letras maiúsculas. Também aqui: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html diz minúsculas. Portanto, parece que as letras maiúsculas nos nomes dos pacotes atualmente não são recomendadas.
dhblah
27
O Capítulo 7.7 não recomenda o uso de sublinhados, recomenda a substituição de símbolos especiais / inválidos por um sublinhado, que está longe de ser recomendado apenas para uso geral.
Eduard.dudar 26/10/16
270

Todos os três não são as convenções.

Use com.stackoverflow.mypackage.

Os nomes dos pacotes não seguem a convenção de nomenclatura dos camelos, sublinhados ou hífens .

Além disso, o Google Java Style Guide especifica exatamente a mesma com.stackoverflow.mypackageconvenção (ou seja ):

5.2.1 Nomes dos pacotes

Os nomes dos pacotes são minúsculos, com palavras consecutivas simplesmente concatenadas juntas (sem sublinhados). Por exemplo, com.example.deepspace, não com.example.deepSpace ou com.example.deep_space.

- Google Java Style Guide: 5.2 Regras por tipo de identificador: 5.2.1 Nomes de pacotes .

bragboy
fonte
9
Eu concordo parcialmente - eles não estão "errados" de acordo com as convenções de nomenclatura java, mas não devem ser usados ​​na minha opinião. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Andreas Dolk
@Andreas_D o link que você forneceu afirma que "O prefixo de um nome de pacote exclusivo é sempre escrito em letras ASCII minúsculas"
Jose Gómez
11
@ JoseGómez "O prefixo ". Então, IMHO isso não exclui todas as outras palavras que compõem um nome de pacote de ser CamelCase ou snake_case
Antek
21

Qualquer pessoa pode usar sublinhado _ (está tudo bem)

Ninguém deve usar hypen - (sua má prática)

Ninguém deve usar letras maiúsculas nos nomes dos pacotes (má prática)

OBSERVAÇÃO: Aqui "Bad Practice" é para tecnicamente você poder usá-lo, mas, convencionalmente, não é bom escrever.

Origem: Nomeando um Pacote (docs.oracle)

Himanshu Mori
fonte
47
Sim, usar um hífen é uma prática ruim, porque é um erro. E escrever código que não compila é realmente uma prática ruim.
glglgl
Bom link - ajuda a contextualizar tudo isso quando você sabe o que a fonte diz. Também estou acostumado a todas as convenções em minúsculas. Mas, de acordo com os documentos, parece que é simplesmente uma questão de escolha / estilo. Eu adicionei um comentário ao post específico perguntado sobre o caso camel para nomes de pacotes (que eu não acho que seja uma duplicata deste post, btw - que apenas pergunta sobre a convenção em geral) stackoverflow.com/questions/36755783/…
Gene Bo
"Sem letras maiúsculas", embora eu concorde que todas as letras maiúsculas ou algo que se parece com um ClassName seja uma má idéia, mas também elimina este exemplo. Dizer "é uma má prática" é a razão mais pouco convincente, vaga e sem sentido em que consigo pensar. Isso pode ser elaborado? (ou seja, defina 'más práticas')
Manius
Você ainda está basicamente dizendo "está ruim" sem justificar por que deve ser considerado ruim. Quebra as ferramentas? Criar confusão? É mais difícil de ler ou digitar? Pelos exemplos dados, acho que podemos responder sim a muitos deles. Mas não consigo entender uma proibição absoluta de letras maiúsculas. Um nome de pacote LikeThis (como um nome de classe) é obviamente confuso, mas likeThis não é confuso para mim e parece mais legível para um nome de pacote com duas palavras como bigdataSource (vs "bigdatasource"). A menos que haja alguma razão, o camelCase é uma má ideia para pacotes que eu não conheço, isso parece bom.
Manius
Acontece que eu perdi isso: oracle.com/technetwork/java/codeconventions-135099.html Todas as minúsculas fazem parte da convenção de nome de pacote da Oracle. Eu ainda acho que é uma convenção bastante ruim para descartar casos de camelo que começam mais baixos, naqueles momentos (raros) em que você precisa usar um nome de pacote com duas palavras e não faz sentido criar dois diretórios. Mas tudo bem.
Manius
18

As convenções oficiais de nomenclatura não são tão rígidas, elas nem 'proíbem' a notação de caso de camelo, exceto o prefixo ( comno seu exemplo).

Mas eu pessoalmente evitaria letras maiúsculas e hifenizações , números pares. Eu escolheria com.stackoverflow.mypackagecomo Bragboy sugeriu também.

(hifenizações '-' não são legais nos nomes dos pacotes)

EDITAR

Interessante - a especificação da linguagem também tem algo a dizer sobre convenções de nomenclatura.

No Capítulo 7.7 Nomes de pacotes exclusivos , vemos exemplos com nomes de pacotes que consistem em letras maiúsculas (para que a notação CamelCase seja aceitável) e sugerem substituir a hifonação por um sublinhado ("mary-lou" -> "mary_lou") e prefixo java palavras-chave com sublinhado ("com.example.enum" -> "com.example._enum")

Mais alguns exemplos de letras maiúsculas nos nomes dos pacotes podem ser encontrados no capítulo 6.8.1 Nomes dos pacotes .

Andreas Dolk
fonte
2
Como Andreas observou, não há regras sobre o uso de maiúsculas e minúsculas nos nomes dos pacotes. Um motivo específico para evitá-lo é que eu vi pessoas com problemas com nomes de pacotes de casos mistos ao fazer o desenvolvimento de plataforma cruzada. Especialmente quando alguém decide renomear ou alterar o caso de um pacote, você depende dos seus VCS e ambientes de desenvolvimento para fazer exatamente a coisa certa com o caso de diretório.
Shorn
2
Na verdade, existem regras: "O prefixo do nome de um pacote único é sempre escrito em todas as minúsculas-ASCII letras" ( oracle.com/technetwork/java/codeconventions-135099.html )
José Gómez
4

Os sublinhados parecem feios nos nomes dos pacotes. Pelo que vale, no caso de nomes compostos por três ou mais palavras, eu uso iniciais (por exemplo com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo:) e, em seguida, documento a finalidade do pacote em package-info.java.

jpangamarca
fonte
4
Isto pode não ser legível e difícil de compreender o conteúdo do pacote por apenas olhando para o nome do pacote
Vishal Akkalkote
11
Justo. É por isso que sugiro usar a documentação. Eu usaria esta abordagem qualquer momento, em vez de palavras cheias concatenadas (apiratesheet - é que 'API Taxa Folha' ou 'Folha um pirata'?)
jpangamarca
1

A concatenação de palavras no nome do pacote é algo que a maioria dos desenvolvedores não faz.

Você pode usar algo como.

com.stackoverflow.mypackage

Consulte Declaração de Nome JLS

CraUmm
fonte