Pregunta Método booleano que nombra la legibilidad


Pregunta simple, desde el punto de vista de la legibilidad, qué nombre de método prefieres para un método booleano:

public boolean isUserExist(...)

o:

public boolean doesUserExist(...)

o:

public boolean userExists(...)

75
2017-10-14 14:42


origen


Respuestas:


public boolean userExists(...)

Sería mi preferido. A medida que sus controles condicionales se parecen mucho más al inglés natural:

if userExists ...

Pero supongo que no hay una regla dura y rápida, solo sé consistente


69
2017-10-14 14:45



yo diría userExists, porque el 90% de las veces mi código de llamada se verá así:

if userExists(...) {
  ...
}

y se lee muy literalmente en inglés.

if isUserExist y if doesUserExist parece redundante


31
2017-10-14 14:46



El objetivo de la legibilidad siempre debe ser escribir el código lo más cerca posible del lenguaje natural. Entonces en este caso, userExists parece la mejor elección. Sin embargo, usar el prefijo "es" puede ser correcto en otras situaciones, por ejemplo isProcessingComplete.


14
2017-10-14 14:53



Cuidado con sacrificar claridad mientras persigue legibilidad.

A pesar de que if (user.ExistsInDatabase(db)) lee mejor que if (user.CheckExistsInDatabase(db)), considere el caso de una clase con un patrón de generador (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ías 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 leer 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 La 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 ve algo así como:

if (user.GetAge() >= 18) ...

Que dice "si la edad del usuario obtiene edad es mayor o igual a 18 ..." cierto - no es "inglés natural", pero yo diría que object.verb nunca se parecía al inglés natural y esto es simplemente una faceta básica de la programación moderna (para muchos idiomas convencionales). Generalmente, los programadores no tienen problemas para entender la declaración anterior, por lo tanto, ¿la siguiente es peor?

if (user.CheckExists() == true)

Que normalmente se acorta 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 que lo escrito", también es muy importante que los errores sean fáciles de detectar. Supongamos que tiene una función llamada Exists () que hace que el objeto exista y devuelve verdadero / falso en función del éxito. Podrías 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 leía if (user.SetExists()) por ejemplo.

Además, user.Exists () podría contener fácilmente código complejo o ineficiente, un disparo circular a una base de datos para verificar algo. user.CheckExists () deja en claro que la función hace algo.

Ver también todas las respuestas aquí: Convenciones de nombres: ¿Qué nombre un método que devuelve un booleano?

Como nota final, después de "Tell Do not Ask", muchas de las funciones que devuelven verdadero / falso desaparecen de todos modos, y en lugar de preguntarle a un objeto por su estado, le dices que haga algo, lo que puede hacer en diferentes formas basadas en su estado.


11
2017-09-09 15:59



Me gustaría ir con userExists () porque 1) tiene sentido en el lenguaje natural, y 2) sigue las convenciones de las API que he visto.

Para ver si tiene sentido en el lenguaje natural, léalo en voz alta. "Si el usuario existe" suena más como una frase en inglés válida 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 existe un archivo en Java SE 6, lo haría use File.exists (). Esto parece que será el mismo en la versión 7. C # usos la misma convención, al igual que Pitón y Rubí. Con suerte, esta es una colección lo suficientemente diversa como para llamar a esto una respuesta independiente del idioma. En general, apoyaría los métodos de nomenclatura de acuerdo con la API de tu idioma.


8
2018-01-15 03:19



Hay cosas que considerar que creo que fueron extrañadas por varias otras respuestas aquí

  1. Depende si este es un método de clase C ++ o una función C. Si este es un método, entonces es probable que se llame if (user.exists()) { ... } o if (user.isExisting()) { ... }
    no if (user_exists(&user)) . Esta es la razón detrás de los estándares de codificación que los métodos de estado bool deberían comenzar con un verbo, ya que leerán como una oración cuando el objeto está delante de ellos.

  2. Desafortunadamente, muchas funciones antiguas de C devuelven 0 para el éxito y no cero para el fracaso, 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 verdaderos. if (true == user_exists(&user))


5
2017-09-22 04:56



Mi regla simple para esta pregunta es esta:

Si el método booleano ya tiene un verbo, no agregue uno. De lo contrario, considéralo. Algunos ejemplos:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2
2017-07-07 19:56



Me gusta cualquiera de estos:

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

1
2017-10-14 14:48



Puramente subjetivo

yo prefiero userExists(...) porque entonces las declaraciones como esta se leen mejor:

if ( userExists( ... ) )

o

while ( userExists( ... ) )

1
2017-10-14 14:47



En este caso particular, el primer ejemplo es un horrible inglés que me hace estremecer.

Probablemente vaya por el número tres por cómo suena al leerlo en las declaraciones. "Si el usuario existe" suena mejor que "Si el usuario existe".

Esto es asumiendo que va a ser usado en las pruebas de declaración if, por supuesto ...


0
2017-10-14 14:48