2010-09-01 15 views
7

Checkstyle se queja de lo siguiente:¿El paréntesis debe colocarse siempre alrededor del operador ternario?

return (null == a ? a : new A()); 

y dice que los parens son innecesarias.

Si bien la declaración ciertamente funciona bien sin ellos, parece mucho más fácil de leer con ellos --- presente de otra manera como lo estoy leyendo tiendo a ver:

return null 

primero y luego tener que hacer una pausa para considere el

== a ? a : new A(); 

parte restante, ya que mi cerebro ya ha pasado por un camino.

Además, tiendo a hacer lo mismo siempre que Veo un operador ternario, a menos que esté agrupado en parens.

Entonces, ¿debería ser el estándar de facto el parenteral de todo el ternario? ¿Hay alguna razón para no ponerlos allí?

+0

Para mí también es más legible con los parens. Tengo un ejemplo como var thing = something.prop1.method2() ....? x: y. Leyendo lo primero que esperaba era algo. Prop1.method2 iba a ser lo que inicializara mi var. Si hubiesen parés ... habría sospechado de que se utilizara un operador ternario. – user420667

Respuesta

6

Bueno, el estilo de comprobación es correcto, los paréntesis son inútiles para la ejecución. Pero inútil para la ejecución no significa inútil para la buena lectura de su código. Debes dejarlos si tiene más sentido leer.

creo que este código no necesita más paréntesis:

int number = (myBoolean)? 1 : 2; 

pero en su caso la return palabra clave y el hecho de que su booleana es una expresión puede cambiar la forma de leer la declaración.

+0

¿Por qué estás poniendo parens alrededor de 'myBoolean' en tu código de ejemplo? Ese no es el mismo patrón que el que se le pregunta. –

+3

Hum, es un hábito ... Y, creo que aclara las cosas. –

+0

Prefiero esta sintaxis también. Parece que hace que sea más fácil leer e identificar el condicional – sarink

1

Ambas opciones son correctas, usa lo que tu equipo usa o lo que te gusta si trabajas solo.

IIRC Por defecto, el estilo de revisión utiliza las pautas de estilo de Sun (r.i.p), por lo que si desea ajustarse al estilo estándar, escúchelo y elimine los parens.

2

No, no debería ser el estándar de facto. Lo prefiero sin parens.

Creo que la única razón para ponerlos allí es forzar el orden de evaluación o aclarar una línea confusa.

0

Como la base de su pregunta tiene que ver con el acto de leer el código, abordaré la pregunta desde esa perspectiva.

Uno de los principios básicos de los llamados programas de entrenamiento "de lectura rápida" es que tratan de conseguir que el lector desarrollar un gestalt de la línea de texto en lugar de leer secuencialmente palabra por palabra. Puede tratar de sacar una página de su libro y dar un paso atrás en su código, literalmente si es necesario, para obtener una idea de la línea completa en lugar de tratar el acto de leer como si fuera el acto de analizar token por token.

Alternativamente, podría usar un editor que le permita configurar estilos: podría hacer que el operador ternario sea de un color diferente para que salte hacia usted. Notepad ++, por ejemplo, tiene una serie de temas integrados que hacen esto, al igual que muchos otros editores.

4

Al leer una declaración de devolución, sé que todo está entre 'return' y ';' es lo que se va a devolver, por lo que no hay forma de que pueda leer la muestra del código como return null seguido de algunos símbolos mientras afirma que lo ha leído.

Tal vez leer técnicas de análisis podría ayudarlo a verlo como yo. Dicho esto, realmente no he leído las técnicas de análisis sintáctico, aunque he improvisado algunos analizadores a lo largo de los años.

Siempre elimino paréntesis innecesarios. No ayudan en la comprensión del código, ya que conozco la precedencia del operador de Java bastante bien. En el extraño momento en que no estoy seguro, agrego paréntesis y espero para ver si IDEA me dice que son redundantes. Luego los elimino y trato de memorizar la regla de precedencia que acabo de descubrir.

En las bases de datos que heredé, tiendo a encontrar el mayor número de paréntesis redundantes en áreas de código que son pobres por otras razones, así que los asocio.

1

En general, no.

paréntesis se no requieren alrededor ternario (también conocido como condicional) operadores o sus secciones, porque su prioridad es tan muy baja en el orden de las operaciones (justo debajo de operadores lógicos y asignaciones más arriba). Vea el siguiente enlace para ver la tabla completa.

Se podría argumentar, por lo tanto, que tales parens innecesarios visualmente desorden el código, y revelan una falta de comprensión por parte del programador.

excepciones que podrían requerir el uso de parens en o alrededor ternarios serían:

  • Si su ternario es lo suficientemente complejo como para merecer varias líneas; a continuación, puede rodear su declaración en parens para evitar la inserción automática de punto y coma.

  • Si su ternario está anidado dentro de otro ternario.

Véase también el MDN:

Cuestiones relacionadas