Логічні одержувачі Java "є" проти "є"


90

Я знаю, що конвенція в Java для логічних добувачів включає префікс "є".

isEnabled
isStoreOpen

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

isStoresOpen() не має сенсу в англійській мові.

У мене є спокуса написати геттери на зразок:

areStoresOpen
areDogsCute
areCatsFuzzy

І я думаю , що буде мати сенс, але мені сказали , інші , що я повинен просто смоктати його і відмовитися від предмета дієслова угоди і використання isStoresOpen, isDogsCute, isCatsFuzzy.

У будь-якому випадку, що я повинен робити для булевих геттерів, які оперують множинною темою?


3
Я ніколи не бачу раніше are*()геттера.
rekire

21
Я завжди пишу are*()геттери, якщо вони граматично правильні.
Родді з замороженого гороху

2
Якщо вашим об’єктом є квасоля, я думаю, вам доведеться дотримуватися будь-якого isабо has...
assylias

4
якщо ви використовуєте get (*), отримувач, то він повинен повернути логічний [] в більшості випадків, я думаю.
Juvanis

2
Дуже гарне запитання. Я дивувався цьому сам, зовсім небагато. Як вже було зазначено у багатьох відповідях, більшість фреймворків, середовищ розробки і все, що покладається на конвенцію, з якою я стикався, використовують шаблон "get" / "set" / "is". Навіть якщо це не стосується вашої програми, я б дотримувався цієї домовленості незалежно - ваш код буде набагато простішим (навіть вами), якщо ви підтримуєте узгоджену домовленість про іменування (навіть якщо часом це не звучить граматично дивно ).
Пол Ріхтер,

Відповіді:


57

Я не пам’ятаю, з якої книги це було, але суть полягає в тому, що код буде прочитано набагато більше разів, ніж написано. Пишіть для читабельності.


20
Чистий кодекс - Роберт Мартін
Джон Б

8
Але будьте дуже обережні, щоб не зайти занадто далеко. storesAreOpen()швидше за все, буде найбільш граматичним (через if(storesAreOpen())), але логічна частина імені тепер прихована в середині імені методу, що порушує правила Java та читабельний код.
Izkata

108
Я не розумію, як це прийнята відповідь. Це навіть не дає остаточної відповіді на запитання.
Тамзін Блейк

3
Він відповідає на питання дуже загально. Це правда, що він не звертається до специфіки, але це відповідь. Це може здатися банальним, але в цьому є цінність (принаймні 24 люди вважають так).
Джордж Стокер,

4
з метою уточнення відповіді я б додав зауваження, що areStoresOpen () - хороший вибір тут.
kiedysktos

94

Як щодо того, щоб мати достатньо пристойну англійську мову та відповідати стандарту Java:

isEveryStoreOpen() або isEachCatCute()

Коли сумніваєтесь у правильному слові, мені завжди подобається піднімати тезаурус.


18
+1, це чітко передає, чи означає повернене значенняEveryStoreOpen () чи isAnyStoreOpen () на відміну від двозначного isStoresOpen ().
Імре,

4
+1 Це повинна бути прийнята відповідь! Має сенс граматично, зберігаючи при цьому в Java booleanсек isпрефікс конвенції. Плюс, він надає трохи додаткової інформації, яка буде дійсно корисною для тих, хто не є носіями англійської мови, які, мабуть, підтримують кодову базу.
higuaro

Ця відповідь змінила моє життя! І це повинна бути прийнята відповідь.
Марсель Бланк

34

Домовленість полягає в тому, щоб до методу getter ставити префікс "є", а не сама змінна.

напр

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

і

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () не має сенсу в англійській мові.

Граматично це може не мати сенсу, але воно відповідає умовам і виглядає досить читабельним.


Ваша відповідь має сенс, і я ціную її. Я думаю, що з авторитетної правильної / неправильної позиції ви маєте рацію. Я просто не хочу, щоб конвенція, яка мала на меті допомогти нам, будучи очевидною, зрозумілою та зрозумілою для відмови, відмовилася від цієї мети заради дотримання її правил. Але ти маєш рацію - це так, і саме про це я запитував.
kodai

@kodai: Я думаю, це не повинно розглядатися як правило, а лише умовно. Але я вірю, що написання коду, не дотримуючись конвенції, якщо це не потрібно, зробити код читабельним - це шлях.
Bhesh Gurung

18

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


17

Багато інструментів очікують isабо getне розпізнають are.

Спробуйте перефразувати їх, наприклад, getDogsAreFuzzy()або подібні getStoresAreOpen()речі для кращої сумісності та умов.


Так. Такі інструменти, як утиліти bean, розраховують на те , щоб знайти логічні геттери.
неперевершено

4

- isEnabled() також можна писати як getEnabled()в Java naming conventions.

- Це просто гарна звичка слідувати правилам іменування, допомагати під час роботи Java Beans.


3

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

Однак Кумар добре висловлюється щодо квасолі. Багато інструментів буде лише шукати get/ is. У цьому випадку я міг би розглянути можливість використання обох методів. Один для зручності читання та один для використання інструментів.


3

Якою мовою ви пишете: англійською чи Java ?

Коли я читаю код Java, я сподіваюся, що все буде там, тому що шукати обидва геттери, з префіксами є і є , буде складніше, ніж пошук лише одного префікса.

Однак, з іншого боку, коли я читаю газету вранці, я нічого не шукаю, тож ви можете писати більш традиційною англійською мовою.

повернути 0;


3

У вашому запитанні ви прямо задаєте питання про геттерів. Геттер повертає деяку інформацію про один екземпляр вашого класу. Наприклад, у вас є клас Store. Зараз isStoreOpenце цілком прекрасна назва методу для геттера.

Далі ви згадуєте метод, який перевіряє, чи всі магазини відкриті. Цей метод взагалі не є геттером, оскільки він не повертає інформацію про один екземпляр, а для всіх. Звичайно, якщо немає класу Stores. Якщо це так, вам слід переглянути свій дизайн, оскільки Java вже має способи зберігати ряд екземплярів, наприклад масиви або колекції, тому вам не потрібно писати додаткові класи.

Якщо це не так, то назва цього методу цілком чудова. Альтернатива може бути просто allStoresOpenбез "є".

TL; DR: Якщо ви маєте справу з кількома екземплярами, це не є здобутком. Якщо це так, ваш дизайн поганий.


2

Цілком чесно, я б сказав, точно забути про це are*і дотримуватися is*. Подумайте про значення "is"як про змінну і, якщо це можливо, створіть краще ім’я.

Я б сказав, що isStoresOpen звучить не так погано, але ви можете зробити isStoresAreOpen, якщо це звучить для вас краще.

Але моя загальна ідея полягала б у дотриманні умов. Який використовує "get" для геттерів та "є" для булевих типів. Особисто я думаю, що використання "є" іноді вже проблематично. Так - це добре виглядає в умовах "якщо", але іноді я просто кодую "отримати" під час кодування і перевіряю випадаючий список для потрібної мені змінної і починаю цікавитись, що не так і чому я не можу її знайти, тоді я це усвідомлюю починається з "є" ...


1

В об'єктно-орієнтованому програмуванні, це повинно рідко, якщо коли - небудь, так як відбуваються Storeабо Catабо те , що у вас повинен бути окремий клас, з його власним isOpen()або isFuzzy()методом. Якщо у вас вищий тип, подумайте про поділ на більш атомний рівень, який ви насправді використовуєте. Загалом, об’єкти не повинні бути множинними на найнижчому рівні.


1

isStoresOpen () у цьому StoresOpen здається множиною,

Дотримуючись цієї Конвенції про іменування Java та Стандарти Java Beans, вони мають попередньо визначені префікси для логічного та іншого типу, тому слід дотримуватися Конвенції про імена Java Beans.

Давайте підійдемо до вашої точки зору. Коли ви бачите storeOpen, як в англійській мові, так, це виглядає як множина. Ще раз глибоко спостерігайте за цим словом,

Ось

storeOpen у множині відповідно до англійської граматики,

Вихід з isStoresOpen не є множиною, замість цього він є одниною, або ви можете сказати, що він є скалярним з точки зору програмного забезпечення.

Виходить, це логічно, просто правда чи хибність

Не схоже на ваше англійське твердження множини true's або false's

Не є масивом true або false , або не колекціями true або false

Отже, тут ми можемо сказати, що тут ми стурбовані значенням, яке є поверненням із цього булевого методу bean, а не іменем, присвоєним властивості класу вказувати на сутність реального світу.

Ще одна важлива річ полягає в тому, що коли такі логічні властивості використовуються в класах і ті, що використовуються заздалегідь визначеними бібліотеками в будь-якому фреймворці, тоді фреймворк із префіксом використання ' є ' для отримання логічних значень,

чому означає, що це не набагато розумніше за вас, оскільки ви знаєте англійську граматику, як множину / однину, мультиплексор тощо ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.