Pregunta simple, desde el punto de vista de la legibilidad, qué nombre de método prefiere para un método booleano:
public boolean isUserExist(...)
o:
public boolean doesUserExist(...)
o:
public boolean userExists(...)
api
naming-conventions
readability
Yuval Adam
fuente
fuente
isBabbyFormed
getUserExistence
,userIsNotExtinct
,userHasExistentialState
Etc ...Respuestas:
Sería mi preferido. Como hace que sus verificaciones condicionales se parezcan mucho más al inglés natural:
Pero supongo que no hay una regla estricta y rápida, solo sé constante
fuente
if
? Si tienen efectos secundarios, es aún más un olor.if IsUserExisting()
y seif DoesUserExist()
ve horrible y debe evitarse.userExists
, ¿qué nombre de variable declarará?userExists
es bueno para variables, no para métodos. Como escribió @Oskar, suena como una declaración, no una pregunta.Yo diría
userExists
, porque el 90% de las veces mi código de llamada se verá así:y se lee muy literalmente en inglés.
if isUserExist
yif doesUserExist
parecen redundantes.fuente
Tenga cuidado con sacrificar la claridad mientras persigue la legibilidad .
Aunque se
if (user.ExistsInDatabase(db))
lee mejor queif (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íaif (user.Age())
oif (user.Name())
sin ningún valor de comparación, entonces, ¿por qué esif (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: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?Que normalmente se abrevia a
Seguido por el paso fatal
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.
fuente
Suppose you had a function called Exists() which causes the object to exist
Eso ya es un problema. Tal método debería ser un verbo, comoCreate
. Por lo menos lo seríaExist
, pero "existir" como verbo rara vez se usa.It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.
Es muy claro. Afirmaría que la mayoría de los desarrolladores se sorprenderían si eso hiciera algo más que devolver un booleano.Most developers
es la clave de tu oración allí. Yo diríaall developers
que me sorprendería si hicieraCheckExists()
algo más que comprobar que algo existe. No es queExists()
sea un nombre terrible, solo queCheckExists()
es un nombre mejor , y esta pregunta es, como principio general, ¿cuál es el mejor patrón de nomenclatura? La respuesta es tratarla como cualquier otra función, comenzar el nombre con un verbo y no usar un patrón diferente solo porque devuelve un booleano.El objetivo de la legibilidad siempre debe ser escribir código lo más parecido posible al lenguaje natural. Entonces, en este caso,
userExists
parece la mejor opción. No obstante, el uso del prefijo "es" puede ser correcto en otras situaciones, por ejemploisProcessingComplete
.fuente
ProcessingIsComplete
más cerca de los lenguajes naturales? Por ejemplo: if (ProcessingIsComplete ())Yo iría con userExists () porque 1) tiene sentido en lenguaje natural y 2) sigue las convenciones de las API que he visto.
Para ver si tiene sentido en lenguaje natural, léalo en voz alta. "Si el usuario existe" suena más como una frase válida en inglés que "si el usuario existe" o "si el usuario existe". "Si el usuario existe" sería mejor, pero "el" probablemente sea superfluo en el nombre de un método.
Para ver si un archivo existe en Java SE 6, usaría File.exists () . Parece que será igual en la versión 7 . C # usa la misma convención , al igual que Python y Ruby . Con suerte, esta es una colección lo suficientemente diversa como para llamar a esto una respuesta independiente del idioma. En general, me pondría del lado de los métodos de nomenclatura de acuerdo con la API de su idioma.
fuente
Hay cosas a considerar que creo que se pasaron por alto en varias otras respuestas aquí.
Depende si se trata de un método de clase C ++ o una función C. Si se trata de un método, es probable que se llame
if (user.exists()) { ... }
oif (user.isExisting()) { ... }
no
if (user_exists(&user))
. Esta es la razón detrás de los estándares de codificación que indican que los métodos bool deben comenzar con un verbo, ya que se leerán como una oración cuando el objeto esté frente a ellos.Desafortunadamente, muchas funciones antiguas de C devuelven 0 para el éxito y no cero para el error, por lo que puede ser difícil determinar el estilo que se está utilizando a menos que siga todas las funciones bool que comienzan con verbos o siempre se comparan con verdadero como tal.
if (true == user_exists(&user))
fuente
Mi regla simple para esta pregunta es esta:
Si el método booleano ya TIENE un verbo, no agregue uno. De lo contrario, considérelo. Algunos ejemplos:
fuente
Puramente subjetivo.
Prefiero
userExists(...)
porque entonces declaraciones como esta se leen mejor:o
fuente
En este caso particular, el primer ejemplo es un inglés tan horrible que me hace estremecer.
Probablemente optaría por el número tres debido a cómo suena al leerlo en declaraciones if. "Si el usuario existe" suena mejor que "Si el usuario existe".
Esto es asumiendo que se usará en pruebas de declaraciones if, por supuesto ...
fuente
Me gusta cualquiera de estos:
fuente
Los nombres de los métodos sirven para facilitar la lectura, solo los que encajan en todo el código serían los mejores, ya que en la mayoría de los casos comienza con condiciones, por lo tanto, subjectPredicate sigue la estructura natural de la oración.
fuente
¿Por qué no cambiar el nombre de la propiedad entonces?
fuente