Остерегайтесь жертвовать ясностью в погоне за удобочитаемостью .
Хотя 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 ...», правда - это не «естественный английский», но я бы сказал, что object.verb
никогда не напоминал естественный английский, и это просто базовый аспект современного программирования (для многие основные языки). У программистов обычно нет проблем с пониманием приведенного выше утверждения, разве следующее хуже?
if (user.CheckExists() == true)
Что обычно сокращается до
if (user.CheckExists())
Затем последовал роковой шаг
if (user.Exists())
Хотя было сказано, что «код читается в 10 раз чаще, чем пишется», также очень важно, чтобы ошибки были легко обнаружены. Предположим, у вас есть функция Exists (), которая вызывает существование объекта и возвращает истину / ложь в зависимости от успеха. Вы могли легко увидеть код if (user.Exists())
и не заметить ошибку - ошибка была бы намного более очевидной, если бы код читался, if (user.SetExists())
например.
Кроме того, user.Exists () может легко содержать сложный или неэффективный код, обращаясь к базе данных, чтобы что-то проверить. user.CheckExists () дает понять, что функция что-то делает.
См. Также все ответы здесь: Соглашения об именах: как назвать метод, возвращающий логическое значение?
В качестве заключительного примечания - после «Скажи, не спрашивай» многие функции, возвращающие истину / ложь, все равно исчезают, и вместо того, чтобы запрашивать у объекта его состояние, вы говорите ему сделать что-то, что он может делать в разных способы в зависимости от его состояния.
isBabbyFormed