2011-08-06 11 views
11

Veo una gran cantidad de temas relacionados con la programación funcional mencionar actualizaciones destructivas. Entiendo que es algo similar a la mutación, así que entiendo la parte de actualización. Pero, ¿cuál es la parte destructiva? ¿O estoy simplemente pensando demasiado?¿Qué es una actualización destructiva?

+2

Como ejemplo: una actualización destructiva sería ordenar una lista en el lugar, mientras que una no destructiva sería crear una copia ordenada. Destructivo sería cambiar un elemento de matriz, una propiedad de objeto ... cualquier cosa que actúe sobre el objeto/datos originales. –

Respuesta

15

Probablemente esté pensando demasiado. La mudabilidad es todo lo que hay para eso; lo único que se "destruye" es el valor anterior de lo que haya mutado.

Supongamos que está utilizando algún tipo de árbol de búsqueda para almacenar valores y desea insertar uno nuevo. Después de encontrar el lugar en el que los nuevos valores se va, usted tiene dos opciones:

  • con un árbol inmutable, que la construcción de nuevos nodos a lo largo de la ruta desde el nuevo valor hasta la raíz. Los subárboles que no se encuentran a lo largo de la ruta se reutilizan en el nuevo árbol, y si todavía tiene una referencia a la raíz del árbol original, puede usar ambos, con los subárboles comunes compartidos entre ellos. Esto ahorra espacio sin esfuerzo adicional si tiene muchas copias ligeramente diferentes flotando, y por supuesto tiene todos los beneficios habituales de las estructuras de datos inmutables.

  • Con un árbol mutable, se adjunta el nuevo valor donde pertenece y eso es todo; nada más tiene que ser cambiado. Esto es casi siempre más rápido, y economiza la asignación de memoria si solo tiene una copia, pero cualquier cosa que tuviera una referencia al árbol "viejo" ahora tiene una referencia a la nueva. El original ha sido destruido; se ha ido para siempre Si necesita conservar el original, debe evitar la creación de una copia completamente nueva de todo antes de cambiarlo.

Si "destrucción" parece una manera innecesariamente duras para describir un simple actualización en el lugar, entonces usted probablemente no pasaba tanto tiempo como he depuración de código con el fin de averiguar dónde en la Tierra algún valor está siendo cambiado a tus espaldas.

+1

¡Bien dicho! Aunque no creo que sea tan destructivo como duro. Simplemente me pareció redundante. Siempre pensé en la actualización como una mutación de todos modos. Pero supongo que destructivo agrega el muy necesario énfasis y precaución al término. :-) – Plumenator

+3

@Plumenator: Sí. La "actualización" es muy futurista y optimista, pero las desventajas de la mutabilidad casi siempre involucran cuestiones de lo que las cosas * fueron *, no lo que son ahora. Así que el término "actualización destructiva" es bueno para equilibrar las cosas y dejar en claro que ambos están cruzando puentes y quemándolos detrás de ustedes. –

Cuestiones relacionadas