En la mayoría de los lenguajes OOP, los objetos son generalmente mutables con un conjunto limitado de excepciones (como, por ejemplo, tuplas y cadenas en python). En la mayoría de los lenguajes funcionales, los datos son inmutables.
Tanto los objetos mutables como los inmutables traen una lista completa de ventajas y desventajas propias.
Hay lenguajes que intentan casar ambos conceptos como, por ejemplo, scala, donde tienes (explícitamente declarado) datos mutables e inmutables (corrígeme si estoy equivocado, mi conocimiento de scala es más que limitado).
Mi pregunta es: ¿la inmutabilidad completa (sic!), Es decir, ningún objeto puede mutar una vez que se ha creado, ¿tiene algún sentido en un contexto OOP?
¿Hay diseños o implementaciones de tal modelo?
Básicamente, ¿son la inmutabilidad (completa) y los opuestos de OOP u ortogonales?
Motivación: en OOP, normalmente opera con datos, cambiando (mutando) la información subyacente, manteniendo referencias entre esos objetos. Por ejemplo, un objeto de clase Person
con un miembro que hace father
referencia a otro Person
objeto. Si cambia el nombre del padre, esto es inmediatamente visible para el objeto hijo sin necesidad de actualización. Al ser inmutable, necesitaría construir nuevos objetos tanto para el padre como para el hijo. Pero tendría mucho menos kerfuffle con objetos compartidos, subprocesos múltiples, GIL, etc.