Quelle est la convention pour le séparateur de mots dans les noms de packages Java?

370

Comment séparer les mots dans les noms de paquet? Lesquels des énoncés suivants sont corrects?

  1. com.stackoverflow.my_package (souligner)
  2. com.stackoverflow.my-package (tirets)
  3. com.stackoverflow.MyPackage (Affaire de chameau)

Quelle est la norme générale?

Jigar
la source
15
un autre exemple non encore mentionné utilise une période:com.stackoverflow.my.package
Brad Cupit
11
(2) n'est pas Java légal. Je ne comprends pas pourquoi vous en parlez même.
Marquis de Lorne
Notez que tout cela est juste pour assurer l'unicité. La seule chose réellement appliquée est de rester en dehors de l'espace java. *.
Thorbjørn Ravn Andersen

Réponses:

248

Voici ce que prescrit le document officiel sur les conventions de dénomination:

Paquets

Le préfixe d'un nom de package unique est toujours écrit en en minuscules lettres ASCII et devrait être l' un des noms de domaine de niveau supérieur, actuellement com, edu, gov, mil, net, orgou l' un des codes anglais deux lettres identifiant pays comme spécifié dans la norme ISO Norme 3166, 1981.

Les composants suivants du nom du package varient en fonction des propres conventions de dénomination internes d'une organisation. De telles conventions peuvent spécifier que certains composants de nom de répertoire sont des noms de division, de service, de projet, de machine ou de connexion.

Exemples

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

Références


Notez qu'en particulier, tout ce qui suit le préfixe de domaine de premier niveau n'est pas spécifié par le document ci-dessus. Le JLS est également d'accord avec cela en donnant les exemples suivants:

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

L'extrait suivant est également pertinent:

Dans certains cas, le nom de domaine Internet peut ne pas être un nom de package valide. Voici quelques conventions suggérées pour faire face à ces situations:

  • Si le nom de domaine contient un trait d'union ou tout autre caractère spécial non autorisé dans un identifiant, convertissez-le en trait de soulignement.
  • Si l'un des composants de nom de package résultants sont des mots clés, ajoutez-y un trait de soulignement.
  • Si l'un des composants de nom de package résultant commence par un chiffre ou tout autre caractère non autorisé comme caractère initial d'un identificateur, un trait de soulignement est préfixé au composant.

Références

polygénelubrifiants
la source
52
Le chapitre 7.7 recommande même d'utiliser le trait de soulignement dans les noms de paquet!
Andreas Dolk
6
Ici: oracle.com/technetwork/java/codeconventions-135099.html il dit tout en bas, mais ici docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 il dit que le premier composant doit être en minuscules, ils ont également supprimé des exemples de séparation de mots en majuscules. Aussi ici: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html il dit tout en minuscules. Il semble donc que les majuscules dans les noms de package soient actuellement déconseillées.
dhblah
27
Le chapitre 7.7 ne recommande pas d'utiliser des traits de soulignement, il recommande de remplacer les symboles spéciaux / invalides par un trait de soulignement qui est assez loin de simplement recommander pour une utilisation générale.
eduard.dudar
270

Les trois ne sont pas les conventions.

Utilisez com.stackoverflow.mypackage.

Les noms de package ne respectent pas la casse de chameau ou les traits de soulignement ou les conventions de dénomination des packages de tirets .

En outre, Google Java Style Guide spécifie exactement la même (c'est-à-dire com.stackoverflow.mypackage) convention:

5.2.1 Noms des packages

Les noms de packages sont tous en minuscules, avec des mots consécutifs simplement concaténés ensemble (pas de soulignement). Par exemple, com.example.deepspace, pas com.example.deepSpace ou com.example.deep_space.

- Google Java Style Guide: 5.2 Règles par type d'identifiant: 5.2.1 Noms des packages .

bragboy
la source
9
Je suis partiellement d'accord - ils ne sont pas «faux» selon les conventions de nommage Java, mais ils ne devraient pas être utilisés à mon avis. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Andreas Dolk du
@Andreas_D le lien que vous avez fourni indique que "le préfixe d'un nom de package unique est toujours écrit en lettres ASCII tout en minuscules"
Jose Gómez
1
@ JoseGómez "Le préfixe ". Donc à mon humble avis, cela n'exclut pas tous les autres mots comprenant un nom de package d'être CamelCase ou snake_case
Antek
21

Tout le monde peut utiliser le trait de soulignement _ (c'est correct)

Personne ne devrait utiliser hypen - (sa mauvaise pratique)

Personne ne devrait utiliser de majuscules dans les noms de paquet (mauvaise pratique)

REMARQUE: Ici, "Bad Practice" est destiné à techniquement, vous êtes autorisé à utiliser cela, mais conventionnellement, ce n'est pas de bonnes manières d'écrire.

Source: nommer un package (docs.oracle)

Himanshu Mori
la source
47
Oui, l'utilisation d'un trait d'union est une mauvaise pratique, car il s'agit d'une erreur. Et écrire du code qui ne compile pas est en effet une mauvaise pratique.
glglgl
Bon lien - permet de mettre tout cela en contexte lorsque vous savez ce que dit la source. Je suis également habitué à toutes les conventions en minuscules. Mais selon les documents, il semble que ce soit simplement une question de choix / style. J'ai ajouté un commentaire au post spécifique sur le cas de chameau pour les noms de colis (qui je ne pense pas être un doublon de ce post, btw - qui pose simplement des questions sur la convention en général) stackoverflow.com/questions/36755783/…
Gene Bo
"Pas de majuscules", bien que je convienne que toutes les majuscules ou quelque chose qui ressemble à un nom de classe est une mauvaise idée, cela élimine également cet exemple. Dire "c'est une mauvaise pratique" est la raison la plus peu convaincante, vague et vide de sens à laquelle je puisse penser. Est-ce que cela peut être développé? (c.-à-d. définir la «mauvaise pratique»)
Manius
Vous dites toujours "c'est mauvais" sans justifier pourquoi cela devrait être considéré comme mauvais. Casse-t-il l'outillage? Créer de la confusion? Est-il plus difficile à lire ou à taper? Pour les exemples donnés, je pense que nous pouvons répondre oui à beaucoup d'entre eux. Mais je ne peux pas comprendre une interdiction absolue des majuscules. Un nom de package LikeThis (comme un nom de classe) est évidemment déroutant, mais likeThis ne me déroute pas et semble plus lisible pour un nom de package de deux mots comme bigdataSource (vs "bigdatasource"). À moins qu'il n'y ait une raison pour laquelle camelCase est une mauvaise idée pour les paquets que je ne connais pas, cela semble bien.
Manius
Il s'avère que j'ai manqué ceci: oracle.com/technetwork/java/codeconventions-135099.html Tous les minuscules font partie de la convention de nom de package d'Oracle. Je pense toujours que c'est une convention plutôt merdique pour exclure un cas de chameau qui commence plus bas, pour les moments (rares) où vous devez utiliser un nom de package de deux mots et cela n'a pas de sens d'en faire deux répertoires. Mais oh bien.
Manius
18

Les conventions de dénomination officielles ne sont pas si strictes, elles n'interdisent même pas la notation de cas de chameau à l'exception du préfixe ( comdans votre exemple).

Mais personnellement, j'éviterais les majuscules et les césures , même les chiffres. Je choisirais aussi com.stackoverflow.mypackagecomme Bragboy l'a suggéré.

(les césures «-» ne sont pas légales dans les noms de package)

ÉDITER

Intéressant - la spécification du langage a aussi quelque chose à dire sur les conventions de dénomination.

Au chapitre 7.7 Noms de packages uniques, nous voyons des exemples avec des noms de packages composés de lettres majuscules (donc la notation CamelCase serait OK) et ils suggèrent de remplacer l'hyphonation par un trait de soulignement ("mary-lou" -> "mary_lou") et le préfixe java mots clés avec un trait de soulignement ("com.example.enum" -> "com.example._enum")

Vous trouverez d'autres exemples de majuscules dans les noms de packages au chapitre 6.8.1 Noms de packages .

Andreas Dolk
la source
2
Comme Andreas l'a noté, il n'y a pas de règles sur l'utilisation de la casse supérieure dans les noms de paquets. Une raison spécifique pour l'éviter est que j'ai vu des gens rencontrer des problèmes avec les noms de packages à casse mixte lors du développement multiplateforme. Surtout lorsque quelqu'un décide de renommer ou de modifier la casse d'un package, vous comptez alors sur votre VCS et vos environnements de développement pour faire exactement la bonne chose avec la casse d'annuaire.
Shorn
2
En fait, il existe des règles: "Le préfixe d'un nom de package unique est toujours écrit en lettres ASCII tout en minuscules" ( oracle.com/technetwork/java/codeconventions-135099.html )
Jose Gómez
4

Les traits de soulignement sont laids dans les noms de paquets. Pour ce qui vaut, dans le cas de noms composés de trois mots ou plus, j'utilise des initiales (par exemple:) com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo, puis je documente le but du package dans package-info.java.

jpangamarca
la source
4
cela pourrait ne pas être lisible et difficile à comprendre le contenu du paquet en regardant simplement le nom du paquet
Vishal Akkalkote
1
C'est suffisant. C'est pourquoi je suggère d'utiliser la documentation. J'utiliserais cette approche à tout moment au lieu de mots entiers concaténés (apiratesheet - est-ce que 'API Rate Sheet' ou 'A Pirate Sheet'?)
jpangamarca
1

La concaténation des mots dans le nom du package est quelque chose que la plupart des développeurs ne font pas.

Vous pouvez utiliser quelque chose comme.

com.stackoverflow.mypackage

Reportez-vous à la déclaration de nom JLS

CraUmm
la source