O termo ' estado ' pode ser usado em vários sentidos, que podem nem ser suscetíveis a uma definição precisa. Foi, portanto, importante que você inclua uma definição em seu jornal, para tornar claro como você estava usando o termo. A seguir, não ofereço uma definição única do estado de um objeto, mas tento esboçar várias maneiras de pensar sobre ele, que podem ser apropriadas em diferentes contextos.
Primeiro, no entanto, você precisa pensar no que você quer dizer com ' objeto ': você está pensando em um objeto conceitual, ou seja, em alguma entidade que está tentando modelar ou em uma instância de uma classe em um programa específico; talvez você também queira pensar no estado de uma variável que, em momentos diferentes, pode se referir a objetos diferentes ou a um sistema, talvez acessado por uma determinada interface do usuário.
Parte da dificuldade em definir o estado de um objeto no OOP é que, quando modelamos entidades em uma linguagem específica, essa linguagem geralmente não nos permite distinguir atributos de objetos que fazem parte da mesma entidade conceitualmente de outros que não são. Por exemplo, uma lista vinculada de Car
consistirá em vários Link
objetos, que contêm ponteiros para o próximo (e talvez anterior), Link
embora conceitualmente a lista seja um único objeto; os links também podem ser incorporadosCar
-objetos ou contêm ponteiros para eles, mas, neste caso, os objetos vinculados são conceitualmente separados, e não parte da lista; em uma lista de alterações recentes, em qualquer lugar, as alterações podem estar presentes apenas na lista e consideradas como parte dela. Nesses vários casos, devemos decidir se consideramos o estado de um objeto para incluir o estado dos objetos vinculados. Além disso, um Car
pode ter um link para um Registering_Authority
- provavelmente não consideramos o estado do carro alterado quando sua autoridade de registro altera o URL do site. A menos que a linguagem de implementação nos permita distinguir diferentes tipos de link, não será possível fazer uma definição geral do estado de um objeto apenas em termos da linguagem.
O ' externo ou' ' funcional ' estado poderia ser definido como 'como ele se comporta', ee.g. como ele reage a invocações de métodos ou a uma interface do usuário. Para um objeto como instância de classe, essa definição depende do tipo ao qual o objeto é visto como pertencente: visto como a Circle
, a cor de umColoured_Circle
não é visível e, portanto, irrelevante para o seu estado. Uma dificuldade disso é que 'como ele reage' pode precisar ser definido em termos de valores retornados, e esses 'valores' podem ser os estados de outros objetos. Uma maneira de formalizar isso é dizer que dois estados de um objeto são os mesmos, se todas as execuções futuras possíveis de algum sistema no qual ele está incorporado resultam no mesmo mapeamento de entradas para esse sistema e saídas a partir dele. Pode ser necessário que esse sistema anexo seja um sistema autônomo, capaz de executar independentemente de seu ambiente; por outro lado, pode-se permitir que seja tão pequeno quanto o objeto em questão. Em qualquer caso, uma abordagem matemática é então definir um estado como uma classe de equivalência de
O estado ' interno ' pode ser definido como o estado da representação. Uma primeira tentativa é aparentemente circular, mas talvez útil: 'O estado interno de um objeto é o estado de seus membros'. Aqui, precisamos ter o cuidado de distinguir aspectos significativos da representação de aspectos insignificantes: no nível mais baixo, a representação de um objeto pode muito bem incluir endereços de outros objetos, mas é improvável que seja útil considerar uma alteração nesse endereço. como uma mudança de estado. Por outro lado, uma alteração no estado de um cache para o resultado de uma consulta, embora não faça diferença para o estado funcional (conforme descrito acima), será importante ao considerar os testes de desempenho.