Tiene estado cuando asocia valores (números, cadenas, estructuras de datos complejas) a una identidad y un punto en el tiempo.
Por ejemplo, el número 10 por sí solo no representa ningún estado: es solo un número bien definido y siempre será él mismo: el número natural 10. Como otro ejemplo, la cadena "HOLA" es una secuencia de cinco caracteres, y se describe completamente por los caracteres que contiene y la secuencia en que aparecen. En cinco millones de años a partir de ahora, la cadena "HOLA" seguirá siendo la cadena "HOLA": un valor puro.
Para tener un estado, debes considerar un mundo en el que estos valores puros estén asociados a algún tipo de entidades que poseen una identidad . La identidad es una idea primitiva: significa que puede distinguir dos cosas independientemente de cualquier otra propiedad que puedan tener. Por ejemplo, dos autos del mismo modelo, del mismo color, ... son dos autos diferentes.
Dadas estas cosas con identidad, puede adjuntarles propiedades, descritas por valores puros. Por ejemplo, mi auto tiene la propiedad de ser azul. Puede describir este hecho asociando el par
("colour", "blue")
a mi auto El par ("color", "azul") es un valor puro que describe el estado de ese automóvil en particular.
El estado no solo está asociado a una entidad particular, sino también a un punto particular en el tiempo. Entonces, puedes decir que hoy mi auto tiene estado
("colour", "blue")
Mañana lo tendré repintado en negro y el nuevo estado será
("colour", "black")
Tenga en cuenta que el estado de una entidad puede cambiar, pero su identidad no cambia por definición. Bueno, mientras exista la entidad, por supuesto: se puede crear y destruir un automóvil, pero mantendrá su identidad durante toda su vida. No tiene sentido hablar sobre la identidad de algo que aún no existe / nunca más.
Si los valores de las propiedades adjuntas a una entidad dada cambian con el tiempo, usted dice que el estado de esa entidad es mutable . De lo contrario, dices que el estado es inmutable .
La implementación más común es almacenar el estado de una entidad en algún tipo de variables (variables globales, variables miembro de objeto), es decir, almacenar la instantánea actual de un estado. El estado mutable se implementa utilizando la asignación: cada operación de asignación reemplaza la instantánea anterior por una nueva. Esta solución normalmente usa ubicaciones de memoria para almacenar la instantánea actual. Sobrescribir una ubicación de memoria es una operación destructiva que reemplaza una instantánea con una nueva. ( Aquí puede encontrar una charla interesante sobre este enfoque de programación orientado al lugar ).
Una alternativa es ver los estados subsiguientes (historial) de una entidad como una secuencia (posiblemente secuencia infinita) de valores, ver, por ejemplo, el Capítulo 3 del SICP . En este caso, cada instantánea se almacena en una ubicación de memoria diferente, y el programa puede examinar diferentes instantáneas al mismo tiempo. Las instantáneas no utilizadas se pueden recolectar basura cuando ya no se necesitan.
Ventajas / desventajas de los dos enfoques.
- El Enfoque 1 consume menos memoria y permite construir una nueva instantánea de manera más eficiente ya que no implica copia.
- El enfoque 1 empuja implícitamente el nuevo estado a todas las partes de un programa que tiene una referencia al mismo, el enfoque 2 necesitaría algún mecanismo para enviar una instantánea a sus observadores, por ejemplo, en forma de un evento.
- El Enfoque 2 puede ayudar a prevenir errores de estado inconsistentes (por ejemplo, actualizaciones de estado parciales): al definir una función explícita que produce un nuevo estado a partir de uno antiguo, es más fácil distinguir entre instantáneas producidas en diferentes momentos.
- El Enfoque 2 es más modular, ya que permite producir fácilmente vistas sobre el estado que son independientes del estado mismo, por ejemplo, utilizando funciones de orden superior como
map
y filter
.