Tenga cuidado con sacrificar la claridad mientras persigue la legibilidad .
Aunque se if (user.ExistsInDatabase(db))
lee mejor que if (user.CheckExistsInDatabase(db))
, considere el caso de una clase con un patrón de constructor (o cualquier clase en la que pueda establecer el estado):
user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();
No está claro si ExistsInDatabase
está comprobando si existe o estableciendo el hecho de que existe. No escribiría if (user.Age())
o if (user.Name())
sin ningún valor de comparación, entonces, ¿por qué es if (user.Exists())
una buena idea simplemente porque esa propiedad / función es de tipo booleano y puede cambiar el nombre de la función / propiedad para que se lea más como inglés natural? ¿Es tan malo seguir el mismo patrón que usamos para otros tipos que no sean booleanos?
Con otros tipos, una if
declaración compara el valor de retorno de una función con un valor en el código, por lo que el código se parece a:
if (user.GetAge() >= 18) ...
Lo que dice "si el usuario dot get age es mayor o igual a 18 ..." cierto: no es "inglés natural", pero yo diría que object.verb
nunca se asemeja al inglés natural y esto es simplemente una faceta básica de la programación moderna (por muchos idiomas convencionales). Los programadores generalmente no tienen problemas para entender la declaración anterior, entonces, ¿la siguiente es peor?
if (user.CheckExists() == true)
Que normalmente se abrevia a
if (user.CheckExists())
Seguido por el paso fatal
if (user.Exists())
Si bien se ha dicho que "el código se lee 10 veces más de lo que se escribe", también es muy importante que los errores sean fáciles de detectar. Suponga que tiene una función llamada Exists () que hace que el objeto exista y devuelve verdadero / falso según el éxito. Podría ver fácilmente el código if (user.Exists())
y no detectar el error; el error sería mucho más obvio si el código se leyera, if (user.SetExists())
por ejemplo.
Además, user.Exists () podría contener fácilmente código complejo o ineficiente, haciendo un viaje redondo a una base de datos para verificar algo. user.CheckExists () deja en claro que la función hace algo.
Vea también todas las respuestas aquí: Convenciones de nomenclatura: ¿Cómo nombrar un método que devuelve un booleano?
Como nota final, después de "Dile, no preguntes", muchas de las funciones que devuelven verdadero / falso desaparecen de todos modos, y en lugar de preguntarle a un objeto su estado, le dices que haga algo, que puede hacer en diferentes formas basadas en su estado.
isBabbyFormed