Правила іменування для методів Java, які повертають логічне значення (без знака питання)


94

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

Наприклад, наприклад, createFreshSnapshot?


2
Яка мова дозволяє a ?в назві методу?
Слакс

11
@SLaks, Scheme, Ruby ...
Skilldrick

в схемі ми завжди ставимо pкінець імені методу
Ерік Робертсон,

@Erick: не завжди, але "p" - це один із стандартних способів позначення предикатів
Jason S,

ми = мій клас схеми бакалаврату завжди. Я б ніколи не використовував цю конвенцію на Java.
Ерік Робертсон,

Відповіді:


123

Конвенція полягає в тому, щоб задати питання від імені.

Ось кілька прикладів, які можна знайти в JDK:

isEmpty()

hasChildren()

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

Колекція порожня?
Чи є у цього Вузла діти?

І, тоді, trueозначає так, і falseозначає ні.

Або ви можете прочитати це як твердження:

Колекція порожня.
Вузол має дітей

Примітка:
Іноді вам може знадобитися назвати метод приблизно таким createFreshSnapshot?. Без знака питання назва означає, що метод повинен створювати знімок, а не перевіряти, чи потрібен такий.

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

Якщо ви робите пошук Google для isEmpty()в API Java, ви отримаєте багато результатів.


як щодо createFreshSnapshot?
letronje

4
@letr, ну, я б, мабуть, перейменовував його на засвічений isSnapshotExpiredабо щось подібне. (за вашими критеріями)
jjnguy

8
Я обіходжу проблему 'createFrshSnapshot', використовуючи слово 'should' - тобто "shouldCreateFreshSnapshot ()" (хоча в цьому випадку isSnapshotExpired () краще)
DJClayworth,

1
Я перевіряю, чи слід надсилати повідомлення про серцебиття за допомогою shouldHeartbeat()методу.
Ерік Робертсон,

Навіщо думати, що це isEmpty()і hasChildren()є питаннями , а не твердженнями ? Насправді це читається трохи краще англійською мовою, якщо ви вважаєте ці імена твердженнями чи предикатами.
Рік

29

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

8.3.2 Логічні властивості

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

public boolean is< PropertyName > ();

Цей метод "є < ім'я_назви >" може бути наданий замість методу "отримати < ім'я_назви >" або може бути наданий на додаток до методу "отримати < ім'я_назви >". У будь-якому випадку, якщо для логічного властивості присутній метод “є < Ім'я_назви >”, тоді ми будемо використовувати метод “є < Ім'я_назви >” для зчитування значення властивості. Прикладом логічного властивості може бути:

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

Це бентежить, коли ви говорите, що public boolean is<PropertyName>(); це схоже на загальне.
Ерік Робертсон,

Гей, я просто цитую специфікацію. Я виділю курсив відповідно до специфікації.
Jason S,

4
Мені байдуже щодо сумісності бобів Java, я просто хочу, щоб імена моїх методів звучали правильно :)
letronje

4
Навіть якщо ви не дбаєте про сумісність Javabeans, дотримання принципів іменування варто дотримуватися, оскільки воно вийшло далеко за межі початкового обсягу "бобів", які налаштовуються в IDE. Наприклад, якщо ви використовуєте isEmpty як ім'я методу, ви можете викликати цей метод з JSP, використовуючи object.empty, однак ви не можете викликати методи з іншими префіксами, тому ви не можете використовувати object.children для виклику object.hasChildren (). Тож JSP та EL (мова виразів) дозволяють отримати доступ до властивостей Javabeans. Великий виграш, якщо ви запитаєте мене.
Stijn de Witt

JavaBeans дуже конкретний, дякую за нагадування. Я часто дивуюсь і схильний думати, що застряг у префіксі `` є '', але зовсім не справді.
Сніколас

26

Я хочу опублікувати це посилання, оскільки це може додатково допомогти тим, хто перевіряє цю відповідь і шукає більше стилів Java

Вказівки щодо стилю програмування на Java

Пункт "2.13 - префікс, слід використовувати для булевих змінних та методів." є особливо актуальним і пропонує префікс is .

Далі керівництво стилем пропонує:

Є кілька альтернатив префіксу is, який краще підходить у деяких ситуаціях. Це префікси has , can і should :

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

Якщо ви дотримуєтесь Рекомендацій, я вважаю, що буде названий відповідний метод:

shouldCreateFreshSnapshot()

2
FYI, там керівні принципи охороняють авторські права на геотехнічні служби програмного забезпечення. Тим не менш, вони посилаються на джерело внизу, щоб припустити, що вони є законними.
Донал Лафферті,

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
Я не впевнений, чому за вас голосують, я згоден. Незважаючи на те, що я уникаю його використання, оскільки це зовсім не семантично, це домовленість, що використовується багатьма внутрішніми Java-API.
Каміль Бебен

1
Гадаю, тому що спочатку я писав лише "Set: boolean add (E e)", тож люди не помітили, що йдеться про добре відомий java.util.Set; а може тому, що моя англійська така погана: D. Дякую за голос :)
adrhc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.