Логические геттеры Java vs.

Я знаю, что соглашение в Java для логических геттеров включает префикс «есть».

isEnabled
isStoreOpen

А если подлежащее во множественном числе? То есть, что, если вместо того, чтобы знать, открыт ли магазин, я хотел знать, открыты ли все магазины?

isStoresOpen() не имеет смысла в английском языке.

У меня возникает соблазн написать геттеры, например:

areStoresOpen
areDogsCute
areCatsFuzzy

И я думаю, что это имело бы смысл, но другие говорили мне, что я должен просто смириться с этим и отказаться от согласования подлежащих глаголов и использовать isStoresOpen, isDogsCute, isCatsFuzzy.

В любом случае, что мне делать с булевыми геттерами, которые работают с субъектами во множественном числе?


person kodai    schedule 18.10.2012    source источник
comment
Я никогда раньше не видел are*() геттера.   -  person rekire    schedule 18.10.2012
comment
Хороший вопрос, но я не думаю, что он здесь.   -  person Naftali aka Neal    schedule 18.10.2012
comment
Я всегда пишу are*() геттеры, если они грамматически правильны.   -  person Roddy of the Frozen Peas    schedule 18.10.2012
comment
Если ваш объект - bean-компонент, я думаю, вы должны придерживаться либо is, либо has...   -  person assylias    schedule 18.10.2012
comment
если вы используете геттер are*(), то я думаю, что в большинстве случаев он должен возвращать логическое [] .   -  person Juvanis    schedule 18.10.2012
comment
Очень хороший вопрос. Задумался об этом сам, совсем немного. Как уже указывалось во многих ответах, большинство фреймворков, IDE и всего, что зависит от соглашения, с которым я столкнулся, используют шаблон get/set/is. Даже если это не проблема в вашем приложении, я бы все равно следовал этому соглашению - ваш код будет намного легче следовать (даже вам), если вы будете поддерживать последовательное соглашение об именах (даже если это иногда звучит грамматически странно) ).   -  person Paul Richter    schedule 18.10.2012
comment
Это правда, и я думаю, что в конце концов ваше право. Просто кажется неправильным, что я пишу свой код для IDE. Их цель — облегчить мне жизнь, но в итоге мне приходится изменять свой код, чтобы он соответствовал их ожиданиям.   -  person kodai    schedule 18.10.2012
comment
Честно говоря, даже isStoreOpen, возвращающий true/false, звучит неправильно. Если вы говорите isStoreOpen, то это вопрос, и вы хотите сказать «да» или «нет», в то время как вы сказали бы «истина» или «ложь» для утверждения, которое должно больше походить на storeIsOpen... не то чтобы я выступал за его использование, это определенно неудобно   -  person DHall    schedule 18.10.2012
comment
Для меня здравый смысл побеждает с условностями. Просто будьте последовательны.   -  person Mariusz Jamro    schedule 31.03.2013
comment
'ХасОткрытые Магазины()'? Только логично, если вы составляете свои объекты. Мне никогда не требовалось, чтобы 'areX()' был грамматически правильным.   -  person atamanroman    schedule 31.03.2013
comment
Часто не так уж сложно перефразировать вещи так, чтобы множественное число all стало единственным числом any с отрицательным результатом (например, законы Де Моргана). areAllStoresClosed() --› isAnyStoreOpen() или areAllStoresOpen() --› isAnyStoreClosed()   -  person jacobq    schedule 22.01.2014


Ответы (12)


Я не помню, из какой это книги, но суть в том, что код будет прочитан гораздо больше раз, чем написан. Пишите для удобства чтения.

person John    schedule 18.10.2012
comment
Чистый код - Роберт Мартин - person John B; 18.10.2012
comment
Джон Б.: Я не читал эту книгу; может быть, я читал ссылку на него. Еще одна книга в моем списке. :) - person John; 18.10.2012
comment
Но будьте очень осторожны, вы не заходите слишком далеко. storesAreOpen(), вероятно, было бы наиболее грамматически правильным (из-за if(storesAreOpen())), но логическая часть имени теперь скрыта в середине имени метода, что нарушает соглашения Java и читаемый код. - person Izkata; 19.10.2012
comment
@nalply Это означает, что вы можете понять назначение кода после шестимесячного отсутствия. Это значит не мешать кому-то другому понять код. (Примечание: здесь я не обязательно придерживался позиции is или are.) - person John; 19.10.2012
comment
Он отвечает на вопрос очень обобщенно. Это правда, что он не касается специфики, но это ответ. Это может показаться банальным, но в этом есть ценность (так считают по крайней мере 24 человека). - person George Stocker; 16.05.2013
comment
чтобы уточнить ответ, я бы добавил замечание, что здесь хорошим выбором является areStoresOpen(). - person kiedysktos; 14.04.2016

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

isEveryStoreOpen() or isEachCatCute()

Когда я сомневаюсь в правильном слове, я всегда люблю обращаться к тезаурусу.

person satur9nine    schedule 14.03.2014
comment
+1, это ясно показывает, означает ли возвращаемое значение isEveryStoreOpen() или isAnyStoreOpen(), в отличие от неоднозначного isStoresOpen(). - person Imre; 24.06.2015
comment
+1 Это должен быть принятый ответ! Имеет смысл с грамматической точки зрения, сохраняя при этом соглашение о префиксе Java booleans is. Кроме того, он предоставляет немного дополнительной информации, которая будет действительно полезной для тех, для кого английский язык не является родным, и которые занимаются сопровождением кодовой базы. - person higuaro; 07.10.2018
comment
Этот ответ изменил мою жизнь! И это должен быть принятый ответ. - person Marcel Blanck; 10.01.2019
comment
Да, но как сформулировать имя переменной, которое передает следующее: НЕКОТОРЫЕ [не все] магазины открыты? - person Michael P.; 29.11.2020
comment
Как насчет isAnyCatCute() или isAtLeastOneCatCute()? - person satur9nine; 29.11.2020
comment
Спасибо. Как вы сформулировали сентимент на эффект isAtleastTwoCats, только с правильной грамматикой? - person Michael P.; 18.12.2020
comment
@МайклП. Если это то, что вам требуется в вашей кодовой базе, то я бы сказал, что вам нужно пересмотреть дизайн своих классов. Вполне можно ожидать, что ваши методы сообщат, что нет открытых магазинов, открыты все магазины, открыт ли какой-либо магазин, но если ваше требование достаточно странное, оно требует пересмотра дизайна. Вы можете написать метод getCountOfOpenStores() и напрямую использовать число в логике. Как класс, предоставляющий методы другим, это был бы мой выбор, а не метод, который проверяет, открыты ли 2 магазина. PS: Это все только с точки зрения практической реализации. - person cyphx; 07.06.2021

Соглашение состоит в том, чтобы префикс метода-получателя «есть», а не сам вариале.

e.g.

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

и

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen() не имеет смысла на английском языке.

Это может не иметь смысла грамматически, но следует соглашению и выглядит достаточно читабельно.

person Bhesh Gurung    schedule 18.10.2012
comment
Ваш ответ имеет смысл, и я ценю его. Я думаю, что с авторитетной точки зрения правильно/неправильно вы правы. Я просто не хочу, чтобы соглашение, которое должно было помочь нам быть очевидным, ясным и легким для понимания, отказалось от этой цели ради соблюдения его правил. Но вы правы - так оно и есть, и я об этом и спрашивал. - person kodai; 18.10.2012
comment
@kodai: я думаю, что это не правило, а просто соглашение. Но я считаю, что писать код, не соответствующий соглашению, если это не требуется, чтобы сделать код читабельным, — это путь. - person Bhesh Gurung; 19.10.2012

Спецификация Java Bean говорит использовать get для геттеров, если это не boolean, тогда используйте is. are является нестандартным и не будет распознаваться чем-либо, что ожидает стандартного именования компонентов.

person Steve Kuo    schedule 18.10.2012

Многие инструменты ожидают is или get и вряд ли распознают are.

Попробуйте перефразировать их, например, getDogsAreFuzzy() или getStoresAreOpen() или что-то в этом роде для лучшей совместимости и соглашений.

person Kevin Rubin    schedule 18.10.2012
comment
Да. Такие инструменты, как bean-утилиты, рассчитывают на слово is для поиска булевых геттеров. - person nalply; 19.10.2012

Что вы кодируете, английский или Java?

Когда я читаю код Java, я ожидаю, что он будет структурным. Логические методы, начинающиеся с is, являются хорошей структурой.

return 0; 
person Ilya Gazman    schedule 25.10.2012

- isEnabled() также может быть записано как getEnabled() в Java naming conventions.

- Это просто хорошая привычка следовать соглашениям об именах, помогите, когда вы работаете с Java Beans.

person Kumar Vivek Mitra    schedule 18.10.2012

В общем, я считаю, что код должен быть как можно более легко читаемым, чтобы метод можно было прочитать почти как абзац (как поддержал Clean Code). Поэтому я бы назвал метод максимально легким для звучания/чтения и придерживался правила грамматики are. В современных IDE легко найти методы, не ища специально get/is.

Тем не менее, Кумар делает хорошее замечание о бобах. Многие инструменты будут искать только get/is. В этом случае я мог бы рассмотреть возможность использования обоих методов. Один для удобства чтения и один для использования инструмента.

person John B    schedule 18.10.2012

В своем вопросе вы явно спрашиваете о геттерах. Геттер возвращает некоторую информацию об одном экземпляре вашего класса. Например, у вас есть класс Store. Итак, isStoreOpen — прекрасное имя метода для геттера.

Затем вы упоминаете метод, который проверяет, открыты ли все магазины. Этот метод вообще не геттер, потому что он возвращает информацию не об одном экземпляре, а обо всех. Конечно, если нет класса Stores. Если это так, вам следует переосмыслить свой дизайн, потому что в Java уже есть способы хранить несколько экземпляров, например. массивы или коллекции, поэтому вам не нужно писать дополнительные классы.

Если это не так, то это имя метода прекрасно подходит. Альтернативой может быть просто allStoresOpen без "есть".

TL;DR: если вы имеете дело с несколькими экземплярами, это не геттер. Если это так, ваш дизайн плохой.

person Kirill Rakhman    schedule 18.10.2012

Честно говоря, я бы сказал, что определенно забудьте о are* и придерживайтесь is*. Думайте о "is" как о значении переменной и, если возможно, придумайте лучшее имя.

Я бы сказал, что isStoresOpen звучит не так уж плохо, но вы можете сделать isStoresAreOpen, если это звучит лучше для вас.

Но моя общая идея заключалась бы в том, чтобы придерживаться условностей. Который использует «get» для геттеров и «is» для логических типов. Лично я думаю, что использование «есть» иногда уже проблематично. Да, это выглядит хорошо в условиях «если», но иногда я просто пишу «получить» при кодировании и проверяю выпадающий список на наличие нужной мне переменной и начинаю задаваться вопросом, что не так и почему я не могу ее найти, тогда я это понимаю начинается с "есть"...

person Arturas M    schedule 11.04.2016

В объектно-ориентированном программировании это должно происходить редко, если вообще когда-либо, поскольку Store или Cat или что у вас должно быть отдельным классом со своим собственным методом isOpen() или isFuzzy(). Если у вас есть более высокий тип, рассмотрите возможность разделения на более атомарный уровень, который вы фактически используете. Как правило, объекты не должны быть множественными на самом низком уровне.

person asteri    schedule 18.10.2012

isStoresOpen() в этом StoresOpen выглядит как множественное число,

Когда вы следуете соглашению об именах Java и стандартам Java Beans, они имеют предопределенные префиксы для логических и других типов, поэтому вы должны следовать соглашению об именах Java Beans.

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

Здесь

storesOpen во множественном числе в соответствии с английской грамматикой,

Результат isStoresOpen не во множественном числе, а в единственном числе, или можно сказать, что он скалярный с точки зрения соглашения о программировании.

Это логическое значение, просто истинное или ложное

Не так, как ваше английское множественное число true's или false's.

Не массив true или false или набор true или false.

Итак, здесь мы можем сказать, что здесь нас интересует значение, которое возвращается из этого логического метода компонента, а не имя, данное свойству класса, чтобы указать объект реального мира.

Еще одна важная вещь: всякий раз, когда такие логические свойства используются в классах и используются предопределенными библиотеками в любой среде, тогда среда с префиксом использования 'is' для получения логических значений,

почему это означает, что это не так уж и умнее вас, поскольку вы знаете английскую грамматику, такую ​​​​как множественное / единственное число, мультиплексор и т. Д.

person Anil Kumar    schedule 09.06.2017