Esta é uma pergunta para iniciantes, mas não consegui encontrar uma resposta suficiente à prova de novatos no Google.
O que as pessoas querem dizer quando dizem 'estado' - na programação em geral, e na programação OO especificamente?
Além disso, o que é estado mutável e imutável - novamente, geralmente na programação e também especificamente no OOP?
Respostas:
Você tem estado ao associar valores (números, seqüências de caracteres, estruturas de dados complexas) a uma identidade e um ponto no tempo.
Por exemplo, o número 10 por si só não representa nenhum estado: é apenas um número bem definido e sempre será ele mesmo: o número natural 10. Como outro exemplo, a cadeia "HELLO" é uma sequência de cinco caracteres e é completamente descrito pelos caracteres que contém e pela sequência em que aparecem. Daqui a cinco milhões de anos, a string "HELLO" ainda será a string "HELLO": um valor puro.
Para ter estado, você deve considerar um mundo em que esses valores puros estejam associados a algum tipo de entidade que possui uma identidade . Identidade é uma idéia primitiva: significa que você pode distinguir duas coisas, independentemente de outras propriedades que possam ter. Por exemplo, dois carros do mesmo modelo, mesma cor, ... são dois carros diferentes.
Dadas essas coisas com identidade, você pode anexar propriedades a elas, descritas por valores puros. Por exemplo, meu carro tem a propriedade de ser azul. Você pode descrever esse fato associando o par
para o meu carro. O par ("cor", "azul") é um valor puro que descreve o estado desse carro em particular.
O estado não está associado apenas a uma entidade específica, mas também a um momento específico. Então, você pode dizer que hoje, meu carro tem estado
Amanhã vou tê-lo repintado em preto e o novo estado será
Observe que o estado de uma entidade pode mudar, mas sua identidade não muda por definição. Bem, desde que a entidade exista, é claro: um carro pode ser criado e destruído, mas manterá sua identidade por toda a vida. Não faz sentido falar sobre a identidade de algo que ainda não existe.
Se os valores das propriedades anexadas a uma determinada entidade mudarem com o tempo, você diz que o estado dessa entidade é mutável . Caso contrário, você diz que o estado é imutável .
A implementação mais comum é armazenar o estado de uma entidade em algum tipo de variável (variáveis globais, variáveis de membros de objetos), ou seja, armazenar o instantâneo atual de um estado. O estado mutável é implementado usando a atribuição: cada operação de atribuição substitui o instantâneo anterior por um novo. Esta solução normalmente usa locais de memória para armazenar o instantâneo atual. Substituir um local de memória é uma operação destrutiva que substitui um instantâneo por um novo. ( Aqui você encontra uma conversa interessante sobre essa abordagem de programação orientada a locais .)
Uma alternativa é visualizar os estados subseqüentes (histórico) de uma entidade como um fluxo (possivelmente sequência infinita) de valores, consulte, por exemplo, o Capítulo 3 do SICP . Nesse caso, cada instantâneo é armazenado em um local de memória diferente e o programa pode examinar diferentes instantâneos ao mesmo tempo. As capturas instantâneas não utilizadas podem ser coletadas como lixo quando não são mais necessárias.
Vantagens / desvantagens das duas abordagens
map
efilter
.fonte
Estado é simplesmente informação sobre algo mantido na memória.
Como um simples exercício de orientação a objetos, pense em uma classe como um cortador de biscoitos e cookies como objetos. Você pode criar um cookie (instanciar um objeto) usando o cortador de cookies (classe). Digamos que uma das propriedades do cookie seja sua cor (que pode ser alterada usando corantes alimentares). A cor desse cookie faz parte de seu estado, assim como as outras propriedades.
Estado mutável é o estado que pode ser alterado depois que você cria o objeto (cookie). Estado imutável é um estado que não pode ser alterado.
Objetos imutáveis (para os quais nenhum estado pode ser alterado) tornam-se importantes quando você lida com simultaneidade, a capacidade de mais de um processador no seu computador operar nesse objeto ao mesmo tempo. A imutabilidade garante que você possa confiar no estado para ser estável e válido durante a vida útil do objeto.
Em geral, o estado de um objeto é mantido em "variáveis privadas ou membros" e acessado por meio de "propriedades" ou métodos getter / setter.
fonte
Eu acho que o termo "estado" (em oposição a um tipo concreto de estado, como "variável de membro") é mais útil quando se compara uma API com monitoração de estado com uma sem estado. Tentar definir "estado" sem mencionar APIs é como tentar definir "variável" ou "função" sem mencionar linguagens de programação; a maioria das respostas corretas só faz sentido para pessoas que já sabem o que as palavras significam.
Stateful vs Stateless
Por exemplo, o OpenGL é provavelmente a API mais estável que eu conheço. Se eu simplificamente simplificá-lo por um momento, podemos dizer que é algo como isto:
Quase todas as funções são usadas apenas para passar em algum estado em que o OpenGL precisa se lembrar; então, no final, você chama uma função anticlimacticamente simples para fazer todo o desenho.
Uma versão sem estado do OpenGL (simplificado) provavelmente se pareceria com isso:
Você sempre ouvirá as pessoas dizerem que as APIs com menos estado são mais fáceis de raciocinar. Se você pode manter a contagem de argumentos sob controle, eu geralmente concordo com isso.
Mutável vs Imutável
Até onde eu sei, essa distinção só é significativa quando você pode especificar um estado inicial . Por exemplo, usando construtores C ++:
Seria difícil implementar uma classe de janela que não "lembre" qual é o tamanho, mas você pode decidir se o usuário poderá alterar o tamanho de uma janela após criá-la.
PS No POO, é verdade que "estado" geralmente significa "variáveis-membro", mas pode ser muito mais do que isso. Por exemplo, em C ++, um método pode ter uma variável estática e lambdas podem se tornar encerramentos capturando variáveis. Nos dois casos, essas variáveis persistem em várias chamadas para a função e, portanto, provavelmente se qualificam como estado. Variáveis locais em uma função regular também podem ser consideradas estado, dependendo de como elas são usadas (as que eu tenho em main () costumam contar).
fonte
Em palavras leigas
O dicionário declara:
O estado de algo é o conjunto de valores que seus atributos têm em um determinado momento.
No POO, o estado de um objeto é um instantâneo dos valores de seus atributos em um dado momento.
O estado disso é sua cor sendo azul, seu preço sendo 100 e seu tamanho sendo pequeno.
Se você fizer mais tarde:
Você altera um de seus atributos, mas também o estado como um todo, pois o objeto não é mais o mesmo que era.
Às vezes, as classes são projetadas para que os valores de suas propriedades não possam ser alterados após a criação. Todos os valores de suas propriedades são passados para o construtor ou lidos de alguma fonte, como um banco de dados ou um arquivo, mas não há como alterar esses valores após esse momento, pois não existem métodos "setter" ou qualquer outra maneira de alterando os valores dentro do objeto.
Isso é chamado de estado que não pode ser alterado de mutado. Tudo o que você pode fazer é destruir o objeto, criar um novo e atribuí-lo à mesma referência ou variável.
fonte