Каково соглашение для разделителя слов в именах пакетов Java?

370

Как следует разделять слова в именах пакетов? Какие из следующих являются правильными?

  1. com.stackoverflow.my_package (подчеркивать)
  2. com.stackoverflow.my-package (Дефис)
  3. com.stackoverflow.MyPackage (CamelCase)

Каков общий стандарт?

Jigar
источник
15
еще один пример, который еще не упомянут, - использование периода:com.stackoverflow.my.package
Брэд Купит
11
(2) не является законной Java. Непонятно, почему ты вообще об этом спрашиваешь.
Маркиз Лорн
Обратите внимание, что все это только для обеспечения уникальности. Единственное, что на самом деле принуждается, это оставаться вне пространства Java. *
Турбьерн Равн Андерсен

Ответы:

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

Следующая выдержка также актуальна:

В некоторых случаях имя интернет-домена может не являться допустимым именем пакета. Вот некоторые предлагаемые соглашения для решения этих ситуаций:

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

Ссылки

polygenelubricants
источник
52
Глава 7.7 ​​даже рекомендует использовать подчеркивание в именах пакетов!
Андреас Долк
1
Обновленные ссылки: docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.1 docs.oracle.com/javase/specs/jls/se7/html/jls-7.html# jls-7.1 (больше нет 6.8.1 и 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 здесь написано строчными буквами. Поэтому кажется, что заглавные буквы в именах пакетов в настоящее время не приветствуются.
Дабл
27
Глава 7.7 ​​не рекомендует использовать подчеркивания, она рекомендует заменять специальные / недействительные символы подчеркиванием, которое довольно далеко от рекомендации общего использования.
eduard.dudar
270

Все три не являются соглашениями.

Использование com.stackoverflow.mypackage.

Имена пакетов не следуют верблюда корпуса или подчеркивания или дефисы пакетов соглашение об именах .

Кроме того, в Google Java Style Guide указано точно такое же (т.е. com.stackoverflow.mypackage) соглашение:

5.2.1 Имена пакетов

Все имена пакетов в нижнем регистре с последовательными словами, просто соединенными вместе (без подчеркивания). Например com.example.deepspace, нет com.example.deepSpace или com.example.deep_space.

- Google Java Style Guide: 5.2 Правила по типу идентификатора: 5.2.1 Имена пакетов .

bragboy
источник
9
Я частично согласен - они не являются «неправильными» согласно соглашениям об именах java, но они не должны использоваться по моему мнению. ( java.sun.com/docs/codeconv/html/CodeConventions.doc8.html )
Андреас Долк
@Andreas_D ссылка, которую вы указали, гласит, что «Префикс уникального имени пакета всегда пишется строчными буквами ASCII»
Хосе Гомес
1
@ JoseGómez " Приставка ". Имхо, это не исключает всех других слов, составляющих имя пакета, из CamelCase или snake_case
Antek
21

Любой может использовать подчеркивание _ (все в порядке)

Никто не должен использовать hypen - (это плохая практика)

Никто не должен использовать заглавные буквы внутри имен пакетов (плохая практика)

ПРИМЕЧАНИЕ. Здесь «Плохая практика» предназначена для того, чтобы технически вам разрешалось это использовать, но условно писать ее нехорошо.

Источник: Наименование пакета (docs.oracle)

Химаншу Мори
источник
47
Да, использование дефиса - плохая практика, потому что это ошибка. И написание кода, который не компилируется, действительно плохая практика.
glglgl
Хорошая ссылка - помогает придать всему этому некоторый контекст, когда вы знаете, что говорит источник. Я также привык к строчным буквам. Но, согласно документации, похоже, что это просто вопрос выбора / стиля. Я добавил комментарий к конкретному сообщению с вопросом о случае верблюда для названий пакетов (который я не считаю дубликатом этого сообщения, кстати, - который просто спрашивает о соглашении в целом) stackoverflow.com/questions/36755783/…
Джин Бо
«Без заглавных букв», хотя я согласен с тем, что все заглавные буквы или что-то похожее на ClassName - плохая идея, это также исключает этот пример. Говорить «это плохая практика» - это самая неубедительная, расплывчатая и бессмысленная причина, которую я могу придумать. Можно ли это развить? (т.е. определить 'плохой практикой')
Мания
Вы все еще в основном говорите «это плохо», не давая объяснения, почему это следует считать плохим. Это ломает инструмент? Создать путаницу? Сложнее читать или печатать? Для приведенных примеров я думаю, что мы можем ответить да на многие из них. Но я не могу понять абсолютный запрет на заглавные буквы. Имя пакета LikeThis (как и имя класса), очевидно, сбивает с толку, но likeThis меня не смущает и кажется более читаемым для имени пакета из двух слов, такого как bigdataSource (vs "bigdatasource"). Если нет какой-либо причины, camelCase - плохая идея для пакетов, о которых я не знаю, это кажется хорошим.
Маний
Оказывается, я пропустил это: oracle.com/technetwork/java/codeconventions-135099.html Все строчные буквы являются частью соглашения об именах пакетов Oracle. Я все еще думаю, что это довольно дурацкое соглашение, чтобы исключить случай верблюда, который начинается ниже, для тех (редких) случаев, когда вам нужно использовать имя пакета из двух слов, и нет смысла делать его двумя каталогами. Ну да ладно.
Маний
18

Официальные соглашения об именах не так уж строги, они даже не запрещают нотацию верблюда, за исключением префикса ( comв вашем примере).

Но я бы лично избегал прописных букв и переносов , даже цифр. Я бы выбрал, com.stackoverflow.mypackageкак предложил Брэгбой.

(переносы '-' недопустимы в именах пакетов)

РЕДАКТИРОВАТЬ

Интересно - спецификация языка тоже может сказать о соглашениях по именованию.

В главе 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.

jpangamarca
источник
4
это не может быть читаемым и трудным для понимания содержимого пакета, просто взглянув на название пакета
Вишал Аккалкот
1
Справедливо. Вот почему я предлагаю использовать документацию. Я бы использовал этот подход в любое время, вместо того, чтобы объединять полные слова (apiratesheet - это «API Rate Sheet» или «A Pirate Sheet»?)
jpangamarca
1

Объединение слов в имени пакета - это то, что большинство разработчиков не делают.

Вы можете использовать что-то вроде.

com.stackoverflow.mypackage

См. Объявление имени JLS

CraUmm
источник