Читабельность именования логических методов

60

Простой вопрос, с точки зрения удобочитаемости, какое имя метода вы предпочитаете для логического метода:

public boolean isUserExist(...)

или

public boolean doesUserExist(...)

или

public boolean userExists(...)
  • 16
    первый звучит как isBabbyFormed
  • 0
    Зависит от языка. Разные языки имеют разные соглашения; Ява и Цель C приходят на ум. Также пограничный субъективный.
Показать ещё 2 комментария
Теги:
naming-conventions
readability

11 ответов

59
Лучший ответ
public boolean userExists(...)

Было бы предпочтительнее. Поскольку это делает ваши условные проверки гораздо более похожими на естественный английский:

if userExists ...

Но я думаю, что нет жесткого и быстрого правила - просто быть последовательным

  • 3
    «делает ваш {вызов метода} гораздо более похожим на естественный английский» звучит как отличный тест для рационального именования по всем направлениям. разъяснил мои мысли по этому вопросу - спасибо!
  • 7
    С другой стороны, в отдельности или когда не сразу после «если», тогда «userExists ()» звучит как констатация факта, а не как вопрос, который был задуман. В отличие от "IsUserExisting ()" или "DoesUserExist ()", который следует правилам порядка слов на естественном языке английского языка для простых вопросов.
Показать ещё 2 комментария
26

Я бы сказал userExists, потому что 90% времени мой код вызова будет выглядеть следующим образом:

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

и он читается буквально на английском языке.

if isUserExist и if doesUserExist кажутся избыточными.

  • 0
    +1 для читабельности
13

Цель читаемости - всегда писать код, максимально приближенный к естественному языку. Таким образом, в этом случае userExists представляется лучшим выбором. Использование префикса "есть", тем не менее, может быть правильным в других ситуациях, например isProcessingComplete.

8

Остерегайтесь жертвовать ясностью, читая читаемость.

Хотя 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..." true - это не "естественный английский", но я бы сказал, что 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() дает понять, что функция что-то делает.

См. также все ответы здесь: Соглашения об именах: как назвать метод, который возвращает логическое значение?

В качестве заключительной заметки - далее "Tell Do not Ask", многие функции, которые возвращают true/false, все равно исчезают, и вместо того, чтобы запрашивать объект для его состояния, вы говорите ему что-то делать, что он может делают по-разному на основе своего состояния.

  • 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. Это очень ясно. Я бы сказал, что большинство разработчиков были бы удивлены, если бы они сделали что-то еще, кроме простого возврата логического значения.
  • 0
    @RJFalconer Most developers является ключом к вашему предложению там. Я бы сказал, что all developers будут удивлены, если CheckExists() сделает что-то кроме проверки, что что-то существует. Дело не в том, что Exists() - ужасное имя, просто в том, что CheckExists() - лучшее имя, и этот вопрос задает, как правило, какой шаблон именования является лучшим? Ответ заключается в том, чтобы относиться к нему как к любой другой функции, начинать имя с глагола и не использовать другой шаблон только потому, что он возвращает логическое значение.
Показать ещё 1 комментарий
7

Я бы пошел с userExists(), потому что 1) он имеет смысл на естественном языке и 2) он соответствует соглашениям API, которые я видел.

Чтобы понять, имеет ли это смысл на естественном языке, прочитайте его вслух. "Если пользователь существует" звучит скорее как действительная английская фраза, чем "если существует пользователь" или "если пользователь существует". "Если пользователь существует", было бы лучше, но "вероятно" является избыточным в имени метода.

Чтобы узнать, существует ли файл в Java SE 6, использовать File.exists(). Похоже, что это будет тот же в версии 7. С# использует то же соглашение, как и Python и Ruby. Надеюсь, это достаточно разнообразная коллекция, чтобы назвать этот язык-агностическим ответом. Как правило, я бы использовал методы именования в соответствии с вашим языком API.

5

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

  • Это зависит от того, является ли это методом класса С++ или функцией C. Если это метод, то он, скорее всего, будет называться if (user.exists()) { ... } или if (user.isExisting()) { ... }
    не if (user_exists(&user)). Именно по этой причине стандарты кодирования, которые определяют методы bool, должны начинаться с глагола, поскольку они будут читаться как предложение, когда объект находится перед ними.

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

2

Мое простое правило в этом вопросе таково:

Если у булевского метода уже есть глагол, не добавляйте его. В противном случае, подумайте. Некоторые примеры:

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

Мне нравится любое из них:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null
0

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

0

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

Я, вероятно, поеду на номер три из-за того, как это звучит при чтении в if-заявлениях. "Если пользователь существует" звучит лучше, чем "Если пользователь существует".

Предполагается, что это будет использоваться в тестах if if course...

0

Чисто субъективный.

Я предпочитаю userExists(...), потому что тогда такие утверждения лучше читаются:

if ( userExists( ... ) )

или

while ( userExists( ... ) )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню