Простой вопрос, с точки зрения удобочитаемости, какое имя метода вы предпочитаете для логического метода:
public boolean isUserExist(...)
или:
public boolean doesUserExist(...)
или:
public boolean userExists(...)
api
naming-conventions
readability
Юваль Адам
источник
источник
isBabbyFormed
getUserExistence
,userIsNotExtinct
иuserHasExistentialState
т.д ...Ответы:
Было бы моим предпочтением. Поскольку это делает ваши условные проверки более похожими на естественный английский:
Но я думаю, что нет жесткого правила - просто будьте последовательны
источник
if
? Если у них есть побочные эффекты, это еще больше запах.if IsUserExisting()
иif DoesUserExist()
выглядит ужасающе, и его следует избегать.userExists
, какое имя переменной вы объявите?userExists
подходит для переменных, а не для методов. Как написал @Oskar - это звучит как утверждение, а не вопрос.Я бы сказал
userExists
, потому что в 90% случаев мой вызывающий код будет выглядеть так:и это очень буквально читается по-английски.
if isUserExist
иif doesUserExist
кажутся излишними.источник
Остерегайтесь жертвовать ясностью в погоне за удобочитаемостью .
Хотя
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
оператор сравнивает возвращаемое значение функции со значением в коде, поэтому код выглядит примерно так:Это звучит так: «если возраст пользователя больше или равен 18 ...», правда - это не «естественный английский», но я бы сказал, что
object.verb
никогда не напоминал естественный английский, и это просто базовый аспект современного программирования (для многие основные языки). У программистов обычно нет проблем с пониманием приведенного выше утверждения, разве следующее хуже?Что обычно сокращается до
Затем последовал роковой шаг
Хотя было сказано, что «код читается в 10 раз чаще, чем пишется», также очень важно, чтобы ошибки были легко обнаружены. Предположим, у вас есть функция Exists (), которая вызывает существование объекта и возвращает истину / ложь в зависимости от успеха. Вы могли легко увидеть код
if (user.Exists())
и не заметить ошибку - ошибка была бы намного более очевидной, если бы код читался,if (user.SetExists())
например.Кроме того, user.Exists () может легко содержать сложный или неэффективный код, обращаясь к базе данных, чтобы что-то проверить. user.CheckExists () дает понять, что функция что-то делает.
См. Также все ответы здесь: Соглашения об именах: как назвать метод, возвращающий логическое значение?
В качестве заключительного примечания - после «Скажи, не спрашивай» многие функции, возвращающие истину / ложь, все равно исчезают, и вместо того, чтобы запрашивать у объекта его состояние, вы говорите ему сделать что-то, что он может делать в разных способы в зависимости от его состояния.
источник
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.
Это очень ясно. Я бы сказал, что большинство разработчиков были бы удивлены, если бы это сделало что-нибудь, кроме простого возврата логического значения.Most developers
- это ключ к твоему предложению. Я бы сказал,all developers
был бы удивлен, если быCheckExists()
сделал что-нибудь, кроме проверки, что что-то существует. Дело не в том, чтоExists()
это ужасное имя, простоCheckExists()
это имя лучше , и этот вопрос задает, как общий принцип, какой шаблон именования лучше всего? Ответ - относиться к ней как к любой другой функции, начинать имя с глагола и не использовать другой шаблон только потому, что он возвращает логическое значение.Целью обеспечения удобочитаемости всегда должно быть написание кода, максимально приближенного к естественному языку. Так что в данном случае это
userExists
кажется лучшим выбором. Тем не менее, использование префикса «is» может быть правильным, например, в других ситуацияхisProcessingComplete
.источник
ProcessingIsComplete
ближе к естественным языкам? Например: if (ProcessingIsComplete ())Я бы выбрал userExists (), потому что 1) это имеет смысл на естественном языке и 2) он следует соглашениям API, которые я видел.
Чтобы понять, имеет ли это смысл на естественном языке, прочтите его вслух. «Если пользователь существует» больше похоже на допустимую английскую фразу, чем «если пользователь существует» или «если пользователь существует». «Если пользователь существует» было бы лучше, но «the», вероятно, излишне в имени метода.
Чтобы узнать, существует ли файл в Java SE 6, вы должны использовать File.exists () . Похоже, что в версии 7 будет так же . C # использует то же соглашение , что и Python и Ruby . Надеюсь, это достаточно разнообразный сборник, чтобы назвать это языково-независимым ответом. В общем, я бы предпочел методы именования в соответствии с API вашего языка.
источник
Есть вещи, которые следует учитывать, которые, как мне кажется, были упущены в нескольких других ответах здесь
Это зависит от того, является ли это методом класса C ++ или функцией C. Если это метод, то он, скорее всего, будет вызван
if (user.exists()) { ... }
илиif (user.isExisting()) { ... }
нет
if (user_exists(&user))
. Это причина того, что стандарты кодирования гласят, что методы bool должны начинаться с глагола, поскольку они будут читаться как предложение, когда объект находится перед ними.К сожалению, многие старые функции C возвращают 0 в случае успеха и ненулевое значение в случае неудачи, поэтому может быть сложно определить используемый стиль, если вы не следуете, чтобы все функции bool начинались с глаголов или всегда сравнивались с true, например
if (true == user_exists(&user))
источник
Мое простое правило на этот вопрос таково:
Если в логическом методе уже ЕСТЬ глагол, не добавляйте его. В противном случае подумайте об этом. Некоторые примеры:
источник
Чисто субъективно.
Я предпочитаю,
userExists(...)
потому что тогда такие утверждения читаются лучше:или
источник
В данном конкретном случае первый пример - такой ужасный английский, что я вздрагиваю.
Я бы, вероятно, выбрал номер три из-за того, как он звучит при чтении операторов if. «Если пользователь существует» звучит лучше, чем «Если пользователь существует».
Конечно, предполагается, что он будет использоваться в тестах оператора if ...
источник
Мне нравится любой из них:
источник
Имена методов служат для удобочитаемости, лучше всего подходят только те, которые вписываются во весь ваш код, в большинстве случаев они начинаются с условий, поэтому subjectPredicate следует естественной структуре предложения.
источник
Почему бы тогда не переименовать собственность?
источник