¿Cuál es el beneficio de la programación orientada a objetos con estructuras de datos inmutables y funciones referencialmente transparentes?

La transparencia referencial y la inmutabilidad hacen que los programas sean mucho más fáciles de razonar. Los programas que son más fáciles de razonar pueden paralelizarse más fácilmente, verificarse más completamente en el momento de la compilación y son más fáciles de depurar, uno al que está acostumbrado. Esto es cierto tanto si los programas también están orientados a objetos como si no: las dos cosas son realmente ortogonales entre sí.

Los detalles de la pregunta plantean algunas preguntas adicionales interesantes. En primer lugar, para aclarar una confusión, si los datos son inmutables, no importa si se copian o no: la diferencia entre pasar por valor y pasar por referencia es un detalle de implementación si no puede modificar los datos de todos modos. Debido a que se implementa en la JVM, Scala en realidad usa pase por referencia, por lo que no es cierto que se copien muchos datos.

La transmisión de mensajes es una idea asociada con la orientación a objetos, pero que no es necesaria. Al pasar mensajes, las entidades que pasan mensajes de un lado a otro deben cambiar de estado, es fundamental para el modelo. Si va a pasar mensajes, debe modelar ese cambio de estado de alguna manera. No puede hacer esto si desea pasar mensajes entre objetos Scala viejos y simples y desea que se implementen de una manera referencialmente transparente. Scala tiene bibliotecas de actores que utilizan el paso de mensajes, pero obviamente dependen del estado mutable. Puede usar una mónada de estado (no común en Scala) para modelar el mensaje que pasa entre objetos inmutables, pero esto no se parece mucho al estilo normal orientado a objetos.

Esto es algo de mi interés.

1. Encapsulación y abstracción de datos
2. Enlace dinámico
3. Clases y objetos
4. Herencia (probablemente la más importante a largo plazo)
5. Comunicación de mensajes

Puede buscar en Google estos temas anteriores en detalle para obtener más información. Agregue mi respuesta en los comentarios si cree que hay más. (definitivamente hay más, solo podría pensar en esto)

Esta es esencialmente la idea detrás del patrón de Abastecimiento de eventos: Abastecimiento de eventos

Al reificar los cambios en el modelo como datos, puede obtener auditorías de forma gratuita. También es muy útil para diseñar protocolos de sincronización (como DeltaSync), especialmente si tiene reglas dependientes del dominio para la resolución de conflictos. Esto también es una desventaja: ahora está exponiendo esencialmente lo que hace su base de datos internamente (registro de transacciones) como parte de su propio código.

El beneficio más importante de las estructuras de datos inmutables es que trabajar con ellas es seguro para subprocesos; si desea modificarlos, deberá crear una copia y trabajar en la copia, una copia que es, en sí misma, ‘segura para subprocesos’.

La seguridad de subprocesos le brinda la ventaja de poder escalar rápidamente en múltiples subprocesos. Por lo tanto, si desarrolla con la inmutabilidad de las estructuras de datos en mente, podrá construir soluciones que se escalen fácil y correctamente en múltiples procesadores.

No es exactamente una respuesta a su pregunta, pero podría ser útil: los objetos deberían ser inmutables Los objetos inmutables son mucho más efectivos en muchas situaciones, especialmente en la programación orientada a objetos.