¿Por qué es tan importante la inmutabilidad en el desarrollo de software?

Las estructuras de datos inmutables son una técnica importante para reducir los errores de software, y lo hacen simplemente estando muy limitados sobre lo que puede hacer con ellos. Hay una y solo una cosa que se puede hacer con una estructura de datos inmutable: los datos se pueden leer de ella.

En casi todos los idiomas, una operación de lectura no tiene ningún efecto secundario (es decir, no causa que suceda nada). Se puede realizar una operación de lectura en cualquier momento. Se puede hacer repetidamente. O no se puede hacer en absoluto, si el resultado no es necesario.

Por el contrario, piense en todas las cosas que se pueden hacer con una estructura de datos mutable. Las estructuras de datos mutables típicas admiten múltiples operaciones. Estos son solo algunos de los detalles que debe tener en cuenta:

  1. ¿Qué hace una operación? ¿Qué le hace la operación a la estructura de datos? ¿Qué le hace la operación al medio ambiente?
  2. ¿Cuándo puedes realizar una operación? ¿Siempre puedes realizar la operación? ¿O solo bajo circunstancias específicas?
  3. ¿En qué orden deben realizarse las operaciones? ¿Quizás initialize() siempre debe llamarse antes de start() ?
  4. ¿Cuántas veces se pueden realizar operaciones? Quizás initialize() solo se puede llamar una vez. O tal vez se puede llamar una vez por cada vez que se llama a reset() .
  5. ¿Se necesita realizar una operación? Si no planea llamar a start() , ¿aún necesita llamar a initialize() ?

¿Qué tan bien puede responder estos detalles sobre una estructura de datos mutable que está utilizando? ¿Están estos detalles completamente documentados? En la gran mayoría de los casos, estos detalles están muy poco documentados y entendidos. Las estructuras de datos inmutables no tienen ese problema.

Es por eso que aunque diseñé Stanza (LBStanza) para soportar completamente las estructuras de datos mutables, animo a mis alumnos a usarlas con moderación y solo después de haber pensado mucho en los detalles anteriores.

– Patrick

Cada respuesta aquí es correcta y está llena de información. Quizás un poco demasiada información. Déjame probarlo lo más corto posible:

El estado mutable compartido es malo.

‘Malo’ puede ser subjetivo porque hay código que usa un estado mutable compartido sin errores y un código que no usa datos compartidos o solo usa datos inmutables.

La mayoría de los lenguajes de programación no fueron diseñados para prevenir tales errores, por lo que la inmutabilidad es una forma económica de tratarlo.

Pero la mayoría no significa todo. Take Rust: en mi opinión, el primer lenguaje de los lenguajes de programación de próxima generación. Rust tiene construida la inmutabilidad (incluso es una opción de exclusión, lo que es genial), pero Rust hace que sea imposible (sin usar la palabra clave “insegura”) compartir los mismos datos para múltiples escritores. Siempre hay un solo escritor activo en un segmento de datos. Esto es algo importante porque le permite alejarse de la inmutabilidad (lo que requiere muchas copias de memoria Y una gran cantidad de administración de memoria, causando principalmente la sobrecarga de GC en los lenguajes de GC).

Porque limita tus opciones como programador.

Ahora solo puede crear y leer la variable. No puedes sobrescribirlo. Necesitas una nueva variable para eso.

Otras respuestas le explicaron por qué la inmutabilidad podría ser algo bueno para cualquier proyecto. La verdad es que cuando tienes un proyecto grande, a menudo es una buena idea imponer algunas restricciones. Si observa los lenguajes modernos, se trata de imponer restricciones de una manera que no interfiera con la programación.

Y al elegir el idioma, también tiene una opción: el idioma que impone las restricciones para usted o el que le permite imponerlas usted mismo.

La característica de inmutabilidad es importante al menos por estas razones:

  • Hace que el cálculo de subprocesos múltiples [1] sea más seguro
  • Hace que el cálculo distribuido [2] sea más seguro
  • Obliga a una sola fuente de verdad [3]

Cada viñeta podría ser un tema para un libro.

Espero que esto ayude.

Notas al pie

[1] Hilo (informática) – Wikipedia

[2] Computación distribuida – Wikipedia

[3] Fuente única de verdad – Wikipedia

La inmutabilidad es un concepto simple pero muy importante en el desarrollo de software.

Digamos que tenemos una cadena en Java, supongamos que contiene una información que será utilizada por varios métodos eventualmente codificados por diferentes personas, ¿cómo puede estar seguro de que el valor inicial de este objeto no cambió? Es porque String es inmutable en Java.

Muchos errores se originan al usar objetos mutables cuando inmutable es la mejor opción, después de miles de líneas podría cambiar algunos objetos cuando cree que está trabajando en una copia.

En un gran proyecto agradecerás a Dios que exista la inmutabilidad.

Además de lo que ya se ha dicho en otras respuestas, el aspecto importante de la inmutabilidad es que nos permite usar lenguajes de programación de la misma manera que usamos nuestros idiomas étnicos.

Nuestros cerebros generalmente tienen mucha práctica en el uso del lenguaje, y si lo piensa, verá que la noción de mutación estatal simplemente no tiene sentido para un lenguaje natural. Tomemos, por ejemplo, la siguiente cita del documento La inmutabilidad lo cambia todo:

Los conjuntos de datos muestran un prisma semántico inmutable, incluso si la representación subyacente se aumenta o se reemplaza por completo.

La Biblia King James es personaje por personaje inmutable; incluso cuando está impreso en una fuente diferente; incluso cuando está digitalizado; incluso cuando se acompaña de una imagen diferente.

Y dado que somos bastante buenos para razonar sobre hechos, pero bastante terribles para razonar sobre el estado mutante (que a menudo nos toma por sorpresa y socava algunos de nuestros supuestos), es mejor hacer un uso de las cosas en las que somos buenos, en lugar de que los que no somos.

More Interesting

¿Cuáles son algunos trucos de depuración para corregir errores en soluciones empresariales con miles de líneas / archivos de código que no escribió?

¿Qué podría haber sido una alternativa a los "archivos" tal como los conocemos hoy?

¿Cuál es la mejor manera de ejecutar los servicios de Python?

¿Cuáles son algunos buenos softwares de monitoreo de empleados que graban pulsaciones de teclas o capturan imágenes en la pantalla?

¿Dónde puedo encontrar probadores de control de calidad independientes en Canadá?

Cómo mostrar el nombre del paquete de una clase usando UML

¿Cuál es la configuración ideal de una computadora portátil / software de Windows para un adolescente que aprende a codificar juegos en C ++?

Cómo convertirse en un psicópata informático

¿Cómo debemos lidiar con las suites de prueba de larga duración?

¿Cuáles son algunos de los trabajos de desarrollo de Python en empresas como Google, Amazon y Microsoft? ¿Cómo se debe preparar para ellos?

Durante la programación independiente, ¿debo seguir las mejores prácticas de programación, como usar la arquitectura MVC? ¿Qué sucede si no lo uso y aún se ejecuta mi código?

¿Cómo se pueden reducir los costos de desarrollo de software mediante el uso de comentarios?

En ingeniería de software, ¿deberían incluirse requisitos no funcionales en la cartera de pedidos de un producto?

¿Debo tomar las pruebas de software como especialidad en informática, o es algo que acabas de aprender en la industria?

¿Agile está muerto?