Соглашения об именах для методов Java, которые возвращают логическое значение (без знака вопроса)
Мне нравится использовать вопросительный знак в конце имен методов / функций на других языках. Ява не позволяет мне делать это. В качестве обходного пути, как еще я могу назвать логические методы возврата в Java? Используя is
, has
, should
, can
в передней части метода звучат нормально для некоторых случаев. Есть ли лучший способ назвать такие методы?
Например, createFreshSnapshot?
6 ответов
Соглашение состоит в том, чтобы задать вопрос от имени.
Вот несколько примеров, которые можно найти в JDK:
isEmpty()
hasChildren()
Таким образом, имена читаются так, как будто на их конце стоит знак вопроса.
Коллекция пуста?
Есть ли у этого узла дети?
А потом, true
значит да и false
значит нет.
Или вы можете прочитать это как утверждение:
Коллекция пуста.
У узла есть дети
Замечания:
Иногда вы можете захотеть назвать метод что-то вроде createFreshSnapshot?
, Без знака вопроса имя подразумевает, что метод должен создавать моментальный снимок, а не проверять, нужен ли он.
В этом случае вы должны переосмыслить то, что вы на самом деле спрашиваете. Что-то вроде isSnapshotExpired
это гораздо лучшее имя, и передает то, что метод скажет вам, когда он вызывается. Следование такой схеме может также помочь сохранить большую часть ваших функций в чистоте и без побочных эффектов.
Если вы делаете поиск Google для isEmpty()
в Java API вы получите много результатов.
Если вы хотите, чтобы ваш класс был совместим со спецификацией Java Beans, чтобы инструменты, использующие отражение (например, JavaBuilders, JGoodies Binding), могли распознавать булевы геттеры, либо используйте getXXXX()
или же isXXXX()
как имя метода. Из спецификации Java Beans:
8.3.2 Булевы свойства
Кроме того, для логических свойств мы разрешаем методу getter соответствовать шаблону:
public boolean is
< PropertyName>()
;Этот метод "is< PropertyName>" может быть предоставлен вместо метода "get< PropertyName>" или может быть предоставлен в дополнение к методу "get< PropertyName>". В любом случае, если метод "is< PropertyName>" присутствует для логического свойства, тогда мы будем использовать метод "is< PropertyName>" для чтения значения свойства. Пример логического свойства может быть:
public boolean isMarsupial(); public void setMarsupial(boolean m);
Я хочу опубликовать эту ссылку, так как она может помочь в дальнейшем для проверки этого ответа и поиска большего соглашения о стиле Java
Рекомендации по стилю программирования Java
Пункт 14 имеет особое значение и предлагает префикс.
Руководство по стилю предлагает:
Существует несколько альтернатив префиксу is, который лучше подходит в некоторых ситуациях. Эти префиксы имеют, могут и должны:
boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;
Если вы будете следовать Руководству, я считаю, что соответствующий метод будет назван:
shouldCreateFreshSnapshot()
Для методов, которые могут потерпеть неудачу, то есть вы указываете логическое значение в качестве возвращаемого типа, я бы использовал префикс try
:
if (tryCreateFreshSnapshot())
{
// ...
}
Для всех остальных случаев используйте префиксы, такие как is..
has..
was..
can..
allows..
..
Стандарт - это использование "is" или "has" в качестве префикса. Например isValid
, hasChildren
,
is
это тот, кого я встречал больше, чем любой другой. Что бы ни имело смысл в текущей ситуации, это лучший вариант.
Я хочу по-другому взглянуть на это общее соглашение об именах, например:
см. java.util.Set:boolean add(E e)
где обоснование:
выполните некоторую обработку, а затем сообщите , удалось это или нет.
В то время как return
действительно boolean
имя метода должно указывать на завершение обработки, а не на тип результата (в данном примере логическое значение).
Твой createFreshSnapshot
Пример кажется мне более связанным с этой точкой зрения, потому что, похоже, означает следующее: создайте свежий снимок, а затем сообщите, удалась ли операция создания. Учитывая это, имяcreateFreshSnapshot
кажется лучшим для вашей ситуации.