¿Qué es un efecto secundario en la programación?

Estrictamente hablando, si un programa / función modifica el estado de otra cosa (fuera de su propio alcance), entonces está produciendo un efecto secundario. Esto podría incluir algo así como “mostrar un personaje en la pantalla”, o podría estar cambiando el valor almacenado en alguna ubicación RAM arbitraria, o algo similar.

Algunas de esas cosas son malas ideas (por ejemplo, la modificación de variables globales o, peor, el ajuste de un valor guardado en la memoria RAM en alguna ubicación arbitraria). Otros son casi imposibles de evitar: es posible que su programa no pueda “funcionar” si no se “permite” cambiar algo en la pantalla. O, ¿qué pasaría si quisiera guardar algún estado de su programa para persistencia, es decir, guardarlo en un disco?

Por esta razón, la mayoría de los programadores ignoran los casos en los que los efectos secundarios son inevitables. Tienden a considerar solo aquellos que pueden evitarse como efectos secundarios “prácticos”, que deben evitarse por preferencia.

La regla es (o debería ser): ¿se puede evitar el efecto utilizando en su lugar otros medios? Si no, entonces úselo. Si puede, ¿existe una razón decente para usarla en lugar de una alternativa? De lo contrario, evitarlo como la peste.

Considere el siguiente programa:

int glob = 0;
int square (int x)
{
glob = 1;
devolver x * x;
}
int main ()
{
int res;
glob = 0;
res = cuadrado (5);
res + = glob;
devolver res;
}

Al mirar el programa principal solamente, uno supondría que el programa devuelve el valor 25. Pero, de hecho, el programa devuelve el valor 26.

El motivo es durante la llamada al cuadrado de función (5), no solo devuelve el valor 25, sino que también modifica la variable global glob. Este es un “efecto secundario”.

Se considera una mala práctica escribir programas que dependen de los efectos secundarios, porque es difícil mantener dichos programas.

Los efectos secundarios ocurren con mucha frecuencia en tareas de programación comunes, en tan simple como el operador ++. El código:

++ i

que parece inofensivo tiene el efecto secundario no solo de devolver el valor de (i + 1), sino también de incrementar su valor original. También he visto efectos secundarios en setters, por ejemplo:

establecer el valor (newVal) {
this._value = newVal;
this.log (‘El valor ha sido cambiado a:’ + newVal);
}

Escribimos códigos como este todos los días. En términos generales, un efecto secundario es una función que depende o interactúa con una fuente externa, ya sea una variable, estructura de datos, consola, un archivo de registro, página HTML, base de datos, cookies, etc., etc.

En el diseño orientado a objetos, algunos efectos secundarios se consideran malas prácticas, otros se aceptan. En el mundo de la programación funcional, te enseñan a evitarlos tanto como sea posible, a favor de las funciones puras. En caso de que necesite interactuar con cualquiera de estos artefactos, lo mejor es aislar la interacción en su propia función o módulo. Usted hace esto para que pueda separar su lógica comercial (por lo tanto, las pruebas de su unidad) del código que lee y escribe en cualquiera de estas fuentes. Hace que su código sea más robusto y menos propenso a errores.

Una función toma parámetros y devuelve un resultado. Si una función es “pura”, devuelve el mismo resultado cada vez para un conjunto determinado de parámetros. Si no, se ha visto afectado por un efecto secundario o estado externo a la función. Además, si una función cambia algún otro estado externo a la función, se dice que ha causado un efecto secundario.

Ejemplos de efectos colaterales podrían ser el establecimiento de estado, la salida a la pantalla, el archivo de entrada / salida. Las funciones que no tienen efectos secundarios y que no se ven afectadas por efectos secundarios externos tienen propiedades muy útiles.

Cualquier cosa que pueda influir en el resultado de otra cosa, incluida la evaluación futura de la misma expresión.

La evaluación de una expresión cerrada que no tiene efectos secundarios:
– No ser influenciado por la eventual evaluación previa de ninguna expresión.
– No influir en el resultado de futuras evaluaciones de la misma expresión cerrada.
– No influir en el resultado de la evaluación futura de ninguna otra expresión.

En particular, evaluar una expresión libre de efectos secundarios una vez es totalmente equivalente a evaluarlo varias veces.

Creo que los ” efectos secundarios ” se describirían mejor como efectos útiles . Básicamente , los efectos secundarios son los resultados de la ejecución de un programa que son visibles externamente. Un programa ” puro “, uno sin efectos secundarios, realiza un cálculo, pero luego no puede hacer nada con el resultado (realmente muy inútil).