Jaka jest konwencja separatora słów w nazwach pakietów Java?

370

Jak należy rozdzielić słowa w nazwach pakietów? Które z poniższych są poprawne?

  1. com.stackoverflow.my_package (podkreślać)
  2. com.stackoverflow.my-package (Myślniki)
  3. com.stackoverflow.MyPackage (CamelCase)

Jaki jest ogólny standard?

Dżigar
źródło
15
innym jeszcze nie wymienionym przykładem jest kropka:com.stackoverflow.my.package
Brad Cupit
11
(2) nie jest legalną Javą. Niejasne, dlaczego w ogóle o to pytasz.
Markiz Lorne
Pamiętaj, że wszystko to ma na celu zapewnienie wyjątkowości. Jedyne, co faktycznie jest egzekwowane, to trzymać się z dala od przestrzeni Java. *
Thorbjørn Ravn Andersen

Odpowiedzi:

248

Oto, co nakazuje oficjalny dokument konwencji nazewnictwa:

Pakiety

Przedrostek unikalnej nazwy pakietu jest zawsze napisane we wszystkich, małych liter ASCII i powinien być jedną z nazw domen najwyższego poziomu, obecnie com, edu, gov, mil, net, org, lub w jednym z angielskich kodów dwuliterowych kraje identyfikacyjnych zgodnie z ISO Standard 3166, 1981.

Kolejne składniki nazwy pakietu różnią się zgodnie z wewnętrznymi konwencjami nazewnictwa organizacji. Takie konwencje mogą określać, że niektóre komponenty nazw katalogów to nazwy działów, działów, projektów, maszyn lub loginów.

Przykłady

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

Bibliografia


Zwróć uwagę, że w szczególności wszystko, co następuje po prefiksie domeny najwyższego poziomu, nie jest określone w powyższym dokumencie. JLS zgadza się z tym, podając następujące przykłady:

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

Istotny jest również następujący fragment:

W niektórych przypadkach nazwa domeny internetowej może nie być prawidłową nazwą pakietu. Oto kilka sugerowanych konwencji postępowania w takich sytuacjach:

  • Jeśli nazwa domeny zawiera łącznik lub inny znak specjalny niedozwolony w identyfikatorze, przekonwertuj go na znak podkreślenia.
  • Jeśli którykolwiek z wynikowych składników nazwy pakietu jest słowem kluczowym, dodaj do nich znak podkreślenia.
  • Jeśli którykolwiek z wynikowych składników nazwy pakietu zaczyna się cyfrą lub innym znakiem, który nie jest dozwolony jako początkowy znak identyfikatora, należy poprzedzić znakiem podkreślenie.

Bibliografia

środki smarujące wielotlenowe
źródło
52
Rozdział 7.7 zaleca nawet stosowanie podkreślenia w nazwach pakietów!
Andreas Dolk
6
Tutaj: oracle.com/technetwork/java/codeconventions-135099.html mówi wszystko niżej, ale tutaj docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 mówi że pierwszy składnik powinien być zapisany małymi literami, usunięto także przykłady separacji wielkich liter. Również tutaj: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html jest napisane małą literą. Wygląda więc na to, że duże litery w nazwach pakietów są obecnie odradzane.
dhblah,
27
Rozdział 7.7 nie zaleca używania znaków podkreślenia, zaleca zastąpienie specjalnych / niepoprawnych symboli znakiem podkreślenia, co jest dalekie od zwykłego korzystania z nich.
eduard.dudar
270

Wszystkie trzy nie są konwencjami.

Zastosowanie com.stackoverflow.mypackage.

Nazwy pakietów nie są zgodne z konwencją nazewnictwa wielbłądów, podkreśleniami lub łącznikami .

Ponadto Przewodnik po stylu Google Java określa dokładnie tę samą (tj. com.stackoverflow.mypackage) Konwencję:

5.2.1 Nazwy pakietów

Nazwy pakietów są pisane małymi literami, a kolejne słowa są po prostu łączone razem (bez podkreślników). Na przykład com.example.deepspace, nie com.example.deepSpace bądź com.example.deep_space.

- Przewodnik po stylu Java firmy Google: 5.2 Reguły według typu identyfikatora: 5.2.1 Nazwy pakietów .

bragboy
źródło
9
Częściowo się zgadzam - nie są one „złe” zgodnie z konwencjami nazewnictwa java, ale moim zdaniem nie należy ich używać. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Andreas Dolk
@Andreas_D podany przez ciebie link mówi, że „Prefiks unikalnej nazwy pakietu jest zawsze pisany małymi literami ASCII”
Jose Gómez
1
@ JoseGómez „ Prefiks ”. Więc imho nie wyklucza to, że wszystkie inne słowa składające się na nazwę pakietu to CamelCase lub snake_case
Antek
21

Każdy może używać podkreślenia _ (jego OK)

Nikt nie powinien używać hypen - (jego zła praktyka)

Nikt nie powinien używać wielkich liter w nazwach paczek (zła praktyka)

UWAGA: Tutaj „Zła praktyka” jest przeznaczona dla tego, że technicznie możesz to wykorzystać, ale konwencjonalnie nie jest to dobre maniery do pisania.

Źródło: Nazywanie pakietu (docs.oracle)

Himanshu Mori
źródło
47
Tak, używanie łącznika jest złą praktyką, ponieważ jest błędem. A pisanie kodu, który się nie kompiluje, jest rzeczywiście złą praktyką.
glglgl
Dobry link - pomaga nadać temu kontekstowi pewien kontekst, gdy wiesz, co mówi źródło. Jestem przyzwyczajony do wszystkich konwencji małych liter. Ale według dokumentów wygląda na to, że jest to po prostu kwestia wyboru / stylu. Dodałem komentarz do konkretnego postu z pytaniem na temat wielbłąda dla nazw paczek (co nie wydaje mi się duplikatem tego postu, btw - który po prostu pyta o konwencję ogólnie) stackoverflow.com/questions/36755783/...
Gene Bo
„Bez wielkich liter”, chociaż zgodziłbym się, że wszystkie wielkie litery lub coś, co wygląda jak nazwa klasy, jest złym pomysłem, ale również eliminuje ten przykład. Mówienie „to zła praktyka” dotyczy najbardziej nieprzekonującego, niejasnego i pozbawionego znaczenia powodu, o którym mogę myśleć. Czy można to rozwinąć? (tj. zdefiniuj „złą praktykę”)
Manius
Nadal w zasadzie mówisz „to źle” bez uzasadnienia, dlaczego należy to uznać za złe. Czy to psuje oprzyrządowanie? Stwórz zamieszanie? Czy trudniej jest czytać lub pisać? W podanych przykładach myślę, że możemy odpowiedzieć tak na wiele z nich. Ale nie rozumiem absolutnego zakazu wielkich liter. Nazwa pakietu LikeThis (jak nazwa klasy) jest oczywiście myląca, ale likeThis nie jest to dla mnie mylące i wydaje się bardziej czytelne dla dwuliterowej nazwy pakietu, takiej jak bigdataSource (vs „bigdatasource”). O ile nie istnieje jakiś powód, dla którego camelCase jest złym pomysłem na pakiety, o których nie wiem, wydaje się to w porządku.
Manius
Okazuje się, że przegapiłem to: oracle.com/technetwork/java/codeconventions-135099.html Wszystkie małe litery są częścią konwencji nazw pakietów Oracle. Nadal uważam, że jest to dość kiepska konwencja, aby wykluczyć wielbłądy, które zaczynają się od niższych, w tych (rzadkich) czasach, kiedy trzeba użyć dwusłowowej nazwy pakietu i nie ma sensu tworzyć dwóch katalogów. Ale no cóż.
Manius
18

Oficjalne konwencje nazewnictwa nie są aż tak rygorystyczne, nawet nie zabraniają notacji na wielbłądach z wyjątkiem prefiksu (com w twoim przykładzie).

Ale osobiście unikałbym wielkich liter i łączników , a nawet liczb. Wybrałbymcom.stackoverflow.mypackage jak Bragboy zasugerował też.

(dzielenia wyrazów „-” nie są dozwolone w nazwach pakietów)

EDYTOWAĆ

Ciekawe - specyfikacja języka ma również coś do powiedzenia na temat konwencji nazewnictwa.

W rozdziale 7.7 Unikalne nazwy pakietów widzimy przykłady z nazwami pakietów składającymi się z wielkich liter (więc notacja CamelCase byłaby OK) i sugerują zastąpienie hiphonacji znakiem podkreślenia („mary-lou” -> „mary_lou”) i prefiksem java słowa kluczowe z podkreśleniem („com.example.enum” -> „com.example._enum”)

Więcej przykładów wielkich liter w nazwach pakietów można znaleźć w rozdziale 6.8.1 Nazwy pakietów .

Andreas Dolk
źródło
2
Jak zauważył Andreas, nie ma żadnych zasad dotyczących używania górnej obudowy w nazwach pakietów. Jednym z konkretnych powodów, dla których należy tego unikać, jest to, że widziałem, jak ludzie napotykają problemy z nazwami pakietów o mieszanych wielkościach liter podczas tworzenia różnych platform. Zwłaszcza, gdy ktoś decyduje się na zmianę nazwy lub zmianę wielkości paczki, wtedy polegasz zarówno na VCS, jak i na środowiskach programistycznych, aby zrobić dokładnie to samo z przypadkiem katalogu.
Shorn
2
W rzeczywistości istnieją zasady: „Prefiks unikalnej nazwy pakietu jest zawsze pisany małymi literami ASCII” ( oracle.com/technetwork/java/codeconventions-135099.html )
Jose Gómez
4

Podkreślenia wyglądają brzydko w nazwach pakietów. Co jest warte, w przypadku nazw złożonych z trzech lub więcej słów używam inicjałów (na przykład:), com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijoa następnie dokumentuję cel pakietu package-info.java.

jpangamarca
źródło
4
może to nie być czytelne i trudne do zrozumienia zawartości opakowania, patrząc tylko na nazwę pakietu
Vishal Akkalkote
1
Słusznie. Dlatego sugeruję korzystanie z dokumentacji. Zastosowałbym to podejście w dowolnym momencie zamiast łączonych pełnych słów (arkusz apirates - czy to „Arkusz stawek API” czy „Arkusz piratów”?)
jpangamarca
1

Łączenie słów w nazwie pakietu jest czymś, czego większość programistów nie robi.

Możesz użyć czegoś takiego.

com.stackoverflow.mypackage

Zobacz deklarację nazwy JLS

CraUmm
źródło