Остерігайтеся жертвувати чіткістю , переслідуючи читабельність .
Хоча 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 () дає зрозуміти, що функція щось робить.
Дивіться також всі відповіді тут: Іменування конвенцій: як назвати метод, який повертає булевий?
Як підсумкове зауваження - після "Скажи не запитувати", багато функцій, які повертають справжнє / хибне, все одно зникають, і замість того, щоб запитувати об'єкт про його стан, ти кажеш йому зробити щось, що він може робити в різних способи, засновані на його державі.
isBabbyFormed