Булев метод називання читабельності


120

Просте запитання з точки зору читабельності, яке ім'я методу ви віддаєте перевагу булевому методу:

public boolean isUserExist(...)

або:

public boolean doesUserExist(...)

або:

public boolean userExists(...)

21
перший звучить якisBabbyFormed

Залежить від мови. Різні мови мають різні умовності; Ява і мета C приходять на думку. Також прикордонний суб'єктивний характер.
Джед Сміт

Суб’єктивний - досить справедливий
Ювал Адам

2
Чисто суб'єктивний. getUserExistence, userIsNotExtinct, І userHasExistentialStateт.д. ...
dreamlax

Сартр був би гордий
Корнел Массон

Відповіді:


112
public boolean userExists(...)

Був би моїм кращим. Оскільки це робить ваші умовні чеки набагато більше схожими на природну англійську:

if userExists ...

Але я думаю, що жорсткого і швидкого правила немає - просто будьте послідовними


3
"робить ваш {метод call} набагато більше схожим на природну англійську мову" звучить як чудовий тест на раціональне називання по всій дошці. уточнив своє мислення з цього питання - дякую!
cori

16
З іншого боку, поодиноко або коли не відразу слідує за "якщо", то "userExists ()" звучить як констатація факту, а не питання, яким воно було призначене. На відміну від "IsUserExisting ()" або "DoesUserExist ()", який дотримується правил впорядкування англійських природних мов для прямолінійних питань.
Оскар Берггрен

4
..а чому б методи, що повертають буль, використовувались поза if? Якщо вони мають побічні ефекти, це ще більше запах. if IsUserExisting()і if DoesUserExist()виглядає жахливо, і цього слід уникати.
RJFalconer

@RJFalconer іноді може знадобитися використовувати результат цього методу в декількох місцях, тому ви призначите його змінної. Оскільки метод викликається userExists, яке ім'я змінної ви оголосите? userExistsдобре для змінних, а не методів. Як писав @Oskar - це звучить як твердження, а не питання.
Ярослав Власло

У ситуаціях, коли має бути суб'єкт, предикат та об’єкт, наприклад, UserSessionIsComplete або IsUserSessionComplete, який із них ви віддаєте перевагу?
Ян

40

Я б сказав userExists, оскільки 90% часу мій код виклику виглядатиме так:

if userExists(...) {
  ...
}

і він читається дуже буквально англійською.

if isUserExistі if doesUserExistздаються зайвими.


18

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

Хоча if (user.ExistsInDatabase(db))читається приємніше if (user.CheckExistsInDatabase(db)), розглянемо випадок класу з малюнком конструктора (або будь-якого класу, на який можна встановити стан):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

Не зрозуміло, чи ExistsInDatabaseперевіряється, чи існує він, чи встановлюється факт його існування. Ви б не писали if (user.Age())або if (user.Name())без будь-якого значення порівняння, то чому ж if (user.Exists())це гарна ідея виключно тому, що це властивість / функція булевого типу, і ви можете перейменовувати функцію / властивість, щоб читати більше як природний англійський? Чи так погано слідувати тій же схемі, яку ми використовуємо для інших типів, крім булевих?

З іншими типами ifоператор порівнює повернене значення функції зі значенням у коді, тому код виглядає приблизно так:

if (user.GetAge() >= 18) ...

Що означає: "якщо користувач отримує вік 18 або більше 18 ..." правда - це не "природна англійська мова", але я б заперечував, що object.verbніколи не нагадував природну англійську мову і це просто основна грань сучасного програмування (для багато основних мов). Програмісти, як правило, не мають проблеми з розумінням вищезгаданого твердження, так що наступне гірше?

if (user.CheckExists() == true)

Що зазвичай скорочується до

if (user.CheckExists())

Слідує фатальний крок

if (user.Exists())

Хоча було сказано, що "код читається в 10 разів частіше, ніж написаний", також дуже важливо, щоб помилки легко було помітити. Припустимо, у вас була функція під назвою Exists (), яка спричиняє існування об'єкта і повертає true / false на основі успіху. Ви можете легко побачити код, if (user.Exists())а не помітити помилку - помилка була б набагато очевиднішою, якби код читався, if (user.SetExists())наприклад.

Крім того, user.Exists () може легко містити складний або неефективний код, круговий посилання в базу даних, щоб щось перевірити. user.CheckExists () дає зрозуміти, що функція щось робить.

Дивіться також всі відповіді тут: Іменування конвенцій: як назвати метод, який повертає булевий?

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


2
> Suppose you had a function called Exists() which causes the object to existЦе вже проблема. Таким способом має бути дієслово, як Create. Принаймні, це було б Exist, але "існувати" як дієслово вживається рідко. It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.Це дуже зрозуміло. Я б запевнив, що більшість розробників будуть здивовані, якби це зробило щось інше, ніж просто повернути булевий характер.
RJFalconer

@RJFalconer Most developers- це ключ до вашого вироку. Я б сказав, all developersбув би здивований, якщо CheckExists()щось інше, ніж перевірити щось, існує. Це не те, що Exists()це жахливе ім'я, просто CheckExists()це краще ім'я, і ​​це питання задає, як загальний принцип, який найкращий зразок іменування? Відповідь - ставитися до цього, як до будь-якої іншої функції, запустити ім'я з дієслова, а не використовувати інший шаблон лише тому, що він повертає булеву форму.
Майкл Паркер

Так, питання стосується найкращого шаблону іменування, АЛЕ для булевих методів. Методи булів унікальні і мають свою загальну назву - предикат. Ви не повинні ставитися до них, як до інших функцій. Поставлення дієслова поряд із питанням у назві булевого методу є зайвим. І це негативно впливає на читабельність коду. Найменування булевих методів у формі запитань без будь-яких дієслів приймається як найкраща практика в галузі. Приклади: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/io/File#exists ()
Алмір

@Almir File.Exists - це надзвичайно старий дзвінок (принаймні крапка 1.1) і не є хорошим прикладом сучасних стандартів читабельності. Подивіться на сучасний точковий API API для більш сучасних прикладів того, як Microsoft погоджується: github.com/dotnet/sdk , кілька випадкових прикладів посилання посилання на посилання
Майкл Паркер

15

Метою читабельності завжди має бути написання коду, максимально наближеного до природної мови. Тож у цьому випадку userExistsздається найкращим вибором. Використання префікса "є", проте, може бути правильним, наприклад, в інших ситуаціях isProcessingComplete.


1
Для вашого другого прикладу ProcessingIsCompleteближче до природних мов? Наприклад: якщо (ProcessingIsComplete ())
Ян

9

Я б пішов з userExists (), тому що 1) це має сенс на природній мові, і 2) він відповідає умовам API, які я бачив.

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

Щоб побачити, чи існує файл у Java SE 6, ви використовуєте File.exists () . Схоже, це буде те саме у версії 7 . C # використовує ту саму умову , що і Python та Ruby . Сподіваємось, це достатньо різноманітна колекція, щоб називати це мовно-агностичною відповіддю. Як правило, я б хотів використовувати методи іменування відповідно до API вашої мови.


5

Тут слід врахувати, що, на мою думку, було пропущено кількома іншими відповідями

  1. Це залежить, чи це метод класу C ++ або функція C. Якщо це метод, то він, ймовірно, буде викликаний if (user.exists()) { ... }чи if (user.isExisting()) { ... }
    ні if (user_exists(&user)). Це є причиною стандартів кодування, що методи bool повинні починатися з дієслова, оскільки вони будуть читатись як речення, коли об'єкт знаходиться перед ними.

  2. На жаль, багато старих функцій C повертають 0 для успіху, а ненульове - для відмови, тому визначити стиль, який використовується, важко визначити, якщо дотримуватися всіх функцій bool, починаючи з дієслів або завжди порівнюючи з true як так if (true == user_exists(&user))


5

Моє просте правило цього питання:

Якщо метод boolean вже має дієслово, не додайте його. Інакше врахуйте. Деякі приклади:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

Чисто суб'єктивний.

Я вважаю за краще, userExists(...)оскільки тоді такі твердження читаються краще:

if ( userExists( ... ) )

або

while ( userExists( ... ) )

1

У цьому конкретному випадку перший приклад - це така жахлива англійська мова, що вона змушує мене хотіти.

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

Це припущення, що це буде використано, якщо тести тверджень звичайно ...



0

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


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