¿Qué es el estado, el estado mutable y el estado inmutable?

31

Esta es una pregunta para principiantes, pero no pude encontrar una respuesta suficiente para novatos en Google.

¿Qué quiere decir la gente cuando dice 'estado', en la programación en general, y en la programación OO específicamente?

Además, ¿qué es el estado mutable e inmutable, de nuevo, generalmente en programación y también específicamente en POO?

    
pregunta Aviv Cohn 10.04.2014 - 19:20

4 respuestas

46

Tiene un 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í mismo no representa ningún estado: es solo un número bien definido y siempre lo será: el número natural 10. Como otro ejemplo, la cadena "HOLA" es una secuencia de cinco caracteres, y está completamente descrito por los caracteres que contiene y la secuencia en la que aparecen. En cinco millones de años a partir de ahora, la cadena "HELLO" seguirá siendo la cadena "HELLO": un valor puro.

Para tener un estado debe 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 puedes 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 carro tiene la propiedad de ser azul. Puedes describir este hecho asociando la pareja

("colour", "blue")

a mi coche. 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 en particular, sino también a un momento en particular. Entonces, puedes decir que hoy, mi coche tiene estado

("colour", "blue")

Mañana lo volveré a pintar 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: un automóvil puede ser creado y destruido, pero mantendrá su identidad durante toda su vida útil. No tiene sentido hablar sobre la identidad de algo que aún no existe / más.

Si los valores de las propiedades asociadas a una entidad determinada 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 de miembro de objeto), es decir, almacenar la instantánea actual de un estado. El estado mutable se implementa luego utilizando la asignación: cada operación de asignación reemplaza la instantánea anterior por una nueva. Esta solución normalmente utiliza 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 interesante charla sobre este enfoque de programación orientada a lugares ).

Una alternativa es ver los estados posteriores (historial) de una entidad como un flujo (posiblemente una secuencia infinita) de valores, ver, por ejemplo, Capítulo 3 de 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 cuando ya no son necesarias.

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 requiere copia.
  • El Enfoque 1 lleva implícitamente el nuevo estado a todas las partes de un programa que contiene una referencia a él, el Enfoque 2 necesitaría algún mecanismo para enviar una instantánea a sus observadores, por ejemplo. en la forma de un evento.
  • El Enfoque 2 puede ayudar a prevenir errores de estado incoherentes (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 las instantáneas producidas en diferentes puntos en el tiempo. >
  • El Enfoque 2 es más modular porque permite producir fácilmente vistas sobre el estado que son independientes del estado mismo, por ejemplo. usando funciones de orden superior como map y filter .
respondido por el Giorgio 10.04.2014 - 20:17
11

Estado es simplemente información sobre algo que se guarda en la memoria.

Como un ejercicio simple en la orientación a objetos, piense en una clase como un cortador de galletas y en las cookies como objetos. Puede crear una cookie (ejemplificar un objeto) utilizando el cortador de cookies (clase). Digamos que una de las propiedades de la cookie es su color (que se puede cambiar usando colorante para alimentos). El color de esa cookie es parte de su estado, al igual que las otras propiedades.

El estado mutable es el estado que se puede cambiar después de crear el objeto (cookie). El estado inmutable es el estado que no puede ser cambiado.

Los

objetos inmutables (para los cuales ninguno se puede cambiar) se vuelven importantes cuando se trata de concurrencia, la capacidad de más de un procesador en su computadora para operar en ese objeto al mismo tiempo. La inmutabilidad garantiza que puede confiar en que el estado sea estable y válido durante la vida útil del objeto.

En general, el estado de un objeto se mantiene en "variables privadas o miembro", y se accede a través de "propiedades" o métodos de obtención / establecimiento.

    
respondido por el Robert Harvey 10.04.2014 - 19:26
7

Creo que el término "estado" (a diferencia de un tipo concreto de estado como "variable miembro") es más útil cuando se compara una API con estado con una sin estado. Tratar de definir "estado" sin mencionar las API es un poco como tratar de definir "variable" o "función" sin mencionar los lenguajes de programación; la mayoría de las respuestas correctas solo tienen sentido para las personas que ya saben lo que significan las palabras.

Stateful vs Stateless

  • Una API con estado es una que "recuerda" a qué funciones has llamado Hasta ahora y con qué argumentos, así que la próxima vez que llame a una función va a utilizar esa información La parte de "recordar" a menudo se implementa con variables miembro, pero esa no es la única manera.
  • Una API sin estado es aquella en la que cada llamada de función depende únicamente de los argumentos que se le pasen, y nada más.

Por ejemplo, OpenGL es probablemente la API más estable que conozco. Si puedo simplificarlo demasiado por un momento, podríamos decir que se parece a esto:

glSetCurrentVertexBufferArray(vba1);
glSetCurrentVertexBufferObject(vbo1);
glSetCurrentVertexShader(vert1);
glSetCurrentFragmentShader(frag1);
// a dozen other things
glActuallyDrawStuffWithCurrentState(GL_TRIANGLES);

Casi todas las funciones solo se utilizan para pasar algo del estado que OpenGL necesita recordar, luego al final se llama a una función simple y anticlimáticamente para hacer todo el dibujo.

Una versión sin estado de OpenGL (simplificada) probablemente se parecería más a esto:

glActuallyDrawStuff(vba1, vbo1, vert1, frag1, /* a dozen other things */, GL_TRIANGLES);

A menudo escuchará a la gente decir que las API con menos estado son más fáciles de razonar. Si puede mantener el conteo de argumentos bajo control, generalmente estoy de acuerdo con eso.

Mutable vs Inmutable

Por lo que sé, esta distinción solo tiene sentido cuando puedes especificar un estado inicial . Por ejemplo, usando constructores de C ++:

// immutable state
ImmutableWindow windowA = new ImmutableWindow(600, 400);
windowA = new ImmutableWindow(800, 600); // to change the size, I need a whole new window

// mutable state
MutableWindow windowB = new MutableWindow(600, 400);
windowB.width = 800; // to change the size, I just alter the existing object
windowB.height = 600;

Sería difícil implementar una clase de ventana que no "recuerde" qué tamaño tiene, pero puede decidir si el usuario debería poder cambiar el tamaño de una ventana después de crearla.

P.S. En OOP, es cierto que "estado" generalmente significa "variables miembro", pero puede ser mucho más que eso. Por ejemplo, en C ++, un método puede tener una variable estática y las lambdas pueden convertirse en cierres al capturar variables. En ambos casos, esas variables persisten en múltiples llamadas a la función y, por lo tanto, probablemente califican como estado. Las variables locales en una función regular también pueden considerarse estado dependiendo de cómo se usan (las que tengo en main () a menudo cuentan).

    
respondido por el Ixrec 03.01.2015 - 18:22
2

En palabras sencillas

El diccionario declara:

  

a. Una condición o modo de ser, en relación con las circunstancias.

     
  1. estado: la forma en que algo es con respecto a sus atributos principales;
  2.   

El estado de algo es el conjunto de valores que tienen sus atributos en un momento dado.

En POO, el estado de un objeto es una instantánea de los valores de sus atributos en un momento dado.

Thing t = new Thing();
t.setColor("blue");
t.setPrice(100)
t.setSize("small");

El estado de la misma es que su color es azul, su precio es 100 y su tamaño es pequeño.

Si luego lo haces:

t.setColor("red");

Cambia uno de sus atributos, pero también cambia el estado en general porque el objeto ya no es el mismo que era.

Algunas veces las clases están diseñadas para que los valores de sus propiedades no puedan cambiarse después de crearlas. Todos los valores de sus propiedades se pasan al constructor o se leen de alguna fuente, como una base de datos o un archivo, pero no hay forma de cambiar esos valores después de ese momento, ya que no hay métodos "configuradores", ni ninguna otra forma de cambiando los valores dentro del objeto.

Thing t = new Thing("red",100,"small");
t.setColor("blue") -->> ERROR, the programmer didn't provide a setter or any other way to change the properties values after initialization.

Eso se llama un estado que no se puede cambiar de mutado. Todo lo que puedes hacer es destruir el objeto, crear uno nuevo y asignarlo a la misma referencia o variable.

Thing t = new Thing("red",100,"small");
t = new Thing("blue",100,"small");
// I had to create a new Thing with another color since this thing is inmutable.
    
respondido por el Tulains Córdova 12.02.2016 - 18:49

Lea otras preguntas en las etiquetas