¿Cuál es la convención para el separador de palabras en los nombres de paquetes Java?

370

¿Cómo se deben separar las palabras en los nombres de los paquetes? ¿Cuales de las siguientes son correctas?

  1. com.stackoverflow.my_package (guion bajo)
  2. com.stackoverflow.my-package (guiones)
  3. com.stackoverflow.MyPackage (El caso de Carmel)

¿Cuál es el estándar general?

Jigar
fuente
15
otro ejemplo que aún no se menciona es el uso de un punto:com.stackoverflow.my.package
Brad Cupit
11
(2) no es Java legal. No está claro por qué lo preguntas.
Marqués de Lorne
Tenga en cuenta que todo esto es solo para garantizar la unicidad. Lo único que realmente se aplica es mantenerse fuera del espacio java. *.
Thorbjørn Ravn Andersen

Respuestas:

248

Esto es lo que prescribe el documento oficial de convenciones de nomenclatura:

Paquetes

El prefijo del nombre de un paquete único se escribe siempre en todas en minúsculas letras ASCII y debe ser uno de los nombres de dominio de nivel superior, en la actualidad com, edu, gov, mil, net, org, o uno de los ingleses códigos de dos letras que identifican los países, como se especifica en la norma ISO Norma 3166, 1981.

Los componentes posteriores del nombre del paquete varían según las convenciones de nomenclatura internas de una organización. Dichas convenciones pueden especificar que ciertos componentes del nombre del directorio sean nombres de división, departamento, proyecto, máquina o inicio de sesión.

Ejemplos

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

Referencias


Tenga en cuenta que, en particular, el documento anterior no especifica nada que siga al prefijo de dominio de nivel superior. El JLS también está de acuerdo con esto al dar los siguientes ejemplos:

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

El siguiente extracto también es relevante:

En algunos casos, el nombre de dominio de Internet puede no ser un nombre de paquete válido. Estas son algunas convenciones sugeridas para tratar estas situaciones:

  • Si el nombre de dominio contiene un guión o cualquier otro carácter especial no permitido en un identificador, conviértalo en un guión bajo.
  • Si alguno de los componentes del nombre del paquete resultante son palabras clave, entonces agregue un guión bajo a ellas.
  • Si alguno de los componentes del nombre del paquete resultante comienza con un dígito, o cualquier otro carácter que no esté permitido como carácter inicial de un identificador, tenga un guión bajo prefijado al componente.

Referencias

poligenelubricantes
fuente
52
¡El Capítulo 7.7 incluso recomienda usar el guión bajo en los nombres de los paquetes!
Andreas Dolk el
66
Aquí: oracle.com/technetwork/java/codeconventions-135099.html dice all-lower, pero aquí docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 dice que el primer componente debe estar en minúsculas, también eliminaron ejemplos de separación de palabras en mayúsculas. También aquí: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html dice en minúsculas. Por lo tanto, parece que actualmente no se recomienda utilizar mayúsculas en los nombres de los paquetes.
dhblah
27
El Capítulo 7.7 no recomienda el uso de guiones bajos, recomienda reemplazar los símbolos especiales / inválidos con un guión bajo que está bastante lejos de recomendar para uso general.
eduard.dudar
270

Las tres no son las convenciones.

Uso com.stackoverflow.mypackage.

Los nombres de los paquetes no siguen la carcasa de camello ni los guiones bajos ni los guiones de convenciones de nomenclatura de paquetes .

Además, la Guía de estilo de Java de Google especifica exactamente la misma (es decir com.stackoverflow.mypackage) convención:

5.2.1 Nombres de paquete

Los nombres de los paquetes están en minúsculas, con palabras consecutivas simplemente concatenadas (sin guiones bajos). Por ejemplo, com.example.deepspace, no com.example.deepSpace o com.example.deep_space.

- Guía de estilo de Java de Google: 5.2 Reglas por tipo de identificador: 5.2.1 Nombres de paquetes .

fanfarrón
fuente
99
Estoy parcialmente de acuerdo: no están 'equivocados' según las convenciones de nomenclatura de Java, pero no deberían usarse en mi opinión. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Andreas Dolk el
@Andreas_D el enlace que proporcionó indica que "El prefijo de un nombre de paquete único siempre se escribe en letras ASCII en minúsculas"
Jose Gómez
1
@ JoseGómez "El prefijo ". En mi opinión, esto no excluye todas las otras palabras que comprenden un nombre de paquete de ser CamelCase o snake_case
Antek
21

Cualquiera puede usar guión bajo _ (está bien)

Nadie debería usar hypen - (es una mala práctica)

Nadie debe usar letras mayúsculas dentro de los nombres de los paquetes (Mala práctica)

NOTA: Aquí "Mala práctica" está destinada a que técnicamente se le permita usar eso, pero convencionalmente no es de buena educación escribir.

Fuente: nombrar un paquete (docs.oracle)

Himanshu Mori
fuente
47
Sí, usar un guión es una mala práctica, porque es un error. Y escribir código que no se compila es, de hecho, una mala práctica.
glglgl
Buen enlace: ayuda a darle a todo esto algo de contexto cuando sabes lo que dice la fuente. Estoy acostumbrado a todas las convenciones en minúsculas también. Pero según los documentos, parece que es simplemente una cuestión de elección / estilo. He agregado un comentario a la publicación específica sobre el caso de camello para los nombres de paquetes (que no creo que sea un duplicado de esta publicación, por cierto, que solo pregunta sobre la convención en general) stackoverflow.com/questions/36755783/…
Gene Bo
"Sin mayúsculas", aunque estaría de acuerdo en que todas las mayúsculas o algo que parece un ClassName es una mala idea, también elimina este ejemplo. Decir "es una mala práctica" es la razón más poco convincente, vaga y sin sentido que se me ocurre. ¿Se puede elaborar esto? (es decir, definir 'mala práctica')
Manius
Básicamente, todavía estás diciendo "es malo" sin justificar por qué debería considerarse malo. ¿Rompe las herramientas? ¿Crear confusión? ¿Es más difícil de leer o escribir? Para los ejemplos dados, creo que podemos responder sí a muchos de ellos. Pero no puedo entender una prohibición absoluta de las letras mayúsculas. Un nombre de paquete LikeThis (como el nombre de una clase) es obviamente confuso, pero likeThis no es confuso para mí y parece más legible para un nombre de paquete de dos palabras como bigdataSource (vs "bigdatasource"). A menos que haya alguna razón por la que camelCase sea una mala idea para los paquetes que desconozco, parece estar bien.
Manius
Resulta que me perdí esto: oracle.com/technetwork/java/codeconventions-135099.html Todas las minúsculas son parte de la convención de nombres de paquetes de Oracle. Todavía creo que es una convención bastante mala para descartar el caso de camello que comienza más bajo, para esos (raros) momentos en los que necesita usar un nombre de paquete de dos palabras y no tiene sentido convertirlo en dos directorios. Pero, oh, bueno.
Manius
18

Las convenciones de nomenclatura oficiales no son tan estrictas, ni siquiera 'prohíben' la notación de casos de camellos, excepto el prefijo ( comen su ejemplo).

Pero personalmente evitaría las letras mayúsculas y las guiones , incluso los números. Elegiría com.stackoverflow.mypackagecomo Bragboy sugirió también.

(las guiones '-' no son legales en los nombres de paquetes)

EDITAR

Interesante: la especificación del lenguaje también tiene algo que decir sobre las convenciones de nomenclatura.

En el Capítulo 7.7 Nombres únicos de paquetes vemos ejemplos con nombres de paquetes que consisten en letras mayúsculas (por lo que la notación CamelCase estaría bien) y sugieren reemplazar la hibonación por un guión bajo ("mary-lou" -> "mary_lou") y el prefijo java palabras clave con un guión bajo ("com.example.enum" -> "com.example._enum")

Se pueden encontrar algunos ejemplos más de letras mayúsculas en los nombres de paquetes en el capítulo 6.8.1 Nombres de paquetes .

Andreas Dolk
fuente
2
Como Andreas ha notado, no hay reglas sobre el uso de mayúsculas en los nombres de paquetes. Una razón específica para evitarlo es que he visto personas que tienen problemas con los nombres de paquetes de mayúsculas y minúsculas cuando realizan un desarrollo multiplataforma. Especialmente cuando alguien decide cambiar el nombre o cambiar el caso de un paquete, entonces confía tanto en su VCS como en los entornos de desarrollo para hacer exactamente lo correcto con el caso del directorio.
Cortado el
2
En realidad, hay reglas: "El prefijo de un nombre de paquete único siempre se escribe en letras ASCII en minúsculas" ( oracle.com/technetwork/java/codeconventions-135099.html )
Jose Gómez
4

Los guiones bajos se ven feos en los nombres de los paquetes. Para lo que vale, en el caso de nombres compuestos de tres o más palabras, uso las iniciales (por ejemplo:) com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijoy luego documento el propósito del paquete package-info.java.

jpangamarca
fuente
44
esto podría no ser legible y difícil de entender el contenido del paquete simplemente mirando el nombre del paquete
Vishal Akkalkote
1
Lo suficientemente justo. Por eso sugiero usar documentación. Usaría este enfoque en cualquier momento en lugar de palabras completas concatenadas (una hoja de apirates - ¿es esa 'Hoja de tarifas API' o 'Una hoja pirata'?)
jpangamarca
1

La concatenación de palabras en el nombre del paquete es algo que la mayoría de los desarrolladores no hacen.

Puedes usar algo como.

com.stackoverflow.mypackage

Consulte la Declaración de nombres JLS

CraUmm
fuente