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

96

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

Например, createFreshSnapshot?

Letronje
источник
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, вы получите много результатов.

jjnguy
источник
как насчет 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....

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

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

BillThor
источник
2

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

Skilldrick
источник
0

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

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

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

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

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

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

adrhc
источник
1
Я не уверен, почему вас голосуют против, я согласен. Несмотря на то, что я избегаю его использования, потому что он вообще не семантический, это соглашение, используемое многими внутренними API Java.
Камил Бембен,
1
Полагаю, потому что изначально я написал только «Set: boolean add (E e)», поэтому люди не заметили, что это касается хорошо известного java.util.Set; а может потому, что я плохо говорю по-английски: D. Спасибо за голос :)
adrhc