El término " estado " puede usarse en varios sentidos, que pueden no ser susceptibles de una definición precisa. Por consiguiente, era importante que incluya una definición de su papel, para hacer evidente la forma en que estaba utilizando el término. A continuación, no ofrezco una definición única del estado de un objeto, sino que trato de esbozar varias formas de pensar sobre él, que pueden ser apropiadas en diferentes contextos.
Primero, sin embargo, debe pensar qué quiere decir con " objeto ": ¿está pensando en un objeto conceptual, es decir, en alguna entidad que está tratando de modelar, o en una instancia de una clase en un programa específico; quizás también desee pensar en el estado de una variable que podría referirse en diferentes momentos a diferentes objetos o en un sistema, tal vez como se accede a través de una determinada interfaz de usuario.
Parte de la dificultad para definir el estado de un objeto en OOP es que cuando modelamos entidades en un lenguaje particular, ese lenguaje a menudo no nos permite distinguir los atributos del objeto que son conceptualmente parte de la misma entidad de otros que no lo son. Por ejemplo, una lista vinculada de Car
consistirá en una cantidad de Link
objetos, que contienen punteros al siguiente (y tal vez anterior) Link
aunque conceptualmente la lista es un solo objeto; los enlaces también pueden estar incrustados enCar
-objeta o contiene punteros a ellos, pero en este caso los objetos vinculados están conceptualmente separados en lugar de ser parte de la lista; en una lista de cambios recientes, sin embargo, los cambios solo pueden estar presentes en la lista y considerarse como parte de ella. En estos diversos casos, debemos decidir si consideramos que el estado de un objeto incluye el de los objetos vinculados. Además, un Car
puede tener un enlace a un Registering_Authority
- probablemente no consideramos que cambie el estado del automóvil cuando su autoridad de registro cambia la URL de su sitio web. A menos que el lenguaje de implementación nos permita distinguir diferentes tipos de enlaces, no será posible hacer una definición general del estado de un objeto solo en términos del lenguaje.
El ' externa o' ' funcional ' estado se podría definir como 'la forma en que se comporta', ee.g. cómo reacciona a las invocaciones de métodos o a una interfaz de usuario. Para un objeto como una instancia de clase, esta definición depende del tipo al que se considera que pertenece el objeto: visto como a Circle
, el color de unColoured_Circle
no es visible, y por lo tanto irrelevante para su estado. Una dificultad con esto es que 'cómo reacciona' puede necesitar definirse en términos de valores devueltos, y estos 'valores' podrían ser los estados de otros objetos. Una forma de formalizar esto es decir que dos estados de un objeto son iguales si todas las posibles ejecuciones futuras de algún sistema en el que está incrustado dan como resultado la misma asignación de entradas a ese sistema a salidas de él. Puede requerirse que este sistema de cierre sea un sistema autónomo, capaz de ejecutarse independientemente de su entorno; Por otro lado, uno podría permitir que sea tan pequeño como el objeto en cuestión. En cualquier caso, un enfoque matemático es definir un estado como una clase de equivalencia de
El ' interna ' estado podría definirse como el estado de la representación. Un primer intento es aparentemente circular pero quizás útil: "El estado interno de un objeto es el estado de sus miembros". Aquí debemos tener cuidado de distinguir aspectos significativos de la representación de los insignificantes: en el nivel más bajo, la representación de un objeto puede incluir direcciones de otros objetos, pero es poco probable que sea útil considerar un cambio en dicha dirección como un cambio de estado Por otro lado, un cambio en el estado de una memoria caché para el resultado de una consulta, aunque no hace ninguna diferencia en el estado funcional (como se describió anteriormente), será importante al considerar las pruebas de rendimiento.