Соглашение об именах Java с аббревиатурами [закрыто]

218

Какое правильное имя для следующего Java-класса: DVDPlayerили DvdPlayer?

DD.
источник
93
Я ненавижу аббревиатуры. DigitalVersatileDiscPlayerэто путь вперед.
Том Хотин -
7
+1 Тому за шутку. Я считаю этот вопрос полезным, если «правильно» интерпретируется как «стандартный» или «наиболее типичный». Принятый ответ отличный!
Джон Кумбс
6
Для меня имеет смысл думать о таких акронимах как об одном слове, и поэтому я следую условности и употреблению DvdPlayer.
Даниил
7
В руководстве по стилю сказано следующее: «Отформатируйте аббревиатуру как слово, если оно является частью более длинного имени класса». Таков DvdPlayerпуть. (И для Тома: «Используйте целые слова и избегайте использования аббревиатур, если только аббревиатура не используется более широко, чем длинная форма». И я думаю, что «DVD» более широко используется, чем «Цифровой универсальный диск» :-)
aioobe
Вы, конечно, имели в виду "Дискус", не так ли? :)
Вилле

Ответы:

237

Похоже, ответ заключается в том, что в Java нет единого стандарта для этого, и я хотел бы отметить, что в Руководстве по проектированию .NET Framework это указывается.

Теперь, прежде чем обвинить меня в том, что я не по теме, помните, что рекомендации по именованию классов для Java и .NET Framework очень похожи, что делает рекомендации .NET полезными в качестве убедительного справочника.

Основные правила

Оба руководства рекомендуют использовать только аббревиатуры, когда аббревиатура широко известна и понятна. DVD или XML являются прекрасными примерами этого, поскольку, хотя вы сразу их узнаете, распознанная расширенная версия займет немного больше времени.

Сокращения

Руководства .NET Framework рекомендуют не использовать аббревиатуры (в отличие от аббревиатур), за исключением того, что в идентификаторах могут использоваться две общие аббревиатуры: «ID» и «OK». При использовании аббревиатуры, смешанный регистрId всегда используется , за исключением первого слова идентификатора camelCase (в отличие от идентификатора PascalCase).

В Java это соглашение соблюдается только иногда. Посмотрите, как смешано написание getIDи getIdкак в JCL. (Прокрутите часть страницы вниз). В версии Java 8, тем не менее, getIdиспользуется все больше и больше, что намекает на то, что соглашение PascalCase является предпочтительным в настоящее время. Лучше всего избегать сокращений полностью, когда это возможно.

Краткие сокращения

В руководящих принципах .NET Framework говорится, что двухбуквенные аббревиатуры, такие как «IO», должны иметь одинаковый регистр для обеих букв. Таким образом, для идентификаторов PascalCase (например, имени класса) вы получите DBRate, а для идентификатора camelCase (например, локальной переменной) вы можете иметьioChannel .

Это определенно кажется преобладающим соглашением и в Java.

Длинные Сокращения

В руководящих принципах .NET Framework для идентификаторов PascalCase и camelCase рекомендуются сокращенные обозначения, состоящие из трех букв или более, за исключением первого слова идентификатора camelCase. Таким образом, для имени класса вы можете иметь XmlDocument, в то время как локальная переменная может быть названаhttpRequest .

Это соглашение не всегда соблюдается в Java. Четырехбуквенные аббревиатуры обычно используют смешанный регистр, но даже JCL не согласуется с трехбуквенными аббревиатурами. Большинство из них, кажется, все в верхнем регистре, такие как «URL», «XML», «SQL» и «DOM», но есть некоторые исключения, такие как «Jar».

Вывод

Для Java:

Для 4+ буквенных сокращений используйте смешанный регистр. Стандартная библиотека делает это, и это имеет смысл.

Для трехбуквенных аббревиатур вы можете использовать все прописные буквы, такие как JCL, или вы можете использовать смешанный регистр, как .NET Framework. В любом случае, будьте последовательны.

Для двухбуквенных сокращений используйте все заглавные буквы.

Для двухбуквенных сокращений в Java на самом деле нет стандарта, но я предлагаю использовать смешанный регистр, если только согласованность с другими именами не сделает все заглавные буквы лучше.

Кевин Кэткарт
источник
11
хорошо поставленный, хорошее усилие!
Элиран Малка
1
Мне это нравится, за исключением того, что не обязательно использовать CAPS для 3- и 2-буквенных сокращений. (Может быть, я в значительной степени пурист, но по практическим соображениям вижу принятый ответ. Плюс, есть еще один фактор путаницы.)
Джон Кумбс
1
@JCoombs: Ну, несоответствие двух букв относится к чему-то, IpAddressчто выглядит ужасно для многих людей. Лично, когда мне нужно написать код Java, я использую смешанный регистр для трехбуквенных акронимов, оставляя только две буквы в качестве особого случая.
Кевин Кэткарт
5
Что если имя вашего класса имеет несколько смежных двухбуквенных сокращений? Независимо от того, что вы делаете, это будет выглядеть «неправильно» - USGFCharset, UsGfCharset, US_GFCharset ...
Кевин
3
Действительно хороший ответ. Но лично мне не нравится идея директив .NET о присвоении имен по-разному в зависимости от длины сокращений и от того, является ли это сокращением. Кто на самом деле заботится и проверяет длину аббревиатуры? Или если это аббревиатура? Я предпочитаю общее правило для именования. Проблема возникает при использовании сторонних библиотек с соглашениями, отличными от того, которое вы выбрали.
Амани Килуманга
98

Нет «правильного» ответа. Просто набор практик и соглашений, которые лучше подходят для других ваших инструментов.

Поэтому я предпочитаю DvdPlayer. Это более полезно , как в Eclipse , вы можете сделать Ctrl+ Shift+ Tи выбрать классы по первой букве каждого слова.

альтернативный текст

ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник
19
оооо, это полезный совет затмения. Спасибо!
Петер Перхач
1
(+1) хороший совет. это отвечает на вопрос для меня :-)
Асаф
2
Просто "SIO" достаточно, чтобы найти этот класс.
finnw
7
Это также работает в другом месте в Eclipse - например, автозаполнение. Есть метод / переменная с именем 'myDvdCoverImage'? - просто наберите mDCI Ctrl + Space
teabot
3
также есть несколько уже установленных ярлыков, таких как sysout Ctrl + Space, которые дают вам System.out.println.
То
50

Я видел, как они оба использовались в дикой природе, и Sun, кажется, идет за DVDPlayerстилем. Я предпочитаю DvdPlayer, однако, потому что таким образом ясно, где границы слова, даже если есть несколько последовательных сокращений, как в HTTPURLConnection.

JaakkoK
источник
3
Это также быстрее печатать таким образом.
Атес Горал
6
Я думаю, что «DVDPlayer» делает границы слова более четкими. «DVD» - это не слово, а «DVD» - это сокращение от слов «цифровой универсальный диск». Таким образом, фактические границы слов в «DVD Player» находятся в «D», «V», «D» и «P».
Грег Браун
19
@GregBrown: DVD - это диск с отверстием, никто кроме вас не знает его полного имени и не заботится об этом. И гораздо удобнее использовать DvdPlayer.
Игорь Родригес
4
@GregBrown: На самом деле это более практично, по крайней мере, в Eclipse, где распознавание верблюжьих букв представляет собой боль с аббревиатурами: то есть с DvdPlayer вы можете набрать «DP» и нажать Ctrl + 1, чтобы получить возможность выбрать DvdPlayer, но если у вас был DVDPlayer, вы должны были бы напечатать «DVDP». И еще более раздражает, если это дольше. Я не хотел бы иметь UNESCOConnector в моем коде. В любом случае, это вопрос выбора.
Игорь Родригес
22
Еще один хороший пример - HTTPSID - имел ли я в виду HTTP SID или HTTPS ID ... Поэтому, чтобы лучше объяснить смысл, следует написать HttpSid или HttpsId соответственно.
Оз Эдри
37

Мне нравится определять отдельные экземпляры классов следующим образом:

Catalogue catalogue;
Person person;

Поэтому, если бы я использовал DVDPlayer, что бы я назвал экземпляром этого? dVDPlayer? Следовательно, я бы выбрал DvdPlayerимя класса, чтобы вы могли называть экземпляры как dvdPlayer.

Петер Перхач
источник
16
Что не так с DVDPlayer dvdPlayer;?
Аз
9
@DerFlatulator Что не так с этим? Независимо от того, как вы пришли dvdPlayer, когда вы вернетесь, вы получите DvdPlayer.
Maaartinus
5
@DerFlatulator: это вопрос автоматизации при преобразовании из UpperCamelCase в lowerCamelCase: у меня была проблема при автоматизации преобразования Hibernate в snake_case: DvdPlayer -> dvd_playerbut DVDPlayer -> d_v_d_player. Невозможно автоматизировать DVDPlayer для dvd_player.
pdem
3
@DerFlatulator: хорошо, спасибо за ответ, в этом случае это сработало. Но я все еще убежден в нотации «DvdPlayer»: как насчет DVDRPGPlayer ?, он должен быть преобразован в dvdRpgPlayer, а не в dvdrpgPlayer.
августа
2
Также рассмотрите ваши методы получения и установки: getDvdPlayer()работает лучше, чем getDVDPlayer(), например, при использовании с JSP EL (например, foo.dvdPlayer). И если вы называете свои геттеры строчными буквами в сокращениях, лучше сохранить одинаковые имена классов для согласованности и предсказуемости.
daiscog
33

Некоторые примеры из классов JavaSE, Apache Commons и Spring:

  • HttpURLConnection
  • HTTPAddress
  • UrlPathHelper
  • AopProxy
  • ISBNValidator

Так что - это не имеет значения.

Bozho
источник
3
Согласовано. Просто будьте последовательны в своей кодовой базе.
JARC
2
Я бы не сказал, что это не имеет значения, хотя в этом нет ничего особенного. Некоторые пользователи считают общепризнанные стандарты очень полезными, даже если не все придерживаются их соблюдения.
Джон Кумбс
я должен предпочесть SRSболее SoftwareRequirementSpecification?
Шантарам Тупе
10

Как указали другие, это стиль, который отличается в разных проектах. Такие проекты Google, как Guava и GWT, предпочитают DvdPlayerстиль.

https://google.github.io/styleguide/javaguide.html#s5.3-camel-case

Стивен Бенитес
источник
Более общая ссылка на соглашение Google по DvdPlayerстилю: google-styleguide.googlecode.com/svn/trunk/…
Стэн Курджиль
1
Ссылка в ответе переместилась на gwtproject.org/makinggwtbetter.html#codestyle Ссылка, о которой упоминает @StanKurdziel, переместилась на google.github.io/styleguide/javaguide.html#s5.3-camel-case
Jeroen Wiert Pluimers
8

Из Sun Java документы :

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

codaddict
источник
14
Это действительно ничего не говорит о том, должен ли он быть верхним или верблюжьим.
ДД.
@DD. Я думаю, что «гораздо более широко используемые» указывают на использование всех заглавных букв для соответствующих сокращений (HTTP, GET и т. Д.), Чем для некоторых случайных специфических для бизнеса слов, таких как DVD, MRI, MAGA и т. Д.
goelakash
3

DVDPlayer это стандарт, но DvdPlayer не редкость.

Вы чаще, чем не видите getId. Это, вероятно, из-за мышления ID является сокращение «Идентичность». Это на самом деле инициалы документа, удостоверяющего личность.

HttpURLConnectionчасто приводится в качестве примера смешанного соглашения. Однако «http», используемый в качестве имени протокола в URL-адресе, должен быть в нижнем регистре (хотя часто допускается использование верхнего регистра).

Том Хотин - Tackline
источник
2
Я не думаю, что это действительно стандарт, но он, вероятно, самый распространенный.
2010 г.
Это в стандарте кодирования Sun Java, IIRC. Хотя не в JLS.
Том Хотин -
7
HyperTextTransferProtocolUniformResourceLocatorConnection
flybywire
2
Я почти уверен, что большинство людей используют ID в качестве сокращения идентификатора ... т.е. в базе данных идентификатор таблицы ссылается на идентификатор таблицы в документе идентификации.
ДД.
9
DVDPlayer определенно не стандарт; даже JDK крайне противоречивы в своем подходе к этому.
Кевин Бурриллион
0

Здесь нет «правильных», только предпочтения.

Sun последовательна в том, как они называют классы, содержащие «URL» и «HTML», но я вижу HTTP, использующий как все заглавные буквы, так и случай верблюда в javadocs.

Лично я бы предпочел DvdPlayer.

duffymo
источник
Я считаю, что имя протокола HTTP в URL должно быть написано в нижнем регистре (хотя оно может быть принято в верхнем регистре браузерами).
Том Хотин -