Qual è la convenzione per il separatore di parole nei nomi dei pacchetti Java?


370

Come si dovrebbero separare le parole nei nomi dei pacchetti? Quali delle seguenti sono corrette?

  1. com.stackoverflow.my_package (sottolineare)
  2. com.stackoverflow.my-package (Trattini)
  3. com.stackoverflow.MyPackage (CamelCase)

Qual è lo standard generale?


15
un altro esempio non ancora menzionato sta usando un periodo:com.stackoverflow.my.package
Brad Cupit,

11
(2) non è Java legale. Non è chiaro il motivo per cui lo stai anche chiedendo.
Marchese di Lorne,

Si noti che tutto ciò è solo per garantire unicità. L'unica cosa effettivamente applicata è di stare fuori dallo spazio java. *.
Thorbjørn Ravn Andersen,

Risposte:


248

Ecco cosa prescrive il documento ufficiale sulle convenzioni di denominazione:

Pacchi

Il prefisso di un nome unico pacchetto è sempre scritto in tutti i-minuscole lettere ASCII e deve essere uno dei nomi di dominio di primo livello, attualmente com, edu, gov, mil, net,org , o uno degli inglesi codici a due lettere che identificano i paesi come specificato nella norma ISO Standard 3166, 1981.

I componenti successivi del nome del pacchetto variano in base alle convenzioni di denominazione interne dell'organizzazione. Tali convenzioni potrebbero specificare che determinati componenti di nomi di directory siano nomi di divisione, reparto, progetto, macchina o login.

Esempi

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

Riferimenti


Si noti che, in particolare, tutto ciò che segue il prefisso di dominio di livello superiore non è specificato dal documento sopra. Il JLS concorda anche con questo dando i seguenti esempi:

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

Anche il seguente estratto è rilevante:

In alcuni casi, il nome del dominio Internet potrebbe non essere un nome pacchetto valido. Ecco alcune convenzioni suggerite per affrontare queste situazioni:

  • Se il nome di dominio contiene un trattino o qualsiasi altro carattere speciale non consentito in un identificatore, convertilo in un trattino basso.
  • Se uno qualsiasi dei componenti del nome del pacchetto risultante sono parole chiave, aggiungere un trattino basso ad essi.
  • Se uno qualsiasi dei componenti del nome pacchetto risultante inizia con una cifra o qualsiasi altro carattere non consentito come carattere iniziale di un identificatore, è presente un carattere di sottolineatura con prefisso al componente.

Riferimenti


52
Il capitolo 7.7 consiglia persino di usare il trattino basso nei nomi dei pacchetti!
Andreas Dolk,


6
Qui: oracle.com/technetwork/java/codeconventions-135099.html dice tutto in basso, ma qui docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 dice che il primo componente dovrebbe essere in minuscolo, inoltre hanno rimosso esempi di separazione delle parole in maiuscolo. Anche qui: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html dice tutto in minuscolo. Quindi sembra che le lettere maiuscole nei nomi dei pacchetti siano attualmente scoraggiate.
dhblah,

27
Il capitolo 7.7 non raccomanda l'uso di caratteri di sottolineatura, raccomanda di sostituire i simboli speciali / non validi con un carattere di sottolineatura che è piuttosto lontano dalla semplice raccomandazione per l'uso generale.
eduard.dudar,

270

Tutti e tre non sono le convenzioni.

Usa com.stackoverflow.mypackage.

I nomi dei pacchetti non seguono l'intelaiatura del cammello, la sottolineatura o la convenzione di denominazione del pacchetto trattini .

Inoltre, la Guida di stile di Google Java specifica esattamente la stessa (cioè com.stackoverflow.mypackage) convenzione:

5.2.1 Nomi dei pacchetti

I nomi dei pacchetti sono tutti in minuscolo, con parole consecutive semplicemente concatenate insieme (senza caratteri di sottolineatura). Ad esempio com.example.deepspace, no com.example.deepSpace o com.example.deep_space.

- Guida allo stile di Google Java: 5.2 Regole per tipo di identificatore: 5.2.1 Nomi dei pacchetti .


9
Sono parzialmente d'accordo - non sono "sbagliati" secondo le convenzioni di denominazione Java ma non dovrebbero essere usati secondo me. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Andreas Dolk

@Andreas_D il link fornito indica che "Il prefisso di un nome pacchetto univoco è sempre scritto in lettere ASCII minuscole"
Jose Gómez,

1
@ JoseGómez "Il prefisso ". Quindi imho questo non esclude tutte le altre parole che comprendono un nome di pacchetto da essere CamelCase o snake_case
Antek

21

Chiunque può usare il trattino basso _ (va bene)

Nessuno dovrebbe usare hypen - (la sua cattiva pratica)

Nessuno dovrebbe usare le lettere maiuscole all'interno dei nomi dei pacchetti (cattiva pratica)

NOTA: Qui "Bad Practice" è pensato tecnicamente che ti è permesso usarlo, ma convenzionalmente non è in buone maniere per scrivere.

Fonte: Naming a Package (docs.oracle)


47
Sì, l'uso di un trattino è una cattiva pratica, perché è un errore. E scrivere codice che non viene compilato è davvero una cattiva pratica.
glglgl,

Buon collegamento - aiuta a dare tutto questo un po 'di contesto quando sai cosa dice la fonte. Sono abituato anche a tutte le convenzioni minuscole. Ma secondo i documenti, sembra che sia semplicemente una questione di scelta / stile. Ho aggiunto un commento al post specifico chiesto sul caso del cammello per i nomi dei pacchetti (che non credo sia un duplicato di questo post, a proposito - che chiede solo della convenzione in generale) stackoverflow.com/questions/36755783/…
Gene Bo,

"Nessuna lettera maiuscola", anche se concordo sul fatto che tutte le maiuscole o qualcosa che assomiglia a un ClassName sia una cattiva idea, elimina anche questo esempio. Dire "è una cattiva pratica" è la ragione più poco convincente, vaga e insignificante che mi viene in mente. Questo può essere elaborato? (vale a dire definire "cattive pratiche")
Manius

In pratica stai ancora dicendo "è cattivo" senza dare giustificazione sul perché dovrebbe essere considerato cattivo. Rompono gli utensili? Creare confusione? È più difficile da leggere o digitare? Per gli esempi forniti, penso che possiamo rispondere di sì a molti di questi. Ma non riesco a capire un divieto assoluto di lettere maiuscole. Un nome di pacchetto LikeThis (come un nome di classe) è ovviamente confuso, ma likeThis non mi confonde e sembra più leggibile per un nome di pacchetto di due parole come bigdataSource (vs "bigdatasource"). A meno che non ci sia qualche ragione per cui camelCase sia una cattiva idea per i pacchetti di cui non sono a conoscenza, ciò sembra a posto.
Manius,

A quanto pare ho perso questo: oracle.com/technetwork/java/codeconventions-135099.html Tutte le lettere minuscole fanno parte della convenzione sul nome del pacchetto Oracle. Penso ancora che sia una convenzione piuttosto scadente per escludere il caso dei cammelli che inizia più in basso, per quelle (rare) volte in cui è necessario utilizzare un nome di pacchetto di due parole e non ha senso trasformarlo in due directory. Ma vabbè.
Manius,

18

Le convenzioni ufficiali di denominazione non sono così rigide, non "vietano" nemmeno la notazione sul caso dei cammelli, tranne per il prefisso ( comnel tuo esempio).

Ma personalmente eviterei lettere maiuscole e sillabazioni , numeri pari. Sceglierei com.stackoverflow.mypackagecome suggeriva anche Bragboy.

(le sillabazioni '-' non sono legali nei nomi dei pacchetti)

MODIFICARE

Interessante: le specifiche del linguaggio hanno qualcosa da dire anche sulle convenzioni di denominazione.

Nel capitolo 7.7 Nomi di pacchetti univoci vediamo esempi con nomi di pacchetti che consistono in lettere maiuscole (quindi la notazione CamelCase sarebbe OK) e suggeriscono di sostituire l'hyphonation con un trattino basso ("mary-lou" -> "mary_lou") e il prefisso java parole chiave con un trattino basso ("com.example.enum" -> "com.example._enum")

Alcuni altri esempi di lettere maiuscole nei nomi dei pacchetti si trovano nel capitolo 6.8.1 Nomi dei pacchetti .


2
Come ha notato Andreas, non ci sono regole sull'uso del case superiore nei nomi dei pacchetti. Un motivo specifico per evitarlo è che ho visto persone incontrare problemi con nomi di pacchetti a caso misto durante lo sviluppo multipiattaforma. Soprattutto quando qualcuno decide di rinominare o cambiare il caso di un pacchetto, allora fai affidamento sia sul tuo VCS che sugli ambienti di sviluppo per fare esattamente la cosa giusta con il caso della directory.
Ha tagliato l'

2
In realtà, ci sono delle regole: "Il prefisso di un nome pacchetto unico è sempre scritto in lettere ASCII minuscole" ( oracle.com/technetwork/java/codeconventions-135099.html )
Jose Gómez,

4

Le sottolineature sembrano brutte nei nomi dei pacchetti. Per quello che vale, in caso di nomi composti da tre o più parole uso le iniziali (ad esempio:) com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijoe quindi documento lo scopo del pacchetto package-info.java.


4
questo potrebbe non essere leggibile e difficile da capire il contenuto del pacchetto semplicemente guardando il nome del pacchetto
Vishal Akkalkote

1
Giusto. Ecco perché suggerisco di usare la documentazione. Userei questo approccio in qualsiasi momento invece delle parole intere concatenate (apiratesheet - è "Foglio tariffario API" o "Foglio pirata"?)
jpangamarca

1

La concatenazione di parole nel nome del pacchetto è qualcosa che la maggior parte degli sviluppatori non fa.

Puoi usare qualcosa di simile.

com.stackoverflow.mypackage

Fare riferimento Dichiarazione del nome JLS

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.