Pregunta

Preguntas relacionadas : beneficios del uso de la evaluación de cortocircuito , ¿Por qué un lenguaje no utilizar cortocircuito evaluación? , puede alguien explicar esta línea de código por favor? (Logic & Operadores de asignación)

Hay preguntas sobre los beneficios de una lengua utilizando el código de cortocircuito, pero me pregunto ¿cuáles son los beneficios para un programador? ¿Es sólo que puede hacer que el código un poco más concisa? O hay razones de rendimiento?

No estoy preguntando por situaciones en las dos entidades necesitan ser evaluados de todas formas, por ejemplo:

if($user->auth() AND $model->valid()){
  $model->save();
}

Para mí, el razonamiento no está claro -. Ya que ambos necesitan para ser verdad, puede omitir la validación de los modelos más costosos si el usuario no puede guardar los datos

Esto también tiene un (a mí) propósito obvio:

if(is_string($userid) AND strlen($userid) > 10){
  //do something
};

Debido a que no sería prudente llamar strlen() con un valor distinto de cadena.

Lo que me pregunto es sobre el uso del código de cortocircuito cuando no afecta a cualquier otra declaración. Por ejemplo, desde la página de índice predeterminado de aplicaciones Zend:

defined('APPLICATION_PATH')
 || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

Esto podría haber sido:

if(!defined('APPLICATION_PATH')){
  define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}

o incluso como una sola instrucción:

if(!defined('APPLICATION_PATH'))
  define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

Así que ¿por qué utilizar el código de cortocircuito? Sólo por el factor 'frialdad' de la utilización de operadores lógicos en lugar de las estructuras de control? Para consolidar if anidadas? Porque es más rápido?

¿Fue útil?

Solución

Para los programadores, el beneficio de una sintaxis menos detallado sobre otra sintaxis más detallado puede ser:

  • menos para escribir, por lo tanto una mayor eficiencia de codificación
  • menos a leer, por lo tanto, una mejor capacidad de mantenimiento.

Ahora sólo estoy hablando cuando la sintaxis menos detallado no es complicado o inteligente en modo alguno, de la misma forma reconocida de hacerlo, pero en un menor número de caracteres.

A menudo cuando vea construcciones específicas en un idioma que se desea utilizar el idioma que podría tener, pero no necesariamente siquiera se da cuenta que antes. Algunos ejemplos de la parte superior de mi cabeza:

  • clases anónimas internas en Java en lugar de pasar un puntero a una función (de manera más líneas de código).
  • en Ruby, el operador || =, para evaluar una expresión y asignar a ella si se evalúa como falsa o es nulo. Claro, usted puede lograr lo mismo por 3 líneas de código, pero ¿por qué?
  • y muchos más ...

Otros consejos

Lo utilizan para confundir a la gente!

No sé PHP y nunca he visto un cortocircuito utilizarse fuera de un si o mientras condición en la familia de las lenguas C, pero en Perl es muy idiomática decir:

open my $filehandle, '<', 'filename' or die "Couldn't open file: $!";

Una de las ventajas de tener todo en una sola afirmación es la declaración de variables. De lo contrario, tendría que decir:

my $filehandle;
unless (open $filehandle, '<', 'filename') {
    die "Couldn't open file: $!";
}

Es difícil afirmar que el segundo es más limpio que en ese caso. Y sería prolijo todavía en una lengua que no tiene unless

Creo que su ejemplo es para el factor de frialdad. No hay razón para escribir código de esa manera.

EDIT: No tengo ningún problema con hacerlo por razones idiomáticas. Si todos los demás que utiliza un lenguaje utiliza la evaluación de cortocircuito para que las entidades de los estados-como que todo el mundo entiende, entonces también debería. Sin embargo, mi experiencia es que el código de ese tipo rara vez está escrita en lenguajes C-familia; la forma apropiada es sólo para usar la frase "si" como algo normal, que separa el condicional (que presumiblemente no tiene efectos secundarios) de la llamada a la función que los controles condicionales (que presumiblemente tiene muchos efectos secundarios).

operadores cortocircuito puede ser útil en dos circunstancias importantes que aún no se han mencionado:

Caso 1 . Supongamos que tenemos un puntero que puede o no puede ser NULL y que quería comprobar que no se NULL, y que lo que señaló que no era 0. Sin embargo, debe no eliminar la referencia al puntero si es NULL. Sin operadores de cortocircuito, que tendría que hacer esto:

if (a != NULL) {
  if (*a != 0) {
    ⋮
  }
}

Sin embargo, los operadores de cortocircuito permiten escribir esto de forma más compacta:

if (a != NULL && *a != 0) {
  ⋮
}

con la certeza de que va a *a no se evaluará si es a NULL.

Caso 2 . Si desea establecer una variable a un valor que no sea falsa regresar de una de una serie de funciones, sólo tiene que hacer:

my $file = $user_filename ||
           find_file_in_user_path() ||
           find_file_in_system_path() ||
           $default_filename;

Esto establece el valor de $file a $user_filename si está presente, o el resultado de find_file_in_user_path(), si es verdad, o ... así sucesivamente. Esto se ve quizás más a menudo en Perl que C, pero he visto que en C.

Hay otros usos, incluyendo los ejemplos más bien artificiales, que usted cita anterior. Pero son una herramienta útil, y uno que me he perdido al programar en lenguajes menos complejos.

En cuanto a lo que Dan dijo, yo creo que todo depende de las convenciones de cada lenguaje de programación. No puedo ver ninguna diferencia, por lo que hacer todo lo que es idiomático en cada lenguaje de programación. Una cosa que podría hacer una diferencia que viene a la mente es si tiene que hacer una serie de controles, en ese caso el estilo cortocircuito sería mucho más claro que la alternativa si el estilo.

¿Y si tuviera una función caro llamar (se refiere a rendimiento) que devuelve un valor lógico en el lado derecho que sólo quería llamado si otra condición era verdadera (o falsa)? En este caso Corto circuiting le ahorra muchos ciclos de CPU. Que hace que el código sea más conciso debido al menor número if anidadas. Así, por todas las razones que se enumeran al final de su pregunta.

La verdad es en realidad el rendimiento. Un cortocircuito se utiliza en los compiladores para eliminar el código muerto ahorro en tamaño del archivo y la velocidad de ejecución. En tiempo de ejecución cortocircuitos no ejecuta la cláusula que queda en la expresión lógica si su resultado no afecta a la respuesta, la aceleración de la evaluación de la fórmula. Estoy luchando para recordar un ejemplo. por ejemplo

A y B y c

Hay dos términos en esta fórmula evaluados de izquierda a derecha.

Si A y B se evalúa como falsa entonces la siguiente expresión y c pueden ser o bien FALSO Y VERDADERO o FALSO Y FALSE. Tanto como resultado false, no importa cuál es el valor de c. Por lo tanto, el compilador no incluye y C en el formato compilado por lo tanto, un cortocircuito en el código.

Para responder a la pregunta hay casos especiales cuando el compilador no puede determinar si la expresión lógica tiene una salida constante y por lo tanto no sería un cortocircuito en el código.

Piénsalo de esta manera, si usted tiene una declaración como

if( A AND B )

A es probable que si devuelve FALSE solo jamás desea evaluar B en casos especiales raras. Por esta razón no usar corto evaluación ciruit es confuso.

Evaluación cortocircuito también hace que el código sea más legible para impedir otra muesca entre corchetes y los soportes tienen una tendencia a tener sentido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top