Para ser un poco más claro, afirmaré que he pasado mucho tiempo con diferentes idiomas. Pero hasta ahora ha sido o lo usará todo el tiempo o no lo soportará en absoluto.
Ahora el trabajo me tiene comenzando en proyectos que requieren VB.net y veo que lo proporciona en ambos sentidos en términos de AND y ANDALSO . El primero no tiene corto circuito, y el segundo sí.
¿Entonces esto me lleva a preguntarme por qué? Como configurarlo de esta manera parece implicar que surgiría con bastante frecuencia que uno querría cambiar de modo. Pero no puedo pensar en ninguna situación en la que sería malo usar Short Circuit .
Sé que esto podría entrar en una opción más, así que si necesito poner esto en otro lugar, solo díganme dónde.
Aunque espero que haya al menos una respuesta oficial, en cuanto a por qué tener ambas opciones sería mejor que siempre hacer Cortocircuito , cuando esté disponible.
fuente
Respuestas:
Algunos términos en una expresión lógica pueden tener efectos secundarios. A veces es necesario asegurarse de que todos los efectos secundarios sucedan en el orden establecido, y que ninguno se omita y es el resultado de la evaluación el que guía la lógica:
En otros casos, no desea evaluar ninguno de los términos restantes si una evaluación anterior devuelve falso.
Algunos habrán / habrán argumentado que confiar en el comportamiento de cortocircuito en el segundo ejemplo es una mala forma, pero eso está entrando en el estilo de codificación y los sistemas de creencias. Hay muchos fragmentos de código muy buenos en el mundo que se basan en casi todas las características que proporciona un lenguaje, y así son las cosas.
ANDALSO de VB es crujiente y parece ser un intento de hacer que la práctica sea más aceptable.
Como JimmyJames señala en su respuesta, puede haber implicaciones de rendimiento medibles en torno a la evaluación de cortocircuito. Los lenguajes que no proporcionan el mecanismo, siempre evalúan todos los términos de la expresión, mientras que los que sí lo hacen, pueden generar declaraciones de ramificación adicionales. De cualquier manera, mucho depende de la cantidad de pasos de procesamiento necesarios para evaluar cada uno de los términos y también de las arquitecturas del compilador y la CPU. Normalmente no le importarían tales cosas hasta que tenga un cuello de botella medido en el código y necesite averiguar cómo aliviarlo. Cualquier regla de hacer o no con respecto a permitir la evaluación de cortocircuito en su código tendría aproximadamente la misma probabilidad de causar un código más lento y la optimización temprana puede ser una pérdida total de tiempo, por lo que siempre mida y luego optimice.
fuente
if
condición y aún cortocircuito. Estoy de acuerdo en que es, de alguna manera, una distinción estilística, pero tiene la virtud de hacer que las cosas sean claras como el cristal.Aparentemente, su pregunta no se trata de que el cortocircuito sea bueno o malo en general, sino de por qué VB.NET proporciona operadores con y sin él. Con esto en mente, la respuesta a
es simplemente: cuando viola la compatibilidad con versiones anteriores .
Bien, ahora puede decir que VB.NET no es muy compatible con versiones anteriores de VB6 o VBA, sin embargo, al menos ciertas partes del lenguaje lo son. La decisión de Microsoft de mantener la antigua semántica AND y OR (sin cortocircuito) hizo que fuera menos probable que ocurriera una gran categoría de errores al portar viejos programas VB a VB.NET.
Por otro lado, los diseñadores de lenguaje VB.NET probablemente compartieron su opinión sobre los cortocircuitos como algo bueno. Cuando recuerdo correctamente, las primeras versiones preliminares de VB.NET proporcionaron operadores AND u OR con cortocircuito, pero los comentarios del desarrollador deben haber sido tan malos que MS retiró esta decisión antes de que apareciera VB.NET 1.0. Entonces, los diseñadores decidieron implementarlo en términos de nuevas palabras clave
ANDALSO
yORELSE
como una compensación entre la compatibilidad y la utilidad hacia atrás.En mi humilde opinión, fue una buena decisión. Tuve que portar varios programas antiguos en la última década, y no tener que hacer un análisis de impacto pesado para cada expresión lógica, incluyendo AND y / u OR (juego de palabras) hizo que esa tarea fuera mucho más fácil y más económica. Por otro lado, cada vez que tengo que escribir una nueva expresión lógica en VB.NET, mi elección predeterminada para los operadores son las formas de cortocircuito, que es a lo que estoy acostumbrado desde C, C ++, C #, etc., y permite yo escribir varios modismos en forma más concisa (incluso si ANDALSO necesita 4 caracteres más para escribir).
Si no está convencido, le recomiendo leer el excelente artículo de Joel Spolsky sobre los auriculares marcianos , que explica por qué las primeras decisiones de diseño en el desarrollo de software no se pueden revocar fácilmente después de que el componente o lenguaje o API en juego haya alcanzado una base de usuarios de cierto tamaño .
fuente
And
operación no hace corto circuito, ni lo hace en SQL (1974), ni FORTRAN (1956), ni Pascal (1970).Se vuelven malas , tan pronto como comienza a confiar en los efectos secundarios de las expresiones que espera ejecutar en la evaluación de un resultado general booleano.
fuente
Advertencia : Esto es un poco esotérico, ya que en casi todos los casos, los desarrolladores no deberían preocuparse por eso. Pero ... puede haber un impacto en el rendimiento debido a la evaluación condicional, ya que crea ramificaciones en la ejecución. Una operación sin cortocircuito no se ramifica y es más predecible.
La razón por la que esto rara vez importa es que el costo suele ser pequeño y también suele ser mayor que el costo de evaluar la segunda (o tercera, etc.) condición. Esto solo importará en rutinas computacionalmente costosas cuando se requiera un alto rendimiento y aún así podría no importar.
fuente
Pascal no definió si AND y OR utilizan la evaluación de cortocircuito o no, dándote lo peor de ambos mundos.
C y C ++ tienen operaciones bit a bit & y | que en la práctica le brindan operaciones sin cortocircuito. Y los compiladores son libres de evaluar lo que quieran si no hay una diferencia observable.
fuente