¿Debo usar paréntesis en las declaraciones lógicas, incluso cuando no sea necesario?

100

Digamos que tengo una condición booleana a AND b OR c AND dy estoy usando un lenguaje donde ANDtiene un orden de operación más alto que OR. Podría escribir esta línea de código:

If (a AND b) OR (c AND d) Then ...

Pero realmente, eso es equivalente a:

If a AND b OR c AND d Then ...

¿Hay algún argumento a favor o en contra que incluya paréntesis extraños? ¿La experiencia práctica sugiere que vale la pena incluirlos para facilitar la lectura? ¿O es una señal de que un desarrollador realmente necesita sentarse y confiar en los conceptos básicos de su idioma?

Jeff Bridgman
fuente
90
Puedo ser flojo, pero prefiero tener paréntesis en la mayoría de esas situaciones para facilitar la lectura.
thorsten müller
66
Yo también. Solo espero hacerlo más por la legibilidad y menos porque soy demasiado vago para ser confiado / competente en los conceptos básicos de mi idioma.
Jeff Bridgman
16
El buen uso de paréntesis es como el buen uso de la gramática. 2 * 3 + 2puede ser el mismo (2 * 3) + 2pero el segundo es más fácil de leer.
Reactgular
16
@Mathew Quizás si eres débil en matemáticas. Para casos más complejos, seguro, use paréntesis. Pero para los cegadoramente obvios (BODMAS ...) reducen la legibilidad más que ayudarla debido al desorden.
Konrad Rudolph
3
Dicho esto, la misma precedencia de AND / OR tiene en Basic, Python, SQL ... mi impresión es que esta es la regla en la gran mayoría de los lenguajes modernos (aunque no todos).
Tim Goodman

Respuestas:

118

Los buenos desarrolladores se esfuerzan por escribir código que sea claro y correcto . Los paréntesis en condicionales, incluso si no son estrictamente necesarios, ayudan con ambos.

En cuanto a la claridad , piense en paréntesis como comentarios en el código: no son estrictamente necesarios, y en teoría un desarrollador competente debería ser capaz de descifrar el código sin ellos. Y, sin embargo, estas señales son extremadamente útiles, porque:

  • Reducen el trabajo requerido para comprender el código.
  • Proporcionan confirmación de la intención del desarrollador.

Además, los paréntesis adicionales, al igual que las sangrías, los espacios en blanco y otros estándares de estilo, ayudan a organizar visualmente el código de una manera lógica.

En cuanto a la corrección , las condiciones sin paréntesis son una receta para errores tontos. Cuando suceden, pueden ser errores que son difíciles de encontrar, porque a menudo una condición incorrecta se comportará correctamente la mayor parte del tiempo y solo ocasionalmente fallará.

E incluso si lo hace bien, la siguiente persona que trabaje en su código puede no hacerlo, ya sea agregando errores a la expresión o malinterpretando su lógica y, por lo tanto, agregando errores en otros lugares (como señala LarsH correctamente).

Siempre uso paréntesis para expresiones que combinan andy or(y también para operaciones aritméticas con problemas de precedencia similares).

usuario82096
fuente
3
Aunque, he oído que los comentarios son disculpas (por código malo / difícil de leer) ... hay una buena posibilidad de que lo hayas escrito mejor. Supongo que se podría decir algo similar sobre paréntesis.
Jeff Bridgman
66
Otro aspecto de la corrección es preservarlo a través de cambios: mientras que el desarrollador original puede tener prioridad sin paréntesis cuando escribe el código por primera vez con el propósito y el contexto frescos, él (u otro) que aparece más tarde y no recuerda todo los detalles pueden estropearlo cuando agregan más términos a la expresión. (Eso ya estaba implícito, pero sentí que valía la pena enfatizarlo).
LarsH
1
@LarsH, gracias, agregué esto explícitamente a la respuesta.
8
+1 "Proporcionan confirmación de la intención del desarrollador". - cualquier programador (OK, tal vez no todos, pero todos los que residen aquí ...) pueden resolver lo que hará el compilador con la lógica más compleja. Absolutamente nadie puede resolver lo que el desarrollador original pretendía (incluyéndose a sí mismo) unas semanas después de todo para algo más allá de lo más simple .....
mattnz
2
Creo que @JeffBridgman estaba haciendo referencia a un punto de vista bastante conocido de "los comentarios a veces pueden ser un olor a código". Por ejemplo, vea el resumen de Jeff Atwood que incluye la pregunta "¿Puede refactorizar el código para que no se requieran los comentarios?". Yo diría que si su comentario explica por qué su código es tan poco intuitivo, definitivamente puede ser una pista de que algo está mal. En momentos como este, es una buena idea simplificar el código. Sin embargo, estoy completamente de acuerdo con su respuesta real y tomo paréntesis.
Daniel B
94

Importa menos si se confía en su conocimiento de la lengua. Lo que más importa es la comprensión del lenguaje del n00b que te sigue.

Escriba su código de la manera más clara e inequívoca posible. Los paréntesis adicionales a menudo (pero no siempre) ayudan. Poner solo una declaración en una línea a menudo ayuda. La consistencia en el estilo de codificación a menudo ayuda.

Hay demasiados paréntesis, pero es una de esas situaciones en las que no necesitará consejo: lo sabrá cuando lo vea. En ese punto, refactorice su código para reducir la complejidad de la declaración en lugar de eliminar el paréntesis.

Dan Pichelman
fuente
72
No olvides que incluso si eres un desarrollador en solitario cuando estás enfermo, cansado o lidias con el código que escribiste el año pasado; su nivel de comprensión se reduce al de un n00b.
Dan Neely
30
There is such a thing as too many parenthesis- obviamente no eres un lisper;)
Paul
18
Eso es un mal consejo: no escriba para novatos. Esto reducirá la calidad de su código (considerablemente) porque no puede usar expresiones idiomáticas bien establecidas que vayan más allá de los dos primeros capítulos de un libro para principiantes.
Konrad Rudolph
10
@KonradRudolph: tal vez sí, pero no escribas para los únicos que conocen el Arte de la Programación de Computadora de principio a fin, o estén preparados para depurar su código después, y no tengan idea de por qué hicieron las cosas de esa manera . El código se lee mucho más de lo que se escribe.
haylem
15
@dodgethesteamroller: He visto demasiados desarrolladores competentes / respetados que introducen errores de precedencia (todos tienen un mal día de vez en cuando) que pasan desapercibidos durante años. Para los buenos desarrolladores que conocen las reglas de precedencia, el riesgo de errores / errores tipográficos no detectados es demasiado alto. Para todos los demás, el riesgo es mayor. Los mejores desarrolladores son aquellos que solían recordar las reglas de precedencia del lenguaje, pero las olvidaron debido al uso habitual de paréntesis para cualquier cosa que no sea obvia.
Brendan
32

si

Siempre debes usar paréntesis ... no controlas el orden de precedencia ... el desarrollador del compilador sí. Aquí hay una historia que me sucedió sobre el no uso de paréntesis. Esto afectó a cientos de personas durante un período de dos semanas.

Razón del mundo real

Heredé una aplicación de marco principal. Un día, de la nada, dejó de funcionar. Eso es todo ... poof se detuvo.

Mi trabajo consistía en hacerlo funcionar lo más rápido posible. El código fuente no había sido modificado durante dos años, pero de repente simplemente se detuvo. Traté de compilar el código y se rompió en la línea XX. Miré la línea XX y no podía decir qué haría que la línea XX se rompiera. Pedí las especificaciones detalladas para esta aplicación y no había ninguna. La línea XX no fue la culpable.

Imprimí el código y comencé a revisarlo de arriba hacia abajo. Comencé a crear un diagrama de flujo de lo que estaba sucediendo. El código era tan complicado que apenas podía entenderlo. Dejé de tratar de hacer un diagrama de flujo. Tenía miedo de hacer cambios sin saber cómo ese cambio afectaría el resto del proceso, especialmente porque no tenía detalles de lo que hizo la aplicación o dónde estaba en la cadena de dependencia.

Entonces, decidí comenzar en la parte superior del código fuente y agregar espacios en blanco y frenos de línea para que el código sea más legible. Noté, en algunos casos, si las condiciones se combinaban ANDy ORno se distinguía claramente entre qué datos se estaban ANDeditando y qué datos se estaban OReditando. Así que empecé a poner paréntesis alrededor de los ANDy las ORcondiciones para que sean más legibles.

A medida que avanzaba lentamente para limpiarlo, periódicamente guardaba mi trabajo. En un momento intenté compilar el código y sucedió algo extraño. El error había pasado la línea de código original y ahora estaba más abajo. Así que continué, speparating el ANDy ORcondiciones con parens. Cuando terminé de limpiarlo funcionó. Imagínate.

Luego decidí visitar el taller de operaciones y preguntarles si habían instalado recientemente algún componente nuevo en el marco principal. Dijeron que sí, recientemente actualizamos el compilador. Hmmmm

Resulta que el antiguo compilador evaluó la expresión de izquierda a derecha independientemente. La nueva versión del compilador también evaluó expresiones de izquierda a derecha pero código ambiguo, lo que significa una combinación poco clara ANDy ORno se pudo resolver.

Lección que aprendí de esto ... SIEMPRE, SIEMPRE, SIEMPRE use parens para ANDcondiciones separadas y ORcondiciones cuando se usan en conjunción entre sí.

Ejemplo simplificado

IF Product = 191 OR Product = 193 AND Model = "ABC" OR Product = 201 OR Product = 202 AND Model = "DEF" ...(código lleno de varios de estos)

Esta es una versión simplificada de lo que encontré. También había otras condiciones con sentencias lógicas booleanas compuestas.

Recuerdo haberlo cambiado a:
IF ((Product = 191 OR Product = 193) AND Model = "ABC") OR ((Product = 201 OR Product = 202) AND Model = "DEF") ...



No pude reescribirlo porque no había especificaciones. El autor original ya se había ido. Recuerdo una intensa presión. Todo un buque de carga quedó varado en el puerto y no se pudo descargar porque este pequeño programa no funcionó. Sin advertencia. No hay cambios en el código fuente. Solo se me ocurrió preguntarle a las operaciones de red si modificaron algo después de que noté que agregar parens cambiaba los errores.

Michael Riley - AKA Gunny
fuente
22
Eso parece una mejor ilustración de por qué es importante tener un buen compilador.
ruakh
66
@CapeCodGunny: Estoy seguro de que no lo hiciste. Pero el problema aquí es que tuvo un mal proveedor de compiladores que realizó un cambio radical. No veo cómo aprendiste una lección para "SIEMPRE, SIEMPRE, SIEMPRE" solucionar ese problema, incluso cuando utilizas mejores compiladores.
ruakh
55
@ruakh - No, el vendedor simplemente cambió su analizador de código. Soy de la vieja escuela, no confío en mi capacidad para recordar cada sistema en el que he codificado o en el que he estado involucrado. Sin documentación, todo lo que tienes es el código fuente. Cuando el código fuente es difícil de leer y seguir, crea una situación extremadamente estresante. Los programadores que no usan espacios en blanco probablemente nunca hayan tenido que lidiar con una situación como la que me enfrentaba. También aprendí que tiene más sentido escribir código como: Ver Dick; Ver Jane; Ver Dick y Jane; Declaraciones simples que son fáciles de leer ... comentar ... y seguir.
Michael Riley - AKA Gunny
2
Gran historia, pero estoy de acuerdo en que no es una razón para usar paréntesis. y / o la precedencia es casi universal y es la cosa menos probable de cambiar que uno pueda pensar. Si no puede confiar en un comportamiento coherente para una operación tan estándar y básica, su compilador es basura y se le aplica una manguera sin importar lo que haga. Su historia es 100% un problema de compilación y 0% un problema de código. Especialmente dado que el comportamiento predeterminado era una simple evaluación de izquierda a derecha: el orden siempre sería claro, entonces, ¿por qué alguien usaría paréntesis?
77
Creo que hay lecciones aprendidas aquí en ambos lados ... Es mucho mejor usar paréntesis, especialmente cuando la alternativa se basa en el comportamiento indocumentado de un compilador con respecto al código ambiguo . Y si el programador no sabe qué expresiones son ambiguas, mejor use parens. Por otro lado, es peligroso cambiar el comportamiento de un compilador, pero al menos arrojó un error en los casos en que el comportamiento cambió. Hubiera sido peor si el compilador no hubiera arrojado un error, sino que hubiera comenzado a compilar de manera diferente. El error lo protegió de errores inadvertidos.
LarsH
18

Sí, si se mezclan 'y' y 'o'.

También es una buena idea () lo que lógicamente es un cheque.

Aunque lo mejor es usar funciones de predicado bien nombradas y desalojar la mayoría de las comprobaciones y condiciones allí, dejando si es simple y legible.

Balog Pal
fuente
66
Es cierto que es muy a AND bprobable que deba reemplazarse con una función o un valor de bool precalculado que tenga un nombre más descriptivo.
Jeff Bridgman
14

Los paréntesis son semánticamente redundantes, por lo que al compilador no le importa, pero eso es una pista falsa: la verdadera preocupación es la legibilidad y comprensión del programador.

Voy a tomar una posición radical aquí y dar un cordial "no" a los paréntesis a AND b OR c AND d. Todo programador debe saber de memoria que la precedencia en las expresiones booleanas NO> Y> O , al igual que recordar Por favor, disculpe a mi querida tía Sally por las expresiones algebraicas. La puntuación redundante solo agrega desorden visual la mayor parte del tiempo en el código sin beneficio en la legibilidad del programador.

Además, si siempre usa paréntesis en expresiones lógicas y algebraicas, entonces renuncia a la capacidad de usarlas como marcador de "algo complicado está sucediendo aquí, ¡cuidado!" Es decir, en los casos en que desea anular la precedencia predeterminada y hacer que se evalúe la suma antes de la multiplicación, o OR antes de AND, los paréntesis son una buena bandera roja para el próximo programador. Demasiado uso de ellos cuando no son necesarios, y te conviertes en el niño que lloró lobo.

Haría una excepción para cualquier cosa fuera del ámbito del álgebra (booleana o no), como las expresiones de puntero en C, donde cualquier cosa más complicada que las expresiones idiomáticas estándar como *p++o p = p->nextprobablemente debería estar entre paréntesis para mantener la desreferencia y la aritmética recta. Y, por supuesto, nada de esto se aplica a idiomas como Lisp, Forth o Smalltalk que usan alguna forma de notación polaca para las expresiones; pero para la mayoría de los idiomas principales, la precedencia lógica y aritmética está totalmente estandarizada.

dodgethesteamroller
fuente
1
+1, los paréntesis para la claridad están bien, pero ANDvs ORes un caso bastante básico que me gustaría que los otros desarrolladores de mi equipo sepan. Me preocupa que a veces "usar paréntesis para mayor claridad" sea realmente "usar paréntesis para no tener que preocuparme nunca por conocer la precedencia".
Tim Goodman
1
En todos los idiomas con los que trabajo habitualmente es .memberantes que los operadores unarios, unarios antes que los operadores binarios, *y /antes +y -antes <y >y ==antes de &&antes de ||antes de la asignación. Esas reglas son fáciles de recordar porque coinciden con mi "sentido común" acerca de cómo se usan normalmente los operadores (por ejemplo, no daría ==mayor prioridad +o dejaría de 1 + 1 == 2funcionar), y cubren el 95% de las preguntas de prioridad que tendría .
Tim Goodman
44
@TimGoodman Sí, exactamente correcto, tanto a sus comentarios. Otros respondedores aquí parecen pensar que es una pregunta en blanco o negro: use paréntesis todo el tiempo, sin excepciones, o vuele descuidadamente por el asiento de sus pantalones a través de un mar de reglas arbitrarias e imposibles de recordar, su código rebosando con posibles errores difíciles de detectar. (Metáforas mixtas muy intencionales.) Obviamente, la forma correcta es la moderación; la claridad del código es importante, pero también lo es conocer bien sus herramientas, y debería poder esperar una cierta comprensión mínima de los principios de programación y CS de sus compañeros de equipo.
dodgethesteamroller
8

Como yo lo veo:

Pros:

  • El orden de las operaciones es explícito.
  • Lo protege de futuros desarrolladores que no entienden el orden de las operaciones.

Contras:

  • Puede resultar en código desordenado y difícil de leer

NO Pros:

  • ?

SIN contras:

  • El orden de operaciones es implícito
  • El código es menos mantenible para los desarrolladores sin una buena comprensión del orden de las operaciones.
MetaFight
fuente
Bien dicho, aunque creo que "Puede resultar en código desordenado y difícil de leer" es bastante subjetivo.
FrustratedWithFormsDesigner
2
¿Cómo hacer que la semántica de su código sea explícito hace que sea difícil de leer?
Mason Wheeler
1
Estoy de acuerdo con los demás al cuestionar sus "Sí Contras". Creo que casi siempre es lo contrario.
@ Frustrado Tan subjetivo como la afirmación opuesta. Significado, en absoluto, de verdad. Simplemente difícil de medir.
Konrad Rudolph
1
@MasonWheeler: Si bien estoy de acuerdo en que los padres explícitos son muy importantes en muchos casos, puedo ver cómo uno puede exagerar al hacer explícita la semántica. Me resulta 3 * a^2 + 2 * b^2más fácil de leer que (3 * (a^2)) + (2 * (b^2)), porque el formato y la precedencia son familiares y estándar. Del mismo modo, podría (para ser extremo) prohibir el uso de funciones y macros (¡o compiladores!) Para que la semántica de su código sea más explícita. Obviamente no estoy abogando por eso, pero espero responder a su pregunta de por qué debe haber limitaciones (un equilibrio) para hacer las cosas explícitas.
LarsH
3

¿Hay algún argumento a favor o en contra que incluya paréntesis extraños? ¿La experiencia práctica sugiere que vale la pena incluirlos para facilitar la lectura? ¿O es una señal de que un desarrollador realmente necesita sentarse y confiar en los conceptos básicos de su idioma?

Si nadie más tendría que mirar mi código nuevamente, no creo que me importe.

Pero, desde mi experiencia:

  • Miro mi código nuevamente ocasionalmente (a veces años después de escribirlo)
  • Otros a veces miran mi código
    • ¡O incluso tiene que expandirlo / arreglarlo!
  • Ni yo ni el otro recordamos exactamente lo que estaba pensando al escribirlo
  • Escribir un código críptico de "minimizar el conteo de caracteres" perjudica la legibilidad

Casi siempre hago esto porque confío en mi capacidad de leer rápidamente y no cometer pequeños errores mucho más con los padres que con nada más.

En su caso, casi seguramente haría algo como:

if (a AND b) then ab = true
if (c AND d) then cd = true
If (ab OR cd) Then ...

Sí, es más código. Sí, puedo hacer operadores bool de lujo en su lugar. No, no me gusta la posibilidad de que al escanear el código 1+ años en el futuro interprete mal los sofisticados operadores bool. ¿Qué pasa si estaba escribiendo código en un idioma que tenía una prioridad AND / OR diferente y tenía que saltar hacia atrás para arreglar esto? Voy a decir: "¡Ajá! ¡Recuerdo esta pequeña cosa inteligente que hice! No tuve que incluir a los padres cuando escribí esto el año pasado, ¡qué bueno que recuerdo ahora!" si eso sucede (o peor, ¿alguien más que no estaba al tanto de esta inteligencia o fue arrojado a una situación de tipo "arreglar lo antes posible")?

La separación con () hace que sea mucho más sencillo hojear y comprender rápidamente ...

Enderland
fuente
77
Si vas a hacer eso, ¿por qué no ab = a AND b?
Eric
1
Quizás porque abpermanecerá sin cambios si no a AND b.
Armali
3

Caso general

En C #, la multiplicación y la división tienen prioridad sobre la suma y la resta.

Aún así, StyleCop, una herramienta que aplica el estilo común en toda la base de código con un objetivo adicional para mitigar el riesgo de errores introducidos por código que puede no ser lo suficientemente claro, tiene la regla SA1407 . Esta regla generará una advertencia con un código como este:

var a = 1 + 2 * 3;

Está claro que el resultado es 7y no 9, pero aún así, StyleCop sugiere poner paréntesis:

var a = 1 + (2 * 3);

Su caso particular

En su caso particular, existe una precedencia de AND en comparación con OR en el idioma particular que utiliza.

Así no se comportan todos los idiomas. Muchos otros tratan AND y OR por igual.

Como desarrollador que trabaja principalmente con C #, cuando vi su pregunta la primera vez y leí el fragmento de código sin leer lo que había escrito antes, mi primera tentación fue comentar que las dos expresiones no son iguales. Con suerte, he leído toda la pregunta por completo antes de comentar.

Esta particularidad y el riesgo de que algunos desarrolladores puedan creer que AND y OR tienen la misma prioridad hace que sea aún más importante agregar paréntesis.

No escriba código con el objetivo de demostrar que es inteligente. Escriba código con un objetivo de legibilidad, incluso por personas que pueden no estar familiarizadas con todos los aspectos del lenguaje.

Arseni Mourzenko
fuente
1
"Esto es muy poco común": según Stroustrup2013, C ++ 11 parece tener una precedencia diferente de AND y OR (p. 257). Lo mismo para Python: docs.python.org/2/reference/expressions.html
Dirk
10
Re: "Todos los idiomas que conozco tratan Y y O por igual": Dudo que sea cierto. Si es cierto, entonces no conoce ninguno de los diez lenguajes más populares (C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL y Ruby), y no está en condiciones de comentar lo que es "poco común", y mucho menos "muy poco común".
ruakh
1
Estoy de acuerdo con ruakh y busqué C ++ 11, python, matlab y java.
Dirk
3
Los lenguajes en los que AND y OR son operadores binarios, y que no tratan a AND con mayor precedencia que OR, son basura con daño cerebral cuyos autores son cobardes de informática. Esto viene de la notación lógica. Hola, ¿"suma de productos" no significa nada? Incluso hay una notación booleana que usa la multiplicación (yuxtaposición de factores) para AND y el símbolo + para OR.
Kaz
3
@ruakh Acabas de hacer mi punto por mí. El hecho de que haya un puñado de casos patológicos no significa que no deba aprender la precedencia booleana estándar y asumir que se mantiene hasta que se demuestre lo contrario. No estamos hablando de decisiones de diseño arbitrarias aquí; El álgebra booleana se inventó mucho antes que las computadoras. Además, muéstrame la especificación de Pascal de la que estás hablando. Aquí y aquí se muestra AND antes de OR.
dodgethesteamroller
1

Como todos dijeron, use paréntesis cada vez que haga que la expresión sea más legible. Sin embargo, si la expresión es complicada, recomendaría introducir nuevas funciones para las subexpresiones .

Honza Brabec
fuente
0

¿O es una señal de que un desarrollador realmente necesita sentarse y confiar en los conceptos básicos de su idioma?

Si usa estrictamente el lenguaje en singular, tal vez. Ahora tome todos los idiomas que conoce, desde los más antiguos hasta los más modernos, desde compilados hasta scripting y SQL hasta su propio DSL que ha inventado el mes pasado.

¿Recuerdas las reglas de precedencia exactas para cada uno de estos idiomas, sin mirar?

Seguro
fuente
1
Y como señaló anteriormente @Cape Cod Gunny, incluso si crees que conoces el lenguaje frío, el compilador / tiempo de ejecución podría cambiar por debajo de ti.
Jordan
0

"Debo usar paréntesis en las declaraciones lógicas, incluso cuando no sea necesario".

Sí, porque dos personas los encontrarán útiles:

  • El próximo programador, cuyo conocimiento, competencia o estilo puede ser diferente.

  • ¡El futuro usted que vuelve a este código en una fecha posterior!

Michael Durrant
fuente
-1

Los condicionales complejos son "álgebra booleana", que usted escribe de alguna manera que, bueno, lo hace ver exactamente como álgebra, y definitivamente usaría parens para álgebra , ¿no es así?

Las reglas realmente útiles son las de negación:

!(A || B) <=> !A && !B
!(A && B) <=> !A || !B

O, en un formato un poco más claro:

!(A + B) <=> !A * !B
!(A * B) <=> !A + !B

que es muy clara simplemente álgebra cuando se escribe como:

-1*(A + B) = -A + -B
-1*(A * B) = -A * -B

Pero también podemos aplicar el pensamiento para la simplificación y expansión algebraica:

(A && B) || (C && D) => 
((A && B) || C) && ((A && B) || D) => 
(AC && BC) && (AD && BD) =>
AC && BC && AD && BD

aunque en el código tienes que escribir:

(A||C) && (B||C) && (A||D) && (B||D)

o, en un formato un poco más claro:

(A + B) * (C + D) => 
((A + B) * C) + ((A + B) * D) => 
(AC + BC) + (AD + BD) =>
AC + BC + AD + BD

Básicamente, un condicional sigue siendo solo una expresión algebraica, y al usar claramente el paréntesis, puede aplicar más fácilmente las diversas reglas algebraicas que ya conoce a la expresión, incluido el antiguo concepto de "simplificar o expandir esta fórmula".

Narfanator
fuente
2
No estoy seguro de que realmente esté respondiendo la pregunta, ya que lidera su respuesta con un supuesto que no es necesariamente cierto. ¿Usaría paréntesis para álgebra? No todo el tiempo. Si ayuda con la legibilidad, entonces ciertamente, pero otros ya lo han expresado aquí. Y expandir el álgebra matemática a otras formas no tiene exactamente una correspondencia uno a uno con la programación, ¿qué sucede si está verificando el estado de algunos valores de cadena?
Derek
Si el álgebra booleana correspondiente es lo suficientemente complicado como para justificar a los padres, su condicional probablemente debería usar padres. Si es lo suficientemente simple como para no garantizar a los padres, no es necesario o no debería hacerlo. De cualquier manera, pensar en ello como lo haría con una expresión matemática probablemente aclara el problema.
Narfanator
Mis ejemplos anteriores usan dos y cuatro booleanos. Si está comprobando el estado de dos o más valores de cadena, se asigna. Cada verificación corresponde a una variable booleana; independientemente de si ese cheque es entero o igualdad de cadena; cadena, matriz o inclusión hash; una expresión compleja en sí misma ... No importa; Lo único que importa es que tienes más de una medida de verdadero / falso en tu expresión.
Narfanator
2
Sólo nitpicking, pero en !(A + B) <=> !A + !By -1*(A + B) = -A + -Bno debe el operador se han volteado a partir +de *la segunda expresión?
Jeff Bridgman
-1

Usaré paréntesis, incluso si es opcional, porque ayuda a comprender mejor a todos, tanto para el que escribe el código como para el que está listo para ver ese código. En su caso, incluso los operadores booleanos tienen prioridad, podría funcionar bien al principio, pero no podemos decir que lo ayudará en todos los casos. así que prefiero usar paréntesis en cualquier condición que pueda requerirlo u opcionalmente.

Singa Selva Sankar
fuente
-1

Si. Debe usarlo en cualquier caso cuando considere que su código será más claro. Recuerde que su código debe ser lo suficientemente claro para que otros puedan entenderlo sin leer sus comentarios dentro del código. Por lo tanto, es una buena práctica usar paréntesis y llaves. También tenga en cuenta que puede depender de la práctica particular de su empresa / equipo. Simplemente mantenga un enfoque y no mezcle.

DesarrolladorArnab
fuente