Los getters booleanos de Java "es" frente a "son"

90

Sé que la convención en Java para getters booleanos es incluir el prefijo "es".

isEnabled
isStoreOpen

Pero, ¿y si el sujeto es plural? Es decir, ¿y si en lugar de querer saber si una tienda está abierta, quisiera saber si todas las tiendas están abiertas?

isStoresOpen() no tiene sentido en inglés.

Estoy tentado a escribir getters como:

areStoresOpen
areDogsCute
areCatsFuzzy

Y creo que eso tendría sentido, pero me han dicho por otros que yo debería aguantar y abandonar sujeto y el verbo acuerdo y utilización isStoresOpen, isDogsCute, isCatsFuzzy.

De todos modos, ¿qué debo hacer con los getters booleanos que operan en un sujeto plural?

Kodai
fuente
3
Nunca vi antes a un are*()getter.
rekire
21
Siempre escribo are*()getters si son gramaticalmente correctos.
Roddy of the Frozen Peas
2
Si el objeto es un grano, yo creo que hay que aguantar a iso has...
assylias
4
si está utilizando are * () getter, debería devolver boolean [] en la mayoría de los casos, creo.
Juvanis
2
Muy buena pregunta. Me preguntaba esto yo mismo, bastante. Como ya se han señalado muchas de las respuestas, la mayoría de los marcos, IDE y cualquier cosa que se base en una convención que he encontrado utiliza el patrón "get" / "set" / "is". Incluso si esto no es una preocupación en su aplicación, seguiría esa convención independientemente: su código será mucho más fácil de seguir (incluso para usted) si mantiene una convención de nomenclatura consistente (incluso si a veces no suena gramaticalmente extraño ).
Paul Richter

Respuestas:

57

No recuerdo de qué libro es esto, pero la esencia es que el código se leerá muchas más veces de las que está escrito. Escriba para facilitar la lectura.

Juan
fuente
20
Código limpio - Robert Martin
John B
8
Pero tenga mucho cuidado de no ir demasiado lejos. storesAreOpen()probablemente sería el más gramatical (debido a if(storesAreOpen())), pero la parte booleana del nombre ahora está oculta en el medio del nombre del método, lo que rompe las convenciones de Java y el código legible.
Izkata
108
No entiendo cómo esta es la respuesta aceptada. Ni siquiera proporciona una respuesta definitiva a la pregunta.
Tamzin Blake
3
Responde a la pregunta de una manera muy general. Es cierto que no aborda los detalles, pero esta es una respuesta. Puede parecer trillado, pero tiene valor (al menos 24 personas piensan que sí).
George Stocker
4
para aclarar la respuesta, agregaría un comentario de que areStoresOpen () es una buena opción aquí.
kiedysktos
94

¿Qué tal tener un inglés lo suficientemente decente y seguir el estándar Java?

isEveryStoreOpen() o isEachCatCute()

Cuando tengo dudas sobre la palabra correcta, siempre me gusta usar el diccionario de sinónimos.

satur9nine
fuente
18
+1, esto transmite claramente si el valor devuelto significa isEveryStoreOpen () o isAnyStoreOpen () a diferencia del ambiguo isStoresOpen ().
Imre el
4
+1 ¡Esta debería ser la respuesta aceptada! Tiene sentido gramatical, manteniendo el Java booleans isconvención prefijo. Además, proporciona un poco de información adicional que será realmente útil para aquellos hablantes no nativos de inglés que sean mantenedores del código base.
higuaro
¡Esta respuesta cambió mi vida! Y debería ser la respuesta aceptada.
Marcel Blanck
34

La convención es prefijar el método getter con "es", no la variable en sí.

p.ej

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

y

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () no tiene sentido en inglés.

Puede que no tenga sentido gramaticalmente, pero sigue la convención y parece lo suficientemente legible.

Bhesh Gurung
fuente
Tu respuesta tiene sentido y te lo agradezco. Creo que desde una posición autorizada de correcto / incorrecto, tienes razón. Simplemente no quiero una convención que pretendía ayudarnos por ser obvia, clara y fácil de entender a abandonar ese propósito en aras de adherirnos a sus reglas. Pero tienes razón, así es como es y eso es lo que pregunté.
Kodai
@kodai: Creo que no debería considerarse una regla, sino solo una convención. Pero creo que, si bien, escribir código que no siga la convención, si no es necesario, hacer que el código sea legible es el camino a seguir.
Bhesh Gurung
18

La especificación de Java Bean dice usar getpara getters a menos que sea un booleanuso posterior is. areno es estándar y no será reconocido por nada que espere la denominación estándar de Bean.

Steve Kuo
fuente
17

Muchas herramientas esperan iso getprobablemente no reconocerán are.

Intente reformularlos, me gusta getDogsAreFuzzy()o getStoresAreOpen()cosas así para una mejor compatibilidad y convenciones.

Kevin Rubin
fuente
Si. Herramientas como los servicios públicos de frijol cuentan con la palabra es encontrar captadores de Boole.
nalply
4

- isEnabled() también se puede escribir como getEnabled()en Java naming conventions.

- Es un buen hábito seguir las convenciones de nomenclatura, ayuda cuando trabajas con Java Beans.

Kumar Vivek Mitra
fuente
3

En general, creo que el código debería ser lo más fácil de leer posible para que un método casi pueda leerse como un párrafo (como lo propugna Clean Code). Por lo tanto, nombraría el método para sonar / leer lo más fácilmente posible y seguir la regla gramatical de are. Con los IDE modernos es fácil encontrar métodos sin buscar específicamente get/ is.

Sin embargo, Kumar hace un buen punto sobre los frijoles. Muchas herramientas solo buscarán get/ is. En ese caso, podría considerar tener ambos métodos. Uno para facilitar la lectura y otro para el uso de herramientas.

Juan B
fuente
3

¿En qué idioma escribe: inglés o Java ?

Cuando leo código Java, espero que las cosas estén ahí, tener que buscar ambos captadores, con prefijos is y son , será más complicado que buscar un solo prefijo.

Sin embargo, por otro lado, cuando leo el periódico por la mañana, no busco nada, así que puedes escribir en una forma más tradicional del inglés.

return 0;

Ilya Gazman
fuente
3

En su pregunta, está preguntando explícitamente sobre captadores. Un captador devuelve información sobre una instancia de tu clase. Por ejemplo, tienes una clase Store. Ahora, isStoreOpenes un nombre de método perfectamente bueno para un getter.

A continuación, mencionas un método que verifica si todas las tiendas están abiertas. Este método no es un captador en absoluto, porque no devuelve información sobre una instancia sino para todas. Por supuesto, a menos que haya una clase Stores. Si este es el caso, debería repensar su diseño, porque Java ya tiene formas de almacenar una cantidad de instancias, por ejemplo, matrices o colecciones, por lo que no tiene que escribir clases adicionales.

Si este no es el caso, entonces este nombre de método está perfectamente bien. Una alternativa puede ser simplemente allStoresOpensin el "es".

TL; DR: Si está tratando con varias instancias, no es un captador. Si es así, tu diseño es malo.

Kirill Rakhman
fuente
2

Honestamente, diría que definitivamente olvídate del are*y quédate con is*. Piense en el "is"como el significado de la variable y haga un nombre mejor si es posible.

Yo diría que isStoresOpen no suena tan mal, pero puedes hacer isStoresAreOpen si eso te suena mejor.

Pero mi idea general sería ceñirme a las convenciones. Que usa "get" para getters y "is" para tipos booleanos. Personalmente, creo que usar "es" a veces ya es problemático. Sí, se ve bien en condiciones "si", pero a veces simplemente escribo "get" al codificar y reviso la lista desplegable para ver la variable que necesito y empiezo a preguntarme qué está mal y por qué no puedo encontrarlo, entonces me doy cuenta comienza con "es" ...

Arturas M
fuente
1

En la programación orientada a objetos, esto debe rara vez, o nunca, aparecer desde Storeo Cato lo que debe ser una clase separada, con su propio isOpen()o isFuzzy()método. Si tiene un tipo más alto, considere dividirlo al nivel más atómico que está usando realmente. En general, los objetos no deben ser plurales en el nivel más bajo.

asteri
fuente
1

isStoresOpen () en este StoresOpen parece un plural,

Cuando sigue la Convención de nomenclatura de Java y los Estándares de Java Beans, tienen prefijos predefinidos para booleanos y otros tipos, por lo que debe seguir la Convención de nomenclatura de Java Beans.

Vayamos a su punto. Cuando vea storesOpen como en un prospecto en inglés, sí, parece plural. Una vez más, observe profundamente esa palabra,

aquí

storesOpen es plural según la gramática inglesa,

El resultado de isStoresOpen no es plural, en lugar de singular o puede decir que es escalar en términos de convención de programación.

Su resultado es booleano, solo verdadero o falso

No como su enunciado plural en inglés verdadero o falso

No es una matriz de verdadero o falso , ni una colección de verdadero o falso

Entonces, aquí podemos decir que, aquí estamos interesados ​​en el valor que se devuelve de ese método de frijol booleano, no en el nombre dado a la propiedad de la clase para señalar la entidad del mundo real.

Una cosa más importante es que, siempre que tales propiedades booleanas se utilicen en clases y las bibliotecas predefinidas las utilicen en cualquier marco, el marco con el prefijo de uso ' es ' para recuperar valores booleanos,

por qué significa que no es mucho más inteligente que tú, ya que sabes gramática inglesa como plural / singular, multiplexor, etc.

Anil Kumar
fuente