El operador add de la clase set devuelve un valor booleano que es verdadero si el elemento (que se agregará) ya no estaba allí, y falso de lo contrario. Esta escribiendo
if (set.add(entry)) {
//do some more stuff
}
considerado un buen estilo en términos de escribir código limpio? Me pregunto ya que haces dos cosas a la vez. 1) agregar el elemento y 2) verificar si el elemento existió.
java
coding-style
clean-code
Andreas Braun
fuente
fuente
java.util.Set
, que devuelve verdaderoadd
cuando el elemento ya no estaba allí, ¿verdad?if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
Respuestas:
Sí lo es.
El punto habitual de que una operación devuelva un valor booleano es que puede usarlo para tomar decisiones, es decir, dentro de una
if
construcción. La única otra forma en que podría darse cuenta de este potencial sería almacenar el valor de retorno en una variable y luego reutilizarlo inmediatamente en unif
, lo cual es simplemente tonto y ciertamente no es preferible de ninguna manera a la escrituraif(operation()) { ... }
. Así que solo adelante y haz eso, no te juzgaremos (por eso).fuente
Set.add
como operación única sin nombrar una alternativa. Si la operación prevista es agregar un solo elemento y averiguar si se ha agregado, no hay necesidad de una alternativa más poderosa que aún complica la operación sin beneficio. Espero que sepa queSet.add
es un método JRE integrado que puede usarse sin estudiar primero un libro de> 700 páginas.Diría que no es tan limpio como sea posible, porque obliga al mantenedor a saber o buscar lo que significa el valor de retorno. ¿Significa que el valor ya existía, no existía, se insertó con éxito? Si no lo usa mucho, no lo sabrá, e incluso si lo hace, es mucha más carga mental.
Preferiría lo siguiente:
Sí, un poco más detallado, pero el compilador debería generar prácticamente el mismo código de bytes, e incluso las personas que no han usado conjuntos de Java en años pueden seguir la lógica sin buscar nada.
fuente
add
devuelve verdadero si el elemento ya no estaba allí, no si lo estaba. (La redacción de la pregunta es engañosa)Set.add
, no tiene experiencia y debería buscar estos métodos para aprenderlos y adquirir más experiencia.notAlreadyPresent
No es la mejor redacción. Yo usaríaadded
, y espero que el lector sepa por qué no se agregaría un valor a un Conjunto.Si verdadero significa éxito, entonces es bueno, código claro.
Existe una convención generalizada de que una función o método devuelve verdadero (o algo que se evalúa como verdadero) en caso de éxito. Mientras su código siga eso, creo que poner el método en condicional está bien.
Un código como este está innecesariamente desordenado en mi opinión:
Se siente como si te estuvieras repitiendo.
Sin embargo, la pregunta es ambigua sobre el significado del valor de retorno. Usted dice "un valor booleano que indica si el elemento agregado ya existía", lo que podría implicar que verdadero significa que el elemento existió (y no se produjo la suma). Si ese es el caso, idealmente cambiaría el comportamiento de retorno del método para que sea más convencional. Si eso no es posible, agregaría una variable intermedia adicional que le permite etiquetar claramente el resultado de retorno en su código (como lo sugieren otros).
fuente
false
significa que el elemento no se agregó porque ya estaba contenido ytrue
significa que el elemento ya no estaba contenido. Comoadd()
agrega el elemento al conjunto si el conjunto no lo contenía,true
significa que el elemento se agregó correctamente al conjunto.add
tiene éxito sin tener que hacer nada. Si el elemento no estaba ya en el conjunto,add
tiene éxito al agregar el elemento al conjunto. La interpretación correcta es arbitraria. La definición menos arbitraria de éxito es la del lenguaje: el método tiene éxito si vuelve normalmente.firstLessThanSecond(int l, int r)
, y devuelvetrue
sil > r
ofalse
sil <= r
, entonces ese método no tiene éxito, aunque regrese normalmente.add
es una abreviatura severa del contrato. La documentación comienza con "Agrega el elemento especificado a este conjunto si aún no está presente", que se satisface si el elemento ya estaba o no en el conjunto. Usted es libre de interpretar el valor de retorno como lo desee, pero en última instancia es solo su interpretación. Y en su segundo ejemplo, el método evalúa si una condición es verdadera. Si la condición es falsa, el método ciertamente no ha fallado, ya que ha evaluado con éxito el condicional.Yo diría que es muy parecido a C. La mayoría de las veces preferiría tener una variable con un nombre descriptivo para un resultado de mutación, y que no ocurra mutación en una
if
condición.Un compilador eliminará esta variable si se reutiliza de inmediato. Un humano tendrá más fácil leer la fuente; Para mí, es más importante.
Si alguien tiene que extender la condición agregando una cláusula
and
/or
a la condición if, puede terminar no llamando.add()
en ciertos casos debido a la evaluación de cortocircuito. A menos que se anticipe específicamente un cortocircuito, esto puede terminar como un error.fuente
if (set.contains(entry)){set.add(entry); //do more stuff}
¿eso también lo elimina el compilador?contains
yadd
. Además, hace doble trabajo al buscarentry
en el set; Esto puede jugar un papel para conjuntos muy grandes y bucles muy ligeros.if (set.contains(entry)){set.add(entry); //do more stuff}
sino ir con, por ejemplo, la respuesta de Karl BielefeldtSu código parece romper la separación de consulta de comando . Esto se discute en el libro Clean Code y en el video Function Structure . Entonces, desde una perspectiva de Código limpio, creo que no se considera un buen estilo.
Para mí, la intención de su código no está clara. ¿Se ejecuta ambos si la entrada se agrega con éxito o también cuando ya existe? ¿Qué
add()
devuelve? ¿el objeto? El código de error?fuente
if (set.contains(entry)){set.add(entry); //do more stuff}
que parece un poco tonto. ¿Cuál es su opinión sobre esto?Collection
API.