Соглашения об именах для методов Java, возвращающих логическое значение (без знака вопроса)


96

Мне нравится использовать вопросительный знак в конце имен методов / функций на других языках. Java не позволяет мне этого делать. Как еще можно назвать логические методы возврата в Java в качестве обходного пути? Спользование is, has, should, canв передней части методы звука хорошо для некоторых случаев. Есть ли лучший способ назвать такие методы?

Например, createFreshSnapshot?


2
Какой язык допускает использование a ?в имени метода?
— SLaks 06

11
@SLaks, Scheme, Ruby ...
— Skilldrick 06

в схеме мы всегда ставим pв конце названия метода
— букву

@Erick: не всегда, но «p» - это один из стандартных способов обозначения предикатов
— Джейсон С.

мы = мой класс по программе бакалавриата всегда делал. Я бы никогда не использовал это соглашение в Java.
— Эрик Робертсон,

Ответы:


125

По соглашению вопрос задается от имени.

Вот несколько примеров, которые можно найти в JDK:

isEmpty()

hasChildren()

Таким образом, имена читаются так, как если бы в конце был вопросительный знак.

Коллекция пуста?
Есть ли у этого Узла дети?

А значит, trueзначит да и falseзначит нет.

Или вы могли бы прочитать это как утверждение:

Коллекция пуста.
У узла есть дети

Примечание.
Иногда вы можете захотеть назвать метод как-нибудь вроде createFreshSnapshot?. Без вопросительного знака название подразумевает, что метод должен создавать моментальный снимок, а не проверять, требуется ли он.

В этом случае вам следует переосмыслить то, о чем вы на самом деле спрашиваете. Что-то вроде isSnapshotExpired- это гораздо лучшее название, оно передает то, что вам скажет метод при его вызове. Подобный шаблон также может помочь сохранить больше ваших функций в чистоте и без побочных эффектов.

Если вы делаете поиск Google для isEmpty()в API Java, вы получите много результатов.


как насчет createFreshSnapshot?
— letronje 06

4
@letr, ну я бы наверное переименовал в lit isSnapshotExpiredили что-то в этом роде. (на основе ваших критериев)
— jjnguy 06

8
Я обхожу проблему «createFrshSnapshot», используя слово «следует», то есть «shouldCreateFreshSnapshot ()» (хотя в данном случае isSnapshotExpired () лучше)
— DJClayworth

1
Я проверяю, следует ли отправлять контрольные сообщения с помощью shouldHeartbeat()метода.
— Эрик Робертсон,

Зачем думать , что isEmpty()и hasChildren()есть вопросы , а не утверждение ? На самом деле, если вы думаете об этих именах как об утверждениях или предикатах, они читаются по-английски немного лучше.
— Рик

29

Если вы хотите, чтобы ваш класс был совместим со спецификацией Java Beans , чтобы инструменты, использующие отражение (например, JavaBuilders , JGoodies Binding ), могли распознавать логические геттеры, используя getXXXX()или isXXXX()как имя метода. Из спецификации Java Beans:

8.3.2 Логические свойства

Кроме того, для логических свойств мы разрешаем методу получения соответствовать шаблону:

public boolean is< Имя свойства > ();

Этот метод «is < PropertyName >» может быть предоставлен вместо метода «get < PropertyName >» или может быть предоставлен в дополнение к методу «get < PropertyName >». В любом случае, если для логического свойства присутствует метод «is < PropertyName >», мы будем использовать метод «is < PropertyName >» для чтения значения свойства. Примером логического свойства может быть:

public boolean isMarsupial();
public void setMarsupial(boolean m);

Это сбивает с толку, когда вы говорите, что public boolean is<PropertyName>(); это похоже на общий.
— Эрик Робертсон,

Эй, я просто цитирую спецификацию. Я выделю курсивом согласно спецификации.
— Джейсон С.

4
Меня не волнует совместимость с Java beans, я просто хочу, чтобы имена моих методов звучали правильно :)
— letronje 06

4
Даже если вас не волнует совместимость с Javabeans, стоит соблюдать соглашение об именах, потому что оно вышло далеко за рамки исходной области «beans», настраиваемой в среде IDE. Например, если вы используете isEmpty в качестве имени метода, вы можете вызвать этот метод из JSP с помощью object.empty, однако вы не можете вызывать методы с другими префиксами, поэтому вы не можете использовать object.children для вызова object.hasChildren (). Итак, JSP и EL (язык выражений) позволяют получить доступ к свойствам Javabeans. Большая победа, если вы спросите меня.
— Stijn de Witt,

JavaBeans очень специфичен, спасибо за напоминание. Я часто задаюсь вопросом и склонен думать, что застрял с префиксом «есть», но на самом деле это не так.
— Snicolas

26

Я хочу опубликовать эту ссылку, так как она может помочь в дальнейшем для тех, кто проверяет этот ответ и ищет больше соглашений о стиле Java

Рекомендации по стилю программирования на Java

Пункт «2.13 - это префикс, который следует использовать для логических переменных и методов». имеет особое значение и предполагает префикс is .

Руководство по стилю предлагает следующее:

Есть несколько альтернатив префиксу is , который лучше подходит в некоторых ситуациях. Это префиксы has , can и should :

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

Если вы будете следовать Руководству, я считаю, что соответствующий метод будет назван:

shouldCreateFreshSnapshot()

2
К вашему сведению, эти правила принадлежат Geotechnical Software Services авторским правом. Тем не менее, они ссылались на источник внизу, чтобы предположить, что они законны.
— Донал Лафферти,

11

Для методов, которые могут потерпеть неудачу, то есть вы указываете логическое значение в качестве типа возврата, я бы использовал префикс try:

if (tryCreateFreshSnapshot())
{
  // ...
}

Во всех остальных случаях используйте префиксы вроде is.. has.. was.. can.. allows....


15
Но попытка не означает, что это вопрос (имеет возвращаемое значение).
— Стив Куо,

Никогда не возвращайте логическое значение, чтобы указать, отказал метод или нет. Если метод не удался, вызовите исключение. Представьте, что метод не удался, и вы получите ложное сообщение, как вы определите, что именно пошло не так?
— Воутер ван Коппен

5

Стандартным является использование в качестве префикса «есть» или «имеет». Например isValid, hasChildren.


2

isэто тот, с которым я сталкивался чаще, чем любой другой. Однако все, что имеет смысл в текущей ситуации, - лучший вариант.


0

Я хочу по-другому взглянуть на это общее соглашение об именах, например:

см. java.util.Set :boolean add​(E e)

где обоснование:

сделайте некоторую обработку, затем сообщите , удалось ли это или нет .

Хотя returnэто действительно booleanимя метода должно указывать на завершение обработки, а не на тип результата (в данном примере логическое значение).

Ваш createFreshSnapshotпример кажется мне более связанным с этой точкой зрения, потому что, похоже, означает следующее: создайте свежий снимок, а затем сообщите, успешно ли завершилась операция создания. Учитывая эту аргументацию, название createFreshSnapshotкажется лучшим для вашей ситуации.


1
Я не уверен, почему вас голосуют против, я согласен. Несмотря на то, что я избегаю его использования, потому что он вообще не семантический, это соглашение, используемое многими внутренними API Java.
— Камил Бембен,

1
Полагаю, потому что изначально я написал только «Set: boolean add (E e)», поэтому люди не заметили, что это касается хорошо известного java.util.Set; а может потому, что я плохо говорю по-английски: D. Спасибо за голос :)
— adrhc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.