O que é uma classe invariável?
Na programação e no design de computadores orientados a objetos, uma classe invariável é um conjunto de regras que podem ser usadas para definir se uma instância de objeto existe em um estado válido. De uma perspectiva de design, uma classe invariável é um conjunto de limites entre os quais os dados em um objeto devem cair para serem considerados em um estado funcional adequado. Uma classe invariável pode ser definida na documentação de design ou nos comentários do código fonte ou, em algumas linguagens de programação, pode ser implementada diretamente no código do computador acionável. Um programa que usa invariantes e asserções codificadas pode fazer com que o programa pare a execução ou gere vários erros quando as condições invariantes não forem atendidas. Diferentemente da verificação de erros padrão, os invariantes de classe geralmente são usados apenas com o objetivo de garantir que a implementação interna de uma classe esteja funcionando, e eles geralmente não são listados na documentação pública ou nas interfaces de programação.
De um nível muito básico, uma classe invariável é essencialmente uma coleção de asserções para uma classe. Uma asserção, novamente em termos simples, é uma declaração que verifica parte do estado da classe e deve ser avaliada como verdadeira para que a execução do programa continue. Um exemplo de asserção é uma instrução que garante que um número inteiro sempre esteja entre 1 e 10. Quando uma classe invariável é usada, as asserções são avaliadas para todas as partes relevantes dos dados mantidas pelo objeto, validando essencialmente que todos os dados no objeto estão dentro dos intervalos definidos.
Em muitos casos, o uso de uma classe invariável se assemelha bastante à verificação de erros padrão, na qual as variáveis são medidas para garantir que estejam dentro dos limites utilizáveis ou não sejam nulas. A diferença entre o uso de invariantes de classe e a verificação de erro padrão, no entanto, é que invariantes e asserções são predominantemente usados para capturar erros que não devem ocorrer, a menos que haja uma falha intrínseca no código. Outra diferença é que a verificação de erro padrão tende a envolver recuperação e alterações no fluxo de controle do programa, enquanto o resultado de uma falha invariável deve ser o encerramento do programa. A razão pela qual a maioria dos programas termina quando uma verificação invariável de classe falha é porque o objeto está em um estado comprometido e é incapaz, do ponto de vista de design, de cumprir suas pré-condições e pós-condições necessárias para cumprir seu contrato de design.
Uma das propriedades de uma classe invariante em linguagens de programação orientadas a objetos nas quais elas são definidas implicitamente é que a invariante é um mecanismo herdado por qualquer subclasse. Isso impede que uma subclasse substitua quaisquer verificações invariantes que são executadas na classe pai. Por fim, isso significa que uma subclasse é incapaz de quebrar o contrato de design estabelecido pela superclasse, o que pode causar resultados imprevisíveis ou erros de programa difíceis de encontrar.