Яка умова для розділювача слів у назвах пакетів Java?


370

Як слід мати окремі слова в назвах пакетів? Що з наведеного нижче є правильним?

  1. com.stackoverflow.my_package (підкреслення)
  2. com.stackoverflow.my-package (дефіси)
  3. com.stackoverflow.MyPackage (CamelCase)

Що таке загальний стандарт?


15
Ще один приклад, який ще не згадується, - це використання періоду:com.stackoverflow.my.package
Брад Купіт

11
(2) не є законною Java. Незрозуміло, чому ви навіть про це питаєте.
Маркіз Лорн

Зауважте, що все це лише для того, щоб забезпечити унікальність. Єдине, що насправді примусово - це залишатися поза явою.
Thorbjørn Ravn Andersen

Відповіді:


248

Ось що прописано в офіційному документі про конвенції про іменування:

Пакети

Приставка унікального імені пакета завжди пишеться в усіх великих буквах ASCII букв і повинна бути одним з імен доменів верхнього рівня, в даний час com, edu, gov, mil, net,org , або один з англійських двох літерних кодів , що ідентифікують країни як визначено в ISO Стандарт 3166, 1981.

Подальші компоненти назви пакета змінюються залежно від власних внутрішніх правил організації імен. Такі умовні умови можуть визначати, що певні компоненти імен каталогів - це імена підрозділів, відділів, проектів, машин або входу.

Приклади

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

Список літератури


Зауважте, що, зокрема, усе, що відповідає префіксу домену верхнього рівня, не визначено вищевказаним документом. JLS також погоджується з цим, наводячи такі приклади:

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

Наступний уривок також є актуальним:

У деяких випадках ім'я домену в Інтернеті може бути неправдивим пакетом. Ось кілька запропонованих конвенцій для вирішення цих ситуацій:

  • Якщо доменне ім’я містить дефіс або будь-який інший спеціальний символ, який не дозволений в ідентифікаторі, перетворіть його у підкреслення.
  • Якщо будь-який із отриманих компонентів імені пакета є ключовими словами, додайте до них підкреслення.
  • Якщо будь-який із отриманих компонентів імені пакета починається з цифри або будь-якого іншого символу, який не дозволений як початковий символ ідентифікатора, має підкреслення з префіксом для компонента.

Список літератури


52
Глава 7.7 ​​навіть рекомендує використовувати підкреслення в назвах пакетів!
Андреас Долк


6
Тут: oracle.com/technetwork/java/codeconventions-135099.html там написано все-нижнє, але тут docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 він говорить що перший компонент повинен бути в малому регістрі, також вони видалили приклади розділення великих букв слова. Також тут: docs.oracle.com/javase/tutorial/java/package/namingpkgs.html в ньому йдеться про всі регістри . Тож здається, що на сьогоднішній день великі регістри у назвах пакетів не відмовляються.
dhblah

27
Розділ 7.7 не рекомендує використовувати підкреслення, він рекомендує замінити спеціальні / недійсні символи на підкреслення, що далеко не просто рекомендується для загального використання.
eduard.dudar

270

Усі три не є умовами.

Використовуйте com.stackoverflow.mypackage.

Назви упаковки не відповідають принципу верблюда або підкреслюють або дефіси пакету дефісів .

Також у посібнику стилів Google Java визначено точно таку ж (тобто com.stackoverflow.mypackage) умову:

5.2.1 Назви упаковок

Назви пакунків - це малі регістри, а послідовні слова просто з'єднані разом (без підкреслення). Наприклад com.example.deepspace, ні com.example.deepSpace або com.example.deep_space.

- Посібник зі стилю Google Java: 5.2 Правила за типом ідентифікатора: 5.2.1 Назви пакетів .


9
Я частково погоджуюся - вони не «помиляються» відповідно до конвенцій про іменування Java, але на мою думку вони не повинні використовуватися ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Андреас Долк

@Andreas_D у наданому вами посиланні вказано, що "Префікс унікальної назви пакету завжди пишеться з малих літер ASCII"
Хосе Гомес,

1
@ JoseGómez " Приставка ". Тож imho це не виключає всіх інших слів, що містять назву пакета, з CamelCase або snake_case
Antek

21

Будь-хто може використовувати підкреслення _ (його добре)

Ніхто не повинен використовувати hypen - (його погана практика)

Ніхто не повинен використовувати великі літери всередині імен пакунків (Погана практика)

ПРИМІТКА. Тут "Погана практика" призначена для технічного використання, яке вам дозволяється використовувати, але звичайно це не дуже вдало.

Джерело: Іменування пакету (docs.oracle)


47
Так, використання дефісу - це погана практика, оскільки це помилка. І написання коду, який не компілюється, справді є поганою практикою.
glglgl

Гарне посилання - допомагає надати цьому все деякий контекст, коли ви знаєте, що говорить джерело. Я звик також до всіх нижчих випадків. Але, згідно з документами, схоже, це просто питання вибору / стилю. Я додав коментар до конкретного допиту, який запитував про справу верблюдів для імен пакунків (що, на мою думку, не є дублікатом цієї публікації, btw - який просто запитує про конвенцію взагалі) stackoverflow.com/questions/36755783/…
Джин Бо

"Без великих літер", хоча я погоджуюся, що всі літери або щось подібне до ClassName - це погана ідея, це також виключає цей приклад. Говорити "це погана практика" - це про найбільш непереконливу, розпливчасту і безглузду причину, про яку я можу придумати. Чи можна це детальніше розробити? (тобто визначте «погану практику»)
Manius

Ви все ще говорите "це погано", не даючи виправдання, чому це слід вважати поганим. Чи зламає він інструментарій? Створювати плутанину? Чи важче читати чи друкувати? Надаючи приклади, я думаю, що ми можемо відповісти "так" на багато з них. Але я не можу зрозуміти абсолютну заборону великих літер. Ім'я пакету LikeThis (як і ім’я класу), очевидно, заплутане, але подібнеЦе не бентежить мене і здається більш читабельним для двох словнього імені пакета, як bigdataSource (проти "bigdatasource"). Якщо немає якихось причин camelCase - це погана ідея для пакетів, про які я не знаю, це здається прекрасним.
Маній

Виявляється, я пропустив це: oracle.com/technetwork/java/codeconventions-135099.html Усі малі регістри є частиною конвенції про назву пакета Oracle. Я все ще думаю, що це досить хитра умова, щоб виключити випадок верблюда, який починається нижчим, для тих (рідкісних) періодів, коли вам потрібно використовувати двословне ім'я пакету, і не має сенсу робити це двома каталогами. Але добре.
Маній

18

Офіційні угоди про іменування не такі строгі, вони навіть не «забороняють» позначення справи верблюда, крім префікса ( comу вашому прикладі).

Але я особисто уникав великих букв і дефісів , парних цифр. Я б вибрав так, com.stackoverflow.mypackageяк запропонував і Брейбой.

(дефіси "-" не є законними у назвах пакетів)

EDIT

Цікаво - мовна специфікація має щось сказати і про конвенції про іменування.

У Розділі 7.7 Унікальні імена пакунків ми бачимо приклади з іменами пакунків, які складаються з великих літер (таким чином, позначення CamelCase було б нормальним), і вони пропонують замінити гіфонацію підкресленням ("mary-lou" -> "mary_lou") і префіксом java ключові слова з підкресленням ("com.example.enum" -> "com.example._enum")

Ще кілька прикладів великих літер у назвах пакетів можна знайти у главі 6.8.1 Імена пакунків .


2
Як зазначив Андреас, немає правил щодо використання верхнього корпусу в назвах пакетів. Однією з конкретних причин цього уникати є те, що я бачив, як люди стикаються зі змішаними іменами пакетів справ при розробці крос-платформ. Особливо , коли хто - то вирішує перейменувати або змінити регістр пакета, ви потім покладатися на обидва ваші VCS і середовищ розробки , щоб зробити саме те , що потрібно зі справою каталогу.
Шорн

2
Власне, є правила: "Префікс унікальної назви пакета завжди записується великими літерами ASCII" ( oracle.com/technetwork/java/codeconventions-135099.html )
Жозе Гомес

4

Підкреслення виглядають некрасиво у назвах пакетів. Що для того, що варто, у випадку імен, що складаються з трьох і більше слів, я використовую ініціали (наприклад com.company.app.ingresoegresofijo (ingreso/egreso fijo) -> com.company.app.iefijo:), а потім документую мету пакета в package-info.java.


4
це може бути не читабельним і важким для розуміння вмісту пакета, просто подивившись назву пакета
Vishal Akkalkote

1
Справедливо. Ось чому я пропоную використовувати документацію. Я підходив би до цього підходу будь-коли замість стислих повних слів (apiratesheet - це "API Rate Sheet" або "Pirate Sheet"?)
jpangamarca

1

З’єднання слів у назві пакета - це те, що більшість розробників не робить.

Можна використовувати щось подібне.

com.stackoverflow.mypackage

Зверніться до Декларації імені JLS

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.