Логическая удобочитаемость

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

public boolean isUserExist(...)

или

public boolean doesUserExist(...)

или

public boolean userExists(...)

Ответ 1

public boolean userExists(...)

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

if userExists ...

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Хотя 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, все равно исчезают, и вместо того, чтобы запрашивать объект для его состояния, вы говорите ему что-то делать, что он может делают по-разному на основе своего состояния.

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

if ( userExists( ... ) )

или

while ( userExists( ... ) )

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

Почему бы не переименовать собственность тогда?

if (user.isPresent()) {